我的程序在开始监听后在执行,在WSAWaitForMultipleEvents等待时,我用一个客户端对其进行请求,但是一点反应也没有,这是为什么?还是我在监听的代码就设置错了?
我的监听线程函数如下:
UINT _cdecl ListenThread(LPVOID pParam)
{
SOCKET myListenSocket;
sockaddr_in sockaddr;
int nResult;
WSAEVENT hListenEvent;
HWND hWnd;
WSAEVENT lphEvent[1]; hWnd = (HWND)pParam;
ASSERT ( hWnd != NULL ); sockaddr.sin_addr.s_addr = htonl(INADDR_ANY);
sockaddr.sin_family = AF_INET;
sockaddr.sin_port = htons(5000); myListenSocket = socket(AF_INET, SOCK_STREAM, 0);
ASSERT( myListenSocket != INVALID_SOCKET );
nResult = bind(myListenSocket, (LPSOCKADDR)&sockaddr, sizeof(sockaddr) );
ASSERT( nResult != SOCKET_ERROR);
hListenEvent = WSACreateEvent();
ASSERT( hListenEvent != NULL ); nResult = WSAEventSelect(myListenSocket, hListenEvent, FD_ACCEPT|FD_CLOSE);
ASSERT ( nResult == 0 ); lphEvent[0] = hListenEvent;
for(;;)
{

WSAWaitForMultipleEvents(1, lphEvent, true, INFINITE, true); 
AfxMessageBox(" received ");
//...以下代码略 } return EXIT_SUCCESS;
}
我创建该监听线程的代码如下:
HANDLE hWnd;
hWnd = GetSafeHwnd();
AfxBeginThread(ListenThread, hWnd, THREAD_PRIORITY_NORMAL, 0, 0, NULL);

解决方案 »

  1.   

    是不是我要先用WSAIoctl设置堵塞模式?望高手不吝指教。
    我在这个问题上已经困惑好几天了
      

  2.   

    不需要用WSAIoctl设置堵塞模式;默认是阻塞的。
    你的socket好像没有accept;//我想问题可能出在这里
    而且你用它干什么的?
    nResult = WSAEventSelect(myListenSocket, hListenEvent, FD_ACCEPT|FD_CLOSE);
      

  3.   

    我不用nResult = WSAEventSelect(myListenSocket, hListenEvent, FD_ACCEPT|FD_CLOSE)怎么知道有客户端来请求啊?
    我是这么想的:
    用WSAEventSelect(myListenSocket, hListenEvent, FD_ACCEPT|FD_CLOSE),当有请求到达时就可以使hListenEvent处于激发状态,然后我就可以对请求进行Accept()了。
    你的意思是不是我只要在循环中进行Accept()就可以了,那如果没有请求到达的话,我怎么Accept()呢?
      

  4.   

    你这样做也行,但没什么必要啊.
    怎么你的listen跑哪里去了?
    这个都没有,你怎么监听啊.bind后要记得listen然后才行,你程序流程没什么问题.
      

  5.   

    不好意思,我忘记打了Listen(),好郁闷……
      

  6.   

    我现在可以运行了,多谢指出
    -》 shesh(无所谓):
    你在上面说:你这样做也行,但没什么必要啊.为什么这么说呢?我刚学网络编程,请高手指点
      

  7.   

    我也觉得你的for循环没有什么用。
      

  8.   

    accept()
     当有请求时,开线程处理不就行了。
    accept是可以接收到你的客户端的请求的,你可以试一下。
      

  9.   

    -> coyer:
    我不循环不是线程接收完一个请求就退出了吗?为什么说for循环没有用呢?-> jincai78:
    没有请求时怎么accept呢?
    accept()是不是可以堵塞运行的,所以可以直接调用?
      

  10.   

    accept()是堵塞运行的.(如果你用socket sdk api的话,not mfc,I do not know CSocket,I only  use socket)