Receive=accept(SocketSvr,(struct sockaddr*)&client,&ClientLen);
if (Receive == INVALID_SOCKET)
{
MessageBox("accept() failed: %d\n", (const char*)WSAGetLastError());
return 0;
}
char buffer[50];
sprintf(buffer,"connect from %s",inet_ntoa(client.sin_addr));
MessageBox( buffer);  sprintf(buffer,"%s:欢迎来到深蓝空间",inet_ntoa(client.sin_addr));

        if(send(Receive,buffer,sizeof(buffer)+1,0) == SOCKET_ERROR)
{
MessageBox("send() failed: %d\n", (const char*)WSAGetLastError());
return 0;
}
char recvBuffer[100]; if(recv(Receive,recvBuffer,100,0) == SOCKET_ERROR)
{
MessageBox("recv() failed: %d\n", (const char*)WSAGetLastError());
return 0;
}
MessageBox(recvBuffer);执行到accept时就不动了,直到客户端发送消息才有反应,如果客户端不发消息了,服务端界面就没有响应了。我看到网上有人说用多线程,怎么写?

解决方案 »

  1.   

    设置异步模式,
    启动一个select线程
      

  2.   

    通知各位IT的技术朋友,有好东西与大家共同分享
    2008年07月18日 周五 综合场(朝阳人才市场)奥运会北京地区最后的几场招聘会,请大家帮我转发一下,谢谢!
    让更多的兄弟姐妹找到好的工作!否则这些求职者将要等到9月20日之后,才会开展。
    招聘会
    北京招聘会
    招聘会 http://www.palmjob.net/zhpd/
    北京招聘会 http://www.palmjob.net/zhpd/bjindex.jsp
      

  3.   

    用select处理,搜 套接口的select模型
      

  4.   


    我在网上找了个select()方法,但是还是不行。
    运行到select函数时,服务端还是进入等待状态,客户端发消息后,才会继续运行。fd_set fdSocket;   // 所有可用套节字集合
    FD_ZERO(&fdSocket);
    FD_SET(SocketSvr, &fdSocket);while(1)
    {
            fd_set fdRead = fdSocket;
    int nRet = select(0,&fdRead,NULL,NULL,NULL);
    if (nRet > 0)
    {
    for (int i=0;i<(int)fdSocket.fd_count;i++)
    {
    if (FD_ISSET(fdSocket.fd_array[i],&fdRead))
    {
    if (fdSocket.fd_array[i] == SocketSvr)
    {
    if (fdSocket.fd_count < FD_SETSIZE)
    {
    Receive=WSAAccept(SocketSvr,(struct sockaddr*)&client,&ClientLen,NULL,0);
    FD_SET(Receive,&fdSocket);

    if (Receive == INVALID_SOCKET)
    {
    MessageBox("accept() failed");
    return 0;
    }
    char buffer[50];
    sprintf(buffer,"connect from %s",inet_ntoa(client.sin_addr));
    MessageBox( buffer); 

    sprintf(buffer,"欢迎来到深蓝空间");

    if(send(Receive,buffer,sizeof(buffer)+1,0) == SOCKET_ERROR)
    {
    MessageBox("send() failed“);
    return 0;
    } }
    }
    else
    {
    char recvBuffer[100];

    if(recv(Receive,recvBuffer,100,0) == SOCKET_ERROR)
    {
    MessageBox("recv() failed: %d\n", (const char*)WSAGetLastError());
    return 0;
    }
    else
    {
    closesocket(fdSocket.fd_array[i]);
    FD_CLR(fdSocket.fd_array[i],&fdSocket);
    }
    MessageBox(recvBuffer);
    }
    }
    }
    }
    else
    {
    MessageBox("failed connect");
    break;
    }
    }
      

  5.   

    将监听状态的套接字 放到select集合里面就可以了
      

  6.   

    select好好看下msdn,设下时间,然后用它来的返回值来判断是否侦听到客户端,侦听到再进入accept.
      

  7.   

    http://www.vckbase.com/document/viewdoc/?id=1743
      

  8.   


    怎么还没解决吗?工程小的话 你把代码发我 我帮你改下:[email protected]
      

  9.   

    while(1)
    {
    int nRet = select(0,&fdRead,NULL,NULL,NULL); if(nRet>0)
         Receive=accept(SocketSvr,(struct sockaddr*)&client,&ClientLen); 
    else if(nRet == 0)
    {
         //Sleep(5000);     //也可以不用Sleep;因为select本身会用掉你设的时间的;
    }
    else
    {
         int nErr = getlasterror();       
         TRACE("nErr = %d\n",nErr);  //看一下是什么错误;
          break;      //跳出循环
    }
    }fdRead这个结构体有一个变量参数是设select的时间的,可以设为10秒左右。
    中间哪个Sleep我忘记是设好还是不设好了,你可以看下你的cpu,如果不用sleep,并不站多大cpu的话就可以不用了。Sleep主要是为了把cpu时间片分给别的线程用。
    accept返回的是你侦听到的客户端把好象,侦听到以后你就可以与它进行send与recv了。后边的你自己写你的程序把。
    好运!
      

  10.   

    解决了,谢谢各位。
    用了MFC消息响应