在实现tcp通信的多线程中,出现了一个问题,监听函数会报错:
//绑定地址到服务器
int ret=bind(listenSer, (SOCKADDR*)&saddr, slen);
if (ret== SOCKET_ERROR) {
cout << "绑定地址失败" << endl;
cout << "5s后退出控制台!" << endl;
closesocket(listenSer);
Sleep(5000);
exit(0);
}
//监听连接请求
int li= listen(listenSer, 50);
if (li == SOCKET_ERROR) {
cout << "监听失败" << endl;
cout << WSAGetLastError() << endl;
cout << "5s后退出控制台!" << endl;
Sleep(5000);
}
此时进行编译,会报错:
error C2440: “初始化”: 无法从“std::_Binder<std::_Unforced,SOCKET &,SOCKADDR *,int &>”转换为“int”
刚开始先尝试不要返回值试试:
bind(listenSer, (SOCKADDR*)&saddr, slen);
/*
if (ret== SOCKET_ERROR) {
cout << "绑定地址失败" << endl;
cout << "5s后退出控制台!" << endl;
closesocket(listenSer);
Sleep(5000);
exit(0);
*/
}
此时再次编译,发现编译成功。
但是控制台却报错:
F12看一下,这个bind居然是functional.h里的一个函数,而我们要使用的bind应该是WinSock2.h里的。
其实这个错误是因为出现了同名的函数名,而编译器默认为这个bind函数为另一个function 中的bind函数。进而导致bind函数出现问题,随之listen函数也出现了问题。
functional.h
WinSock2.h
解决方法:
使用限定符锁定bind函数
int ret=_WINSOCK2API_::bind(listenSer, (SOCKADDR*)&saddr, slen);
或者
int ret= ::bind(listenSer, (SOCKADDR*)&saddr, slen);