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

标签 c++ visual-studio-2010 sockets winsock winsock2

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

I'm using:
-asynchronous socket
-TCP
-s is a valid socket
-i'v looped RequestInfo for several passes but nothing changes
-select() returns 0
-datasize returns -1 with errcode 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
}

最佳答案

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

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

关于c++ - Winsock send() 总是在服务器中返回错误 10057,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11532311/

相关文章:

c++ - 我不明白这个 C/C++ 笑话

c++ - Visual C++ Express 2010 高亮显示

C++ printf 大缓冲区

c++ - 获取两天之间的交易日数

c++ - 编译错误 “String does not name a type”

c++ - 引用抽象类赋值问题

vb.net - e.Handled 在 VB.net 2010 中不起作用

visual-studio - 在 Visual Studio 命令提示符中更改分区

c# - 将 protobuf 序列化对象从 C# 发送到 java 服务器不起作用?

sockets - VMWare/Cygwin/Sockets环境中的Netcat异常