代码如下:
#include <stdio.h>
#include <winsock2.h>
#include "SOCKET_OBJ.h"
#include "PTHREAD_OBJ.h"
#pragma comment(lib,"WS2_32")int main()
{
WSADATA wsaData;
WORD sockVersion=MAKEWORD(2,2);
if (::WSAStartup(sockVersion,&wsaData)!=0)
{
exit(0);
}

USHORT nPort=4567;
SOCKET 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(sListen,(sockaddr*)&sin,sizeof(sin))==SOCKET_ERROR)
{
printf("Failed bind() \n");
printf("%d",WSAGetLastError());
return -1;
}
::listen(sListen,200);
WSAEVENT event=::WSACreateEvent();
::WSAEventSelect(sListen,event,FD_ACCEPT|FD_CLOSE);
::InitializeCriticalSection(&g_cs);
while (TRUE)
{
int nRet=::WaitForSingleObject(event,5*1000);
if (nRet==WAIT_FAILED)
{
printf("Failed WaitForSingleObject() \n");
break;
}
else if (nRet==WSA_WAIT_TIMEOUT)
{
printf("\n");
printf("TatolConnections:%d \n",g_nTatolConnections);
printf("CurrentConnections:%d \n",g_nCurrentConnection);
continue;
}
else
{
......
}
}
::DeleteCriticalSection(&g_cs);
return 0;
}运行程序的时候总是超时,也就是nRet总是是等于WSA_WAIT_TIMEOUT,不知道为什么?我用客户端向此服务端发送数据,服务端似乎无法收到连接请求!如果有收到连接,应该是执行else里面的代码!所以问题应该出现在
nRet=::WaitForSingleObject(event,5*1000);
返回是WSA_WAIT_TIMEOUT这里!但是为什么是返回WSA_WAIT_TIMEOUT?

解决方案 »

  1.   

    这个很好解释啊,event没有触发啊...waitforsingleobject总共前一个是等待事件的触发,如果触发了就不等了,后面才是超时
      

  2.   

    那问题是我客户端如果发送数据到服务器端应该就会触发这个event事件,但我用客户端连接上服务器后再发送数据,但是服务器端还是一直在WSA_WAIT_TIMEOUT!
      

  3.   

    判断一下::WSAEventSelect(sListen,event,FD_ACCEPT|FD_CLOSE); 返回值
      

  4.   

    ::WSAEventSelect(sListen,event,FD_ACCEPT|FD_CLOSE); 的返回值是0,成功!
      

  5.   

    ::listen(sListen,200);成功了么?listen得第二个参数在windows中最大是5,因此200是一个非法错误,不知道会不会导致listen失败还要,你进dos方式用netstat -ano看看,是不是有你得进程在侦听这个端口
      

  6.   

    listen返回值是0,表示成功!
    另外.用netstat -ano命令查看得到以下结果:我的客户端使用的端口是4581,从图中可以看出,服务端的端口接收到了连接请求,但是event事件就是没有被触发,莫名其妙!
      

  7.   

    哦!上面的内容是:
    listen返回值是0,表示成功! 
    另外.用netstat -ano命令查看得到以下结果: 我的客户端使用的端口是4581,从图中可以看出,服务端的端口接收到了连接请求,但是event事件就是没有被触发,莫名其妙!