socket()系统调用,带有三个参数:
    1、参数domain指明通信域,如PF_UNIX(unix域),PF_INET(IPv4),
      PF_INET6(IPv6)等
    2、type指明通信类型,最常用的如SOCK_STREAM(面向连接可靠方式,
      比如TCP)、SOCK_DGRAM(非面向连接的非可靠方式,比如UDP)等。
    3、参数protocol指定需要使用的协议。虽然可以对同一个协议
      家族(protocol family)(或者说通信域(domain))指定不同的协议
      参数,但是通常只有一个。对于TCP参数可指定为IPPROTO_TCP,对于
      UDP可以用IPPROTO_UDP。你不必显式制定这个参数,使用0则根据前
      两个参数使用默认的协议。
 
sa:SOCKADDR_IN;
sa.sin_family:=PF_INET;
  sa.sin_port:=htons(lisport);
  sa.sin_addr.S_addr:=INADDR_ANY;//---------dcc-----htonl(INADDR_ANY);  //INADDR_ANY,表示本地计算机的默认IP地址
  salen:=sizeof(sa);
  //******************************************************************************
    { sin_family指代协议族,在socket编程中只能是AF_INET ,PF_INET
      sin_port存储端口号(使用网络字节顺序)
      sin_addr存储IP地址,使用in_addr这个数据结构
      s_addr按照网络字节顺序存储IP地址
      sin_zero是为了让sockaddr与sockaddr_in两个数据结构保持大小相同而保留的空字节。
    }
int bind ( SOCKET s , const struct sockaddr FAR *addr , int namelen );
    [参数]
    s - 指向用Socket函数生成的Socket Descrīptor
    addr - 指向Socket地址的指针
    namelen - 该地址的长度.
    [返回值]
    当函数成功调用时返回0
    调用失败时返回 SOCKET_ERROR
if bind(lissocket,sa,sizeof(sa))=SOCKET_ERROR then
begin
    closesocket(lissocket);
    DebugMessage('无法打开端口:'+inttostr(lisport));
    exit;
end;
listen(lissocket,200);
    //**********************************************
     {socket 套接字,网络编程必用的
      listen ()监听从服务器传来的接收数据
      listen ()创建一个套接口并监听申请的连接.}
    //*******************************************
accept()
 acceptsocket:=accept(lissocket,@sa,@salen); //AcceptSocket 是一个阻塞方法,它返回可用来发送和接收数据的 Socket。
    DebugMessage('连接成功!');
    if acceptsocket=INVALID_SOCKET then
    begin
      DebugMessage('接受Socket失败!');
      continue;
    end;
//**************&&&&&&&&&&&&&&&&&&%%%%%%%%%%%%%%%%%%%%%%%%  源码
unit Listenthread;
interface
uses
  Classes,messages,windows,winsock,stdctrls,Sysutils;
type
  //线程的声明
  TListenThread = class(TThread)
  private
    { Private declarations }
    lissocket:Tsocket;
    lisport:integer;
    str:string;
    procedure AddMes;
    procedure DebugMessage(mes:string);
  protected
    procedure Execute; override;  //线程执行过程
   
  public
    constructor CreateIt(port:integer); //创建线程端口
    destructor  destroy;override;  //结束线程
  end;
implementation
uses main,UnitSocketRead,DataUnit ;
//监听线程的构造方法
constructor TlistenThread.CreateIt(port:integer); //创建端口
begin
  inherited create(true);
  lisport:=port;
  FreeOnTerminate:=true;
  resume; //******唤醒线程  重(新)开(始),再继续;恢复;收回;【微软】继续执行 挂起的线程重新执行。
end;
destructor TlistenThread.destroy;
begin
  if lissocket<>INVALID_SOCKET then
  begin
    //shutdown(lissocket,SD_BOTH);//中断连接,其实连接还存在。
    closesocket(lissocket);   //*********CloseSocket() 是用来关闭一个 Socket 的!
    DebugMessage('Close Socket');
  end;
  inherited destroy;
end;
procedure TlistenThread.Execute;
var   acceptsocket:Tsocket;
      sa:SOCKADDR_IN;
      salen:integer;
      tempthreadread:ThreadSocketRead;
