2012-07-17 130 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