windows socket编程:select 用法 例子
来源:互联网 发布:中国动员能力知乎 编辑:程序博客网 时间:2024/05/21 22:47
http://blog.csdn.net/zjsiva/article/details/5895087
服务器端:
#include <stdio.h> #include <string.h> #include <WINSOCK2.H> #pragma comment(lib,"ws2_32.lib") #define INT_SERVER_PORT 5000 #define STR_SERVER_IP "127.0.0.1" #define INT_DATABUFFER_SIZE 100 void main(void) { WORD dwVersion = MAKEWORD(2,2); WSAData wsaData; WSAStartup(WINSOCK_VERSION,&wsaData); SOCKET sockServer = socket(AF_INET,SOCK_STREAM,0); if (INVALID_SOCKET == sockServer) { printf("Failed to create socket!\n"); WSACleanup(); return; } sockaddr_in addrServer; memset(&addrServer,0,sizeof(sockaddr_in)); addrServer.sin_family = AF_INET; addrServer.sin_port = htons(INT_SERVER_PORT); addrServer.sin_addr.S_un.S_addr = htonl(INADDR_ANY); //addrServer.sin_addr.s_addr = htonl(INADDR_ANY); int iResult; bool bReuseAddr=true; iResult=setsockopt(sockServer,SOL_SOCKET,SO_REUSEADDR,(char *)&bReuseAddr,sizeof(bReuseAddr)); if(SOCKET_ERROR == iResult) { printf("Failed to set resueaddr socket!\n"); WSACleanup(); return; } /* unsigned long cmd = 1; iResult= ioctlsocket(sockServer,FIONBIO,&cmd); */ iResult = bind(sockServer,(sockaddr *)&addrServer,sizeof(addrServer)); if (SOCKET_ERROR == iResult) { printf("Failed to bind address!\n"); WSACleanup(); return; } if (0 != listen(sockServer,5)) { printf("Failed to listen client!\n"); WSACleanup(); return; } UINT i = 0; SOCKET sockAccept; sockaddr_in addrAccept; int iAcceptLen = sizeof(addrAccept); char szDataBuff[INT_DATABUFFER_SIZE]; int iRecvSize; sockaddr_in addrTemp; int iTempLen; fd_set fd; FD_ZERO(&fd); FD_SET(sockServer,&fd); /* timeval tm; tm.tv_sec = 0; tm.tv_usec = 1000; */ printf("Start server...\n"); while(1) { fd_set fdOld = fd; iResult = select(0,&fdOld,NULL,NULL,/*&tm*/NULL); if (0 <= iResult) { for(i = 0;i < fd.fd_count; i++) { if (FD_ISSET(fd.fd_array[i],&fdOld)) { //如果socket是服务器,则接收连接 if (fd.fd_array[i] == sockServer) { memset(&addrAccept,0,sizeof(addrTemp)); sockAccept = accept(sockServer,(sockaddr *)&addrAccept,&iAcceptLen); if (INVALID_SOCKET != sockAccept) { FD_SET(sockAccept,&fd); //FD_SET(sockAccept,&fdOld); printf("%s:%d has connected server!\n",inet_ntoa(addrAccept.sin_addr), ntohs(addrAccept.sin_port)); } } else //非服务器,接收数据(因为fd是读数据集) { memset(szDataBuff,0,INT_DATABUFFER_SIZE); iRecvSize = recv(fd.fd_array[i],szDataBuff,INT_DATABUFFER_SIZE,0); memset(&addrTemp,0,sizeof(addrTemp)); iTempLen = sizeof(addrTemp); getpeername(fd.fd_array[i],(sockaddr *)&addrTemp,&iTempLen); if (SOCKET_ERROR == iRecvSize) { closesocket(fd.fd_array[i]); FD_CLR(fd.fd_array[i],&fd); i--; printf("Failed to recv data ,%s:%d errorcode:%d.\n", inet_ntoa(addrTemp.sin_addr),ntohs(addrTemp.sin_port),WSAGetLastError()); continue; } if (0 == iRecvSize) { //客户socket关闭 printf("%s:%d has closed!\n",inet_ntoa(addrTemp.sin_addr), ntohs(addrTemp.sin_port)); closesocket(fd.fd_array[i]); FD_CLR(fd.fd_array[i],&fd); i--; } if (0 < iRecvSize) { //打印接收的数据 printf("recv %s:%d data:%s\n",inet_ntoa(addrTemp.sin_addr), ntohs(addrTemp.sin_port),szDataBuff); } } } } } else if (SOCKET_ERROR == iResult) { //WSACleanup(); // printf("Faild to select sockt in server!\n"); Sleep(100); } } WSACleanup(); }
客户端可以直接用nc,即netcat
- windows socket编程:select 用法 例子
- windows socket编程:select 用法 例子
- socket编程:select 用法 例子
- Windows Socket API编程例子
- linux异步socket编程之select()用法
- Socket编程中select函数用法详解
- Windows Socket编程的select模型
- WINDOWS SOCKET编程SELECT模型使用
- windows Socket编程之select网络模型
- linux select socket 例子
- socket select等例子
- socket select 例子
- 网络编程:linux socket的select函数例子
- linux socket编程之多路复用select的例子
- Windows Socket 编程, WIN32_LEAN_AND_MEAN 的用法
- linux非阻塞式socket编程之select()用法
- Socket编程中select函数的用法详解
- linux非阻塞式socket编程之select()用法
- android中的对话框之四:各种系统对话框的使用实例
- 我的PGA我作主----搞清楚什么是真正的PGA
- 透过表象看本质!?之二——除了最小p乘,还有PCA
- 你不可以不知道的findViewById
- Spring简介和好处
- windows socket编程:select 用法 例子
- 透过表象看本质!?之二数据拟合
- 开源中国社区网址
- 透过表象看本质!?
- 五子棋AI设计
- 《火球——UML大战需求分析》(第1章 大话UML)——1.2 结构型的UML(Structure Diagram)
- 监听连接时间过长如何解决
- opencv2.4.3中surf代码分析----(-)特征点提取
- GBA的8-Bit/32-Bit Normal通信模式