begin
  { Place thread code here }
  Lissocket:=socket(PF_INET, SOCK_STREAM, IPPROTO_IP);
  //***********************************************************************************
  {socket()系统调用,带有三个参数:
    1、参数domain指明通信域,如PF_UNIX(unix域),PF_INET(IPv4),
      PF_INET6(IPv6)等
    2、type指明通信类型,最常用的如SOCK_STREAM(面向连接可靠方式,
      比如TCP)、SOCK_DGRAM(非面向连接的非可靠方式,比如UDP)等。
    3、参数protocol指定需要使用的协议。虽然可以对同一个协议
      家族(protocol family)(或者说通信域(domain))指定不同的协议
      参数,但是通常只有一个。对于TCP参数可指定为IPPROTO_TCP,对于
      UDP可以用IPPROTO_UDP。你不必显式制定这个参数,使用0则根据前
      两个参数使用默认的协议。}
  //******************************************************************************
  if lissocket=INVALID_SOCKET then
  begin
    DebugMessage('Create Socket Error');
    exit;
  end;
  DebugMessage('Create Socket!');  //调用本单元的 DebugMessage方法   显示成功创建套接字
  sa.sin_family:=PF_INET;
  sa.sin_port:=htons(lisport);
  sa.sin_addr.S_addr:=INADDR_ANY;//---------dcc-----htonl(INADDR_ANY);  //INADDR_ANY,表示本地计算机的默认IP地址
  salen:=sizeof(sa);
  //******************************************************************************
    { sin_family指代协议族,在socket编程中只能是AF_INET ,PF_INET
      sin_port存储端口号(使用网络字节顺序)
      sin_addr存储IP地址,使用in_addr这个数据结构
      s_addr按照网络字节顺序存储IP地址
      sin_zero是为了让sockaddr与sockaddr_in两个数据结构保持大小相同而保留的空字节。
    }
   { int bind ( SOCKET s , const struct sockaddr FAR *addr , int namelen );
    [参数]
    s - 指向用Socket函数生成的Socket Descrīptor
    addr - 指向Socket地址的指针
    namelen - 该地址的长度.
    [返回值]
    当函数成功调用时返回0
    调用失败时返回 SOCKET_ERROR
      }
  //***********************************************************************************
  if bind(lissocket,sa,sizeof(sa))=SOCKET_ERROR then
  begin
    closesocket(lissocket);
    DebugMessage('无法打开端口:'+inttostr(lisport));
    exit;
  end;
  DebugMessage('listen on port:'+inttostr(lisport)); //调用本单元的 DebugMessage方法    显示连接的端口号
  listen(lissocket,200);
    //**********************************************
     {socket 套接字,网络编程必用的
      listen ()监听从服务器传来的接收数据
      listen ()创建一个套接口并监听申请的连接.}
    //*******************************************
  while not terminated do
  begin
    acceptsocket:=accept(lissocket,@sa,@salen); //AcceptSocket 是一个阻塞方法,它返回可用来发送和接收数据的 Socket。
    DebugMessage('连接成功!');
    if acceptsocket=INVALID_SOCKET then
    begin
      DebugMessage('接受Socket失败!');
      continue;
    end;
    //调用 UnitSocketRead 方法块中的 ThreadSocketRead.CreateIt 方法 并且同时调用datamoudle的数据库连接控件的连接语句。
    tempthreadread:=ThreadSocketRead.CreateIt(acceptsocket,Datamodule1.ADOConnection1.ConnectionString);
    if tempthreadread<>nil then
    begin
      str:='New thread:'+IntToStr(tempthreadread.threadid);
      synchronize(AddMes);                    //synchronize 时间同步   调用方法本模块的 AddMes方法
    end
    else
    begin
      closesocket(acceptsocket);
      DebugMessage('创建执行线程失败!');   //调用本单元的 DebugMessage方法
    end;
  end;
  closesocket(lissocket);  //一个关闭套接口的方法
end;
procedure TlistenThread.AddMes;  //显示当前的时间 和 要显示的信息
begin
  if  not terminated then    //terminated  终结
     FormMain.Memo.Lines.Add(FormatDatetime('hh:mm:ss',Now)+'-*-'+Str);
end;
procedure TListenThread.DebugMessage(mes:string);  //获得要显示的信息 并将信息作为参数传递给AddMes方法
begin
   if  gdebug then
   begin
     Str:=mes;
     synchronize(AddMes);  //synchronize 时间同步   调用方法本模块的 AddMes方法
   end;
end;
end.
 
 
 
 
 
 
 
 
 
 
 
 


//

