读书人

诸位老师们好接受不到数据

发布时间: 2012-08-30 09:55:54 作者: rapoo

各位老师们好,接受不到数据

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清标记.

读书人网 >C语言

热点推荐