在实现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);
   */
	}

此时再次编译,发现编译成功。
但是控制台却报错:

Socket_TCP _监听失败——10022

F12看一下,这个bind居然是functional.h里的一个函数,而我们要使用的bind应该是WinSock2.h里的。

其实这个错误是因为出现了同名的函数名,而编译器默认为这个bind函数为另一个function 中的bind函数。进而导致bind函数出现问题,随之listen函数也出现了问题。

functional.h

Socket_TCP _监听失败——10022

WinSock2.h

Socket_TCP _监听失败——10022

解决方法:
使用限定符锁定bind函数

int ret=_WINSOCK2API_::bind(listenSer, (SOCKADDR*)&saddr, slen);
或者
int ret= ::bind(listenSer, (SOCKADDR*)&saddr, slen);

相关文章: