Socket_TCP _监听失败——10022

18 篇文章 1 订阅
8 篇文章 5 订阅

在实现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);
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值