Delphi socket() 函数的应用的更多相关文章

  1. 使用socket()函数创建套接字

    在Linux中,一切都是文件,除了文本文件.源文件.二进制文件等,一个硬件设备也可以被映射为一个虚拟的文件,称为设备文件.例如,stdin 称为标准输入文件,它对应的硬件设备一般是键盘,stdout ...

  2. PHP Socket实现websocket(二)Socket函数

    PHP socket函数是调用系统的的Socket函数,可以参考C语言的socket函数. Socket函数:http://php.net/manual/en/book.sockets.php 服务器 ...

  3. delphi公共函数 UMyPubFuncFroc--版权所有 (C) 2008 勇者工作室

    {*******************************************************} { } { Delphi公用函数单元 } { } { 版权所有 (C) 2008 勇 ...

  4. Windows套接字Socket函数

    1.使用套接字函数之前,先要加载套接字函数库: #include "Winsock2.h" #pragma comment(lib,"Ws2_32.lib") ...

  5. (转载)delphi 常用函数(数学)

    delphi 常用函数(数学) Delphi中怎么将实数取整? floor 和 ceil 是 math unit 里的函数,使用前要先 Uses Math.trunc 和 round 是 system ...

  6. socket函数

    为了执行网络IO,一个进程必须做的第一件事就是调用socket函数,指定期望的通信协议类型 int socket(int family,int type,int protocol); 其中,famil ...

  7. Delphi回调函数及其使用

    Delphi回调函数及其使用 1 回调函数的概述 回调函数是这样一种机制:调用者在初始化一个对象(这里的对象是泛指,包括OOP中的对象.全局函数等)时,将一些参数传递给对象,同时将一个调用者可以访问的 ...

  8. Delphi过程函数传递参数的八种方式

    今天一同事问我为什么有些过程函数里面有Var而有些没有,不解,遂到网上百度,得解.快哉,快哉. 在Delphi过程.函数中传递参数几个修饰符为Const.Var.Out.另一种不加修饰符的为默认按值传 ...

  9. delphi字符串函数大全

    转帖:delphi字符串函数大全 2009-11-17 16:43:55 分类: delphi字符串函数大全 ━━━━━━━━━━━━━━━━━━━━━首部 function StringToGUID ...

随机推荐

  1. 从source folder 下将其所有子文件夹的*.* 文件拷贝到 target folder (不拷贝文件夹名仅拷贝文件)

    因本人较懒,一直认为电脑能做的就让电脑来做,所以写下这个批处理的小脚本方便工作. 场景:碰到要拷贝一个文件夹(source folder)下的多个子文件夹(sub-folder)的文件到指定文件夹下( ...

  2. 如何使用event 10049分析定位library cache lock and library cache pin

    Oracle Library Cache 的 lock 与 pin 说明 一. 相关的基本概念 之前整理了一篇blog,讲了Library Cache 的机制,参考: Oracle Library c ...

  3. 2.Oracle11g体系结构

    2.1逻辑存储结构 2.1.1数据块(Data Blocks) 数据块是Oracle逻辑结构中最小的逻辑单位,也是执行数据库输入输出最小的存储单位.通常Oracle数据库是操作系统块的整数倍,如果操作 ...

  4. 小白偶遇Sublime Text 3

    sublime text3号称神一样的编辑器,主要归功于它丰富的插件所带来的可扩展性.以前曾经抱着玩一玩的心态下载了sublime ,没有插件的sublime 很快被我扔到一边.在用过很多的编辑器后, ...

  5. C++关于编译器合成的默认构造函数

    有两个常见的误解: 1.任何类如果没有定义默认构造函数,就会被合成出一个来. 2.编译器合成的默认构造函数会显式地设定类内每一个数据成员的默认值. 对于第一个误解,并不是任何类在没有显式定义默认构造函 ...

  6. 开源字体包缩减font-spider

    最近公司产品用微软雅黑,被告~  领导要求产品后台系统必须更换字体,美工给了个宋体,个人觉得太丑,就网上搜了些处理方法使用 CSS属性 @font-face 自定义字体, 最后决定用 思源黑体 (思源 ...

  7. C++判断Office版本——转载

    自:http://blog.csdn.net/lpc_china/article/details/18359145 主要原理:查询windows注册表microsoft office软件项的值来判断版 ...

  8. mysql 刘道成视频教程1、2课----------大致结构

    第1课 第2课 一.整体结构 1.mysql -h localhost -u root -p *** 如果-h不写,则默认连接localhost. 2.连接服务器成功,-------> 显示数据 ...

  9. Windows Phone 之播放视频

    在Windows Phone 7中播放视频有两种方式, (1)使用MediaElement 控件来播放:用MediaElement 控件来播放视频比较灵活,你需要自己去实现播放暂停进度条等等的功能,播 ...

  10. 【原创】Android 对话框的使用

    对话框即Dialog .google的官方解释:A dialog is usually a small window that appears in front of the current Acti ...