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. (转)C# NameValueCollection集合

    1.NameValueCollection类集合是基于 NameObjectCollectionBase 类. 但与 NameObjectCollectionBase 不同,该类在一个键下存储多个字符 ...

  2. IIS7报错:如果要使用托管的处理程序,请安装 ASP.NET

    转载至码农SeraphWU IIS7报错:如果要使用托管的处理程序,请安装 ASP.NET 进入CMD 输入如下命令即可 "%WINDIR%\Microsoft.NET\Framework\ ...

  3. .NET3.5中的高性能 Socket API

    转载:http://www.cnblogs.com/TianFang/archive/2007/11/09/954730.html 在 .NET Framework 2.0 版本中,System.Ne ...

  4. Java--获取request中所有参数的方法

    我们通常用到request获取某个参数的方法: String value=request.getparameter("key"); 如果想要获取request中所有的参数呢? re ...

  5. C语言之分配

    #include "stdio.h" void main() { ] = {,,}; *sizeof(int));//malloc calloc relloc arr2[] = ; ...

  6. Analyze 静态分析工具中显示 大量的CF类型指针 内存leak 问题, Core Foundation 类型指针内存泄漏

    Analyze 静态分析工具中显示 大量的CF类型指针 内存leak 问题   今天使用Analyze 看了下项目,   解决办法,项目中使用了ARC,OC的指针类型我们完全不考虑release的问题 ...

  7. Repeater 动态增加删除一行

    文章参考:文章参考http://www.cnblogs.com/dataadapter/archive/2012/06/25/2562885.html 效果: 前台代码: <%@ Page La ...

  8. 百练_2409 Let it Bead(Polya定理)

    描述 "Let it Bead" company is located upstairs at 700 Cannery Row in Monterey, CA. As you ca ...

  9. memcached 入门

    memcached 是什么? Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载. memcached 能够做些什么? 适用于大型网站,处理千万及的数据,而且 ...

  10. ubuntu 选择最快得源

    root权限.新版的Ubuntu(12.04)已经不再自带类似apt-spy之类的选择最快的源的命令行工具,默认的源经常那个龟速啊……手动测试哪个源在当前网络环境下会比较快还是比较累的,这里整理一个脚 ...