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是一把电锯,而大多数其他语言都是订书机(我的陪审团仍然不知道哪种更好:-)。