2012-07-17 30 views
2

我试图在连接到自动化服务器请求发送到客户端,但我不断收到的10057.该WSAGetLastError我已经建立了从客户端向服务器请求没有问题所以我不明白为什么我不能做相反的事情?也许服务器必须等待来自客户端的第一个“发送”,但我不明白为什么可能如此?Winsock发送()总是返回错误10057在服务器

我使用:
-asynchronous插座
-TCP
-s是一个有效的套接字
-i'v循环RequestInfo了若干遍,但没有改变
-select()返回0
-datasize返回-1,ERRCODE 10057

谢谢你!

SERVER:

//first - following the debugger 
FD_ACCEPT 
int acc = accept(s, (struct sockaddr*)&fromm, &fromlenn); //success 
if(acc <= 0) 
{ 
    eLOGG << "\nFAIL FD_ACCEPT: " << WSAGetLastError(); 
} 
RequestInfo(); 

//then 
RequestInfo() 
{ 
    stringstream ssConverter; 
    ssConverter.clear(); ssConverter.str(string()); 
    ssConverter << "00aa";  //request signal 

    bool blogin = false; 

    eLOG << "signal is: *" << ssConverter.str() << "*"; 

    int bufSize = ssConverter.str().length(); 

    fd_set writefds; 

    struct timeval timeout; 
    timeout.tv_sec = 3; 
    timeout.tv_usec = 0; 

    FD_ZERO(&writefds); 
    FD_SET(s, &writefds); 

    int sel = select(s, NULL, &writefds, NULL, &timeout); 
    if(sel == SOCKET_ERROR) 
    { 
     eLOG << "\nselect - read fail: " << WSAGetLastError(); 
    } 
    if(sel == 0) 
    { 
     eLOG << "\nselect - not connected: " << WSAGetLastError(); 
    } 

    if (FD_ISSET(s, &writefds)) 
    { 
     eLOG << "\n FD_ISSET"; 
    } 
    eLOG << "\nauth socket is: " << s; 
    int dataSize = send(s, ssConverter.str().c_str(), bufSize, 0); 
    if(dataSize < bufSize) 
    { 
     eLOG << "\n FD_ISSET"; 
    } 
    //...etc 
} 

回答

8

你感到困惑的监听服务器套接字s连接插座,你从accept()acc变量得到。您无法通过服务器套接字发送或接收数据,因为它没有连接任何东西。其唯一目的是接受来自客户的新连接。毕竟,服务器通常处理多个客户端。

顺便说一句,这连接的插座不继承从服务器套接字非阻塞状态,所以你需要把它标记所以每accept()后。

+1

啊好,我没有意识到这一点。我已经改变了'INT acc'到'SOCKET acc'和我的'发送()单曲等使用连接'acc'。它现在有效。 难道是合理立即关闭该服务器监听套接字在通过连接的插座,因为我现在不想多台客户机后? – Soran 2012-07-18 02:36:10

+1

如果它是一杆连接接受,那么,你可以安全地关闭服务器套接字。 – 2012-07-18 12:01:45

相关问题