各位老师们好,接受不到数据
- C/C++ code
//////////////////////////////////////////////////////// select.cpp文件#include <stdio.h>#include <winsock2.h>#pragma comment(lib, "WS2_32") // 链接到WS2_32.libclass InitWinSock{public: InitWinSock(BYTE minorVer = 2, BYTE majorVer = 2) { // 初始化WS2_32.dll WSADATA wsaData; WORD sockVersion = MAKEWORD(minorVer, majorVer); if(::WSAStartup(sockVersion, &wsaData) != 0) { exit(0); } } ~InitWinSock() { ::WSACleanup(); }};#include <windows.h>#include <process.h>InitWinSock theSock;FD_SET g_fdRead;FD_SET g_allSet; //全集SOCKET g_sListen;unsigned long _stdcall ThreadFun(void*){ while(1) { g_fdRead=g_allSet; timeval timeval; timeval.tv_sec=0; timeval.tv_usec=0; int nRet = ::select(0, &g_fdRead, NULL, NULL, &timeval); printf("%d\n",nRet); if(nRet<=0) { Sleep(500); continue; } //检测是否有新连接,或者有数据传输 if(FD_ISSET(g_sListen,&g_allSet)) { SOCKET stmp=NULL; sockaddr_in sockadd; int nLen=sizeof(sockaddr_in); stmp=accept(g_sListen,(sockaddr*)&sockadd,&nLen); FD_SET(stmp,&g_allSet); }//可以运行到for 循环中!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! for(int i=0;i< g_fdRead.fd_count;i++) { if(FD_ISSET(g_fdRead.fd_array[i],&g_allSet)) { SOCKET stmp=NULL; sockaddr_in sockadd; int nLen=sizeof(sockaddr_in); char buf[200]; ZeroMemory(buf,sizeof(buf)); recv(g_fdRead.fd_array[i],buf,sizeof(buf),0); printf("接受数据为:%s\n",buf); } } Sleep(500); } //end while return 0;}int main(){ USHORT nPort = 9585; // 此服务器监听的端口号 // 创建监听套节字 g_sListen = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); sockaddr_in sin; sin.sin_family = AF_INET; sin.sin_port = htons(nPort); sin.sin_addr.S_un.S_addr = INADDR_ANY; // 绑定套节字到本地机器 if(::bind(g_sListen, (sockaddr*)&sin, sizeof(sin)) == SOCKET_ERROR) { printf(" Failed bind() \n"); return -1; } // 进入监听模式 ::listen(g_sListen, 5); FD_ZERO(&g_allSet); FD_ZERO(&g_fdRead); FD_SET(g_sListen,&g_allSet); // HANDLE hThread=(HANDLE)_beginthreadex(NULL,0,ThreadFun,NULL,0,NULL); HANDLE hThread=CreateThread(NULL,0,ThreadFun,0,0,NULL); WaitForSingleObject(hThread,-1); CloseHandle(hThread); return 0;}
问题代码中已经说了
for循环是可以进入的,数据就是接受的为空!
问题2:由于select是非堵塞的, 但是 select还是有些特殊,accept是可以根据其返回值来判断,
套接字是否合法。
呵呵
有的非堵塞模式,是不能根据的!!
这个是个人体会。
关键是我的第一个问题。
谁帮我解答,谢谢
[解决办法]
FD_ZERO(&fdWrite);
每次select前,要调用FD_ZERO清标记.