3

接続時にクライアントへのサーバー リクエストを自動化しようとしていますが、WSAGetLastError の 10057 が発生し続けます。クライアントからサーバーへのリクエストを問題なく設定したので、逆にできない理由がわかりません。サーバーはクライアントからの最初の「送信」を待たなければならないのかもしれませんが、なぜそうなるのかわかりませんか?

私が使用している: -
非同期ソケット
-TCP
-s は有効なソケットです
-i'v はいくつかのパスで RequestInfo をループしましたが、何も変更されません
-select() は 0
を返します -datasize はエラーコード 10057 で -1 を返します

ありがとうございました !!!

サーバ:

//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
}
4

1 に答える 1

10

リスニングサーバー ソケット sと、変数から取得した接続済みソケットを混同しています。サーバーソケットは何にも接続されていないため、サーバーソケットを介してデータを送受信することはできません。その唯一の目的は、クライアントからの新しい接続を受け入れることです。結局のところ、サーバーは通常、複数のクライアントを処理します。accept()acc

ちなみに、その接続されたソケットはサーバー ソケットから非ブロッキング ステータスを継承しないため、accept().

于 2012-07-17T23:43:25.670 に答える