Visual c++ 为什么bind()返回套接字错误

Visual c++ 为什么bind()返回套接字错误,visual-c++,winsock,Visual C++,Winsock,没有: MFC ATL 使用纯C++,WGSAETLASTRADROR()返回10014个-坏地址< /P> 我错过了什么/做错了什么 代码说明: sockaddr_in sin; SOCKET server; if ((server = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == SOCKET_ERROR) { cerr << "Error: socket() return value == SOCKET_ERROR

没有:

  • MFC
  • ATL

使用纯C++,WGSAETLASTRADROR()返回10014个-坏地址< /P>

  • 我错过了什么/做错了什么
代码说明:

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);
}
sin中的sockaddr_; 套接字服务器; if((服务器=套接字(AF_INET、SOCK_STREAM、IPPROTO_TCP))==套接字错误) {
cerr如果这是您的真实代码,那么在bind调用中括号的位置是错误的。末尾的两个括号中的一个应该移到“sizeof(sin)”之后

换句话说,将其更改为:

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

这是一个与socket编程无关的微妙的C错误,但它说明了在使用一种语言时需要如何小心,这种语言可以很容易地获得语法正确但语义不正确的语句

按照您的方式,它计算“
sizeof(sin)==SOCKET\u ERROR
”(这总是假(零),因为sizeof(something)总是一个或多个,SOCKET\u ERROR总是-1,至少对于WinSock是这样)

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

因此,bind()将返回一个非零错误代码,这就是执行if块的原因


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

如果这是您的真实代码,则在绑定调用中括号的位置不正确。末尾的两个括号中的一个应移到“sizeof(sin)”之后

换句话说,将其更改为:

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

这是一个与socket编程无关的微妙的C错误,但它说明了在使用一种语言时需要如何小心,这种语言可以很容易地获得语法正确但语义不正确的语句

按照您的方式,它计算“
sizeof(sin)==SOCKET\u ERROR
”(这总是假(零),因为sizeof(something)总是一个或多个,SOCKET\u ERROR总是-1,至少对于WinSock是这样)

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

因此,bind()将返回一个非零错误代码,这就是执行if块的原因


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

我不认为应该删除帖子,除非它们是垃圾邮件或没有真实答案的空话问题。这篇文章相当本地化,但其他人可能也有同样的问题。但是,这是你的问题和决定。事实上,这不是一个束缚()问题但是C的一个小毛病——语法上正确的东西可能是语义上不正确的——这和我不信任拼写检查器的原因一样,因为它们不会捕捉到诸如“我昨天去购物了”或“我今天买了这张磁盘上班了”之类的东西.我想把它放在这里,作为一个例子,说明如果你不时刻保持警惕,C是一把电锯,而大多数其他语言都是订书机(我的陪审团仍然不知道哪种更好:-)。我不认为帖子应该被删除,除非它们是垃圾邮件或没有真正答案的空话问题。这篇帖子相当本地化,但其他人可能也有同样的问题。但是,这是你的问题和决定。实际上,这不是一个束缚()问题但是C的一个小毛病——语法上正确的东西可能是语义上不正确的——这和我不信任拼写检查器的原因一样,因为它们不会捕捉到诸如“我昨天去购物了”或“我今天买了这张磁盘上班了”之类的东西.我想把它放在这里,作为一个例子,说明如果你不时刻保持警惕,C是一把电锯,而大多数其他语言都是订书机(我的陪审团仍然不知道哪种更好:-)。