Winsock send()总是在服务器中返回错误10057

Winsock send() always returns error 10057 in server

本文关键字:服务器 返回 错误 10057 send Winsock      更新时间:2023-10-16

我试图在连接时自动向客户端发出服务器请求,但我一直得到10057的WSAGetLastError。我已经设置了从客户端到服务器的请求,没有问题,所以我不明白为什么我不能做相反的事情?也许服务器必须等待客户端的第一次"发送",但我不明白为什么会这样?

我正在使用:
-异步套接字
-TCP
-s是有效的套接字
-我已经循环了几次RequestInfo,但没有任何变化
-select()返回0
-datasize返回-1,错误代码为10057

谢谢!!!

服务器:

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

您混淆了侦听服务器套接字s和连接的套接字,它们是从acc变量中的accept()获得的。您无法通过服务器套接字发送或接收数据,因为它没有连接到任何东西。它的唯一目的是接受来自客户端的新连接。毕竟,服务器通常处理多个客户端。

顺便说一句,连接的套接字不会从服务器套接字继承非阻塞状态,因此您需要在每次accept()之后将其标记为非阻塞状态。