1

没有:

  • MFC
  • ATL

使用纯 C++,WSAGetLastError()返回10014 - 错误地址

  • 我错过了什么/做错了什么?

代码说明:

sockaddr_in sin;
SOCKET server;

if ((server = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == SOCKET_ERROR)
{
    cerr << "Error: socket() return value == SOCKET_ERROR" << endl;
    WSACleanup();
    exit (EXIT_FAILURE);
}

sin.sin_family = AF_INET;
sin.sin_addr.s_addr = INADDR_ANY;
sin.sin_port = htons(1234); //random port

if(bind(server, (sockaddr *)&sin, sizeof(sin) == SOCKET_ERROR))
{
    wError = WSAGetLastError();
    cerr << "Error: bin() return value == SOCKET_ERROR\n"
            "Details: " << wError << endl;
    WSACleanup();
    exit (EXIT_FAILURE);
}
4

1 回答 1

6

如果那是您的真实代码,那么您在绑定调用中将括号放在错误的位置。最后的两个之一应立即移至“sizeof(sin)”之后。

换句话说,将其更改为:

if(bind(server, (sockaddr *)&sin, sizeof(sin) == SOCKET_ERROR))

到:

if(bind(server, (sockaddr *)&sin, sizeof(sin)) == SOCKET_ERROR)

这是一个与套接字编程无关的细微 C 错误,但说明了在使用一种易于拥有语法正确但语义不正确的语句的语言时需要格外小心。

你有它的方式,它计算“ sizeof(sin) == SOCKET_ERROR”(它总是假的(零),因为 sizeof(something) 总是一个或多个,并且 SOCKET_ERROR 总是 -1,至少对于 WinSock)。

然后它将这个零作为第三个参数传递给 bind() ,它自然会抱怨您没有为地址结构提供足够大的大小。

并且,正因为如此,bind() 返回一个非零错误代码,这就是你的 if 块正在执行的原因。

一个非常微妙的。尽管我已经使用 C 语言 20 多年,但我对 C 语言的尊重仍然很高——尊重是“我在塞伦盖蒂时尊重狮子”而不是“我尊重我妻子的意见”: -)

于 2009-01-19T01:02:20.430 回答