学习笔记:delphi实现网络通信之select模型

说明:所有的winsock的定义用的是jwawinsock2。(整个包的下载:http://blog.delphi-jedi.net/home/)

主要函数:select

目的:允许那些想要避免在套接字调用上阻塞的应用程序有能力管理多个套接字。

函数定义:select(nfds:integer;readfds:Pfd_set;writefds:Pfd_set;exceptfds:Pfd_set;timeout:Ptimeval)

套接集合:FD_SET结构

PFD_SET=^Fd_set

Fd_set=record

    fd_count:integer;

   fd_array:array[0..FD_SETSIZE-1] of Tsocket;

end;{FD_SETSIZE系统默认为64.也就是系统默认管理64个套接字。实际可以定义到1000。}

关于FD_SET集合操作函数。

FD_ZERO(SET:PFD_SET)  初始化set为空集合。集合在使用前应该总是清空。

FD_CLR(s:TSOCKET;set:PFD_SET) 从set移除套接字。

FD_ISSETs(S:TSOCKET;SET:PFD_SET) 检查s是不是set的成员,如果是返回TRUE。

FD_SET(S:TSOCKET;set:PFD_SET)添加套接字到集合。

delphi代码:

program Proserver;
//控制台程序。
{$APPTYPE CONSOLE}

uses
  JwaWinsock2,Windows,SysUtils;

var
  nPort:UINT;
  sListen,sNew:TSocket;
  socket_in,addrRemote:sockaddr_in;
  fdSocket,fdRead:fd_set;
  i,nAddrLen:integer;
  szText:array[0..255] of AnsiChar;
procedure initsock;
     var
       v_wsadata:WSAData;
       sockversion:Cardinal;
      begin
         sockversion:=MAKEWORD(2,2);
         try
          if  WSAStartup(sockversion,v_wsadata)<>0 then
            Exit;

         except
           Exit;
         end;
      end;
procedure cleansock;
      begin
        WSACleanup();
      end;
begin
   initsock;
   nport:=4567;
   sListen:=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
   socket_in.sin_family:=AF_INET;
   socket_in.sin_port:=htons(nPort);
   socket_in.sin_addr.S_addr:=INADDR_ANY;

   //进行SOCKET绑定到本地机器
   if bind(sListen,psockaddr(@socket_in),SizeOf(socket_in))=socket_error then
     begin
       writeln('Failed bind()');
       Exit;
     end
   else
     begin
       Writeln('SOCKET绑定成功。');
     end;

   //进入监听模式
   Writeln('程序进入监听状态......');
   listen(sListen,5);

   //select模型处理过程
   //1、初始化一个套接字集合fdsocket,添加监听套接字句柄到这个集合。
   FD_ZERO(fdSocket);
   _FD_SET(sListen,fdSocket);

   //进行等待状态中。。。。。。
   Writeln('进入无限循环状态。。。。。');
   while True do
   begin
     // 2、将FDSOCKET集合的一个拷贝FDREAD传递给SELECT函数。
     fdRead:=fdSocket;
     if select(0,@fdread,nil,nil,nil)>0 then
       begin
         for i:=0 to fdSocket.fd_count-1 do
          begin
            if FD_ISSET(fdSocket.fd_array[i],fdRead) then
             begin
               if fdSocket.fd_array[i]=sListen then
                 begin
                   if fdSocket.fd_count<FD_SETSIZE then
                     begin
                       nAddrLen:=SizeOf(addrRemote);
                       sNew:=accept(sListen,psockaddr(@addrRemote),@nAddrlen);
                       _FD_SET(sNew,fdSocket);
                       Writeln('接收到连接:'+strpas(inet_ntoa(addrRemote.sin_addr)));
                     end
                   else
                     begin
                      Writeln('连接太多,超出系统要求。');
                      Continue;
                     end;
                 end
               else
                 begin
                   if recv(fdSocket.fd_array[i],szText,SizeOf(szText),0)>0 then
                     begin
                       Writeln('接收的数据是:'+strpas(sztext));
                     end
                   else
                     begin
                       closesocket(fdSocket.fd_array[i]);
                       FD_CLR(fdSocket.fd_array[i],fdSocket);
                       Writeln('当前连接已判断。');
                     end;
                 end;
             end;
          end;
       end
     else
      begin
        Writeln('Failed select().');
        Break;
      end;
   end;
  cleansock;
end.

转载于:https://www.cnblogs.com/wangorg/archive/2011/04/28/2031812.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本例子就是Delphi中如何利用Socket编写通信程序。 计算机网络是由一系列网络通信协议组成的,其中的核心协议是传输层的TCP/IP和UDP协议。TCP是面向连接的,通信双方保持一条通路,好比目前的电话线,使用telnet登陆BBS,用的就是TCP协议;UDP是无连接的,通信双方都不保持对方的状态,浏览器访问Internet时使用的HTTP协议就是基于UDP协议的。TCP和UDP协议都非常复杂,尤其是TCP协议,为了保证网络传输的正确性和有效性,必须进行一系列复杂的纠错和排序等处理。   Socket是建立在传输层协议(主要是TCP和UDP)上的一种套接字规范,最初是由美国加州Berkley大学提出,它定义两台计算机间进行通信的规范(也是一种编程规范),如果说两台计算机是利用一个“通道“进行通信,那么这个“通道“的两端就是两个套接字。套接字屏蔽了底层通信软件和具体操作系统的差异,使得任何两台安装了TCP协议软件和实现了套接字规范的计算机之间的通信成为可能。   微软的Windows Socket规范(简称winsock)对Berkley的套接字规范进行了扩展,利用标准的Socket的方法,可以同任何平台上的Socket进行通信;利用其扩展,可以更有效地实现在Windows平台上计算机间的通信。在Delphi中,其底层的Socket也应该是Windows的SocketSocket减轻了编写计算机间通信软件的难度,但总的说来还是相当复杂的(这一点在后面具体会讲到);Inprise在Delphi中对Windows Socket进行了有效的封装,使得用户可以很方便地编写网络通信程序。 本例子就是Delphi中如何利用Socket编写通信程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值