欢迎来到天天文库
浏览记录
ID:14200785
大小:57.00 KB
页数:5页
时间:2018-07-26
《初始化一个socket》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、1初始化一个socket2建立一个socket列表用于管理socket3将初步连接的socket放入列表中4用select判断列表中未处理的socketWinAPI版本1.USHORTnPort=4567;//此服务器监听的端口号//创建监听套节字SOCKETsListen=::socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);sockaddr_insin;sin.sin_family=AF_INET;sin.sin_port=htons(nPort);sin.sin_ad
2、dr.S_un.S_addr=INADDR_ANY;//绑定套节字到本地机器if(::bind(sListen,(sockaddr*)&sin,sizeof(sin))==SOCKET_ERROR){printf("Failedbind()");return-1;}//进入监听模式::listen(sListen,5);2.//select模型处理过程//1)初始化一个套节字集合fdSocket,添加监听套节字句柄到这个集合fd_setfdSocket;//所有可用套节字集合FD_ZERO(&fdS
3、ocket);FD_SET(sListen,&fdSocket);3.while(TRUE){//2)将fdSocket集合的一个拷贝fdRead传递给select函数,//当有事件发生时,select函数移除fdRead集合中没有未决I/O操作的套节字句柄,然后返回。fd_setfdRead=fdSocket;intnRet=::select(0,&fdRead,NULL,NULL,NULL);if(nRet>0){//3)通过将原来fdSocket集合与select处理过的fdRead集合比较,//
4、确定都有哪些套节字有未决I/O,并进一步处理这些I/O。for(inti=0;i<(int)fdSocket.fd_count;i++){if(FD_ISSET(fdSocket.fd_array[i],&fdRead)){if(fdSocket.fd_array[i]==sListen)//(1)监听套节字接收到新连接{if(fdSocket.fd_count5、sNew=::accept(sListen,(SOCKADDR*)&addrRemote,&nAddrLen);FD_SET(sNew,&fdSocket);printf("接收到连接(%s)",::inet_ntoa(addrRemote.sin_addr));}else{printf("Toomuchconnections!");continue;}}else{charszText[256];intnRecv=::recv(fdSocket.fd_array[i],szText,strlen6、(szText),0);if(nRecv>0)//(2)可读{szText[nRecv]=' ';printf("接收到数据:%s",szText);}else//(3)连接关闭、重启或者中断{::closesocket(fdSocket.fd_array[i]);printf("关闭");FD_CLR(fdSocket.fd_array[i],&fdSocket);}}}}}else{printf("Failedselect()");break;}}二.自己写了一个c#版本的socket7、的select方法使用classThreadtcpserver{privateSocketserver;publicThreadtcpserver(){IPAddresslocal=IPAddress.Parse("127.0.0.1");IPEndPointiep=newIPEndPoint(local,4567);server=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);//将套接字与本地终结点绑定8、server.Bind(iep);//在本地13000端口号上进行监听server.Listen(20);Console.WriteLine("等待客户机进行连接......");ListsocketList=newList();socketList.Add(server);while(true){Listtemp=socketList.ToList();Socket.Select(temp,
5、sNew=::accept(sListen,(SOCKADDR*)&addrRemote,&nAddrLen);FD_SET(sNew,&fdSocket);printf("接收到连接(%s)",::inet_ntoa(addrRemote.sin_addr));}else{printf("Toomuchconnections!");continue;}}else{charszText[256];intnRecv=::recv(fdSocket.fd_array[i],szText,strlen
6、(szText),0);if(nRecv>0)//(2)可读{szText[nRecv]=' ';printf("接收到数据:%s",szText);}else//(3)连接关闭、重启或者中断{::closesocket(fdSocket.fd_array[i]);printf("关闭");FD_CLR(fdSocket.fd_array[i],&fdSocket);}}}}}else{printf("Failedselect()");break;}}二.自己写了一个c#版本的socket
7、的select方法使用classThreadtcpserver{privateSocketserver;publicThreadtcpserver(){IPAddresslocal=IPAddress.Parse("127.0.0.1");IPEndPointiep=newIPEndPoint(local,4567);server=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);//将套接字与本地终结点绑定
8、server.Bind(iep);//在本地13000端口号上进行监听server.Listen(20);Console.WriteLine("等待客户机进行连接......");ListsocketList=newList();socketList.Add(server);while(true){Listtemp=socketList.ToList();Socket.Select(temp,
此文档下载收益归作者所有