[英]winsock2 cannot bind a socket
我是winapi(winsocket2)的新手。 这是我的完整代码(我不能以其他方式使用,因为我的程序确实可以编译,但是似乎无法正常工作(不绑定套接字绑定函数返回-1))。
#include<winsock2.h>
#include<ws2tcpip.h>
#include<stdio.h>
#include<iostream>
using namespace std;
WSADATA sData;
SOCKADDR_IN linker;
SOCKET sSocket;
int main()
{
if(WSAStartup(MAKEWORD(2,3),&sData)!=0)
{
cout<<"Cannot startup WINsocket";
return -1;
}
cout<<"\tWINsocket loaded!\n\n";
if(sSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)==INVALID_SOCKET)
{
cout<<"Invalid socket.";
return -1;
}
cout<<"\tSocket loaded!\n\n";
linker.sin_family=AF_INET;
linker.sin_addr.s_addr=INADDR_ANY;
linker.sin_port=htons(3490);
memset( &( linker.sin_zero ), '\0', 8 );
char yes='1';
if( setsockopt( sSocket, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof( yes ) ) == - 1 )
{
perror( "setsockopt" );
exit(1);
}
if(bind(sSocket,(struct sockaddr*)&linker,sizeof(linker))==SOCKET_ERROR)
cout<<"lol";
cout<<"\tSocket succesfully binded!\n\n";
listen(sSocket,10);
}
我试过了,如果绑定之前就粘贴
char yes='1';
if( setsockopt( sSocket, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof( yes ) ) == - 1 )
{
perror( "setsockopt" );
exit(1);
}
但是此函数仅打印出setsockopt:没有错误并退出。 感谢帮助
SO_REUSEADDR
选项期望BOOL
类型的参数,这是int
的typedef。 我怀疑传递一个char
会引起问题:除非最后一个参数的大小与期望的大小匹配,否则setsockopt()
将拒绝分配选项,在您的情况下这是不正确的( sizeof(char) != sizeof(BOOL)
)。
换句话说,您可以将代码更改为此:
BOOL yes = 1;
if( setsockopt( sSocket, SOL_SOCKET, SO_REUSEADDR, (char*)&yes, sizeof( yes ) ) == - 1 )
{
perror( "setsockopt" );
exit(1);
}
if(sSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)==INVALID_SOCKET)
括号问题。 尝试这个:
if((sSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==INVALID_SOCKET)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.