sock编程,希望系统指定端口,bind时sin_port为0,bind成功并不能返回系统分配的端口,须使用getsockname获取

sock编程,希望系统指定端口,bind时sin_port为0,bind成功并不能返回系统分配的端口,须使用getsockname获取

	int testfd = socket(AF_INET, SOCK_DGRAM, 0);
	if(testfd==-1){
		printf("m socket error, %d, %s\n", errno, strerror(errno));
		return -1;
	}

	struct sockaddr_in adr_srvr_test;
	adr_srvr_test.sin_family = AF_INET;
	adr_srvr_test.sin_addr.s_addr = htonl(INADDR_ANY);  //inet_addr(Ip.c_str())  htonl(INADDR_ANY)  inet_addr("192.168.3.11")
	adr_srvr_test.sin_port = 0;
	int len_srvr = sizeof(adr_srvr_test);
	if(bind(testfd, (struct sockaddr *)&adr_srvr_test, len_srvr)){
		printf("m socket bind, %d, %s\n", errno, strerror(errno));

		close(testfd);
		testfd = -1;
		return -1;
	}	

	printf("------------------  %d\n", adr_srvr_test.sin_port);

	struct sockaddr_in tempsintests;
	memset(&tempsintests, 0, sizeof(tempsintests));

#if (defined(WIN32) || defined(WIN64))
	int sizetest = sizeof(tempsintests);
#else
	socklen_t sizetest = sizeof(tempsintests);
#endif	
	if (getsockname(testfd, (struct sockaddr *)&tempsintests, &sizetest) == -1) 
	{
		close(onvifmcastfd);
		onvifmcastfd=-1;
	}
	else
	{
		//string m_LocalIp = inet_ntoa(tempsintests.sin_addr);
		//int m_LocalPort = tempsintests.sin_port;
	}
	
	string m_LocalIp = inet_ntoa(tempsintests.sin_addr);

	printf("------------------%s: %d\n", m_LocalIp.c_str(), tempsintests.sin_port);

 

在MFC中,使用Socket进行网络编程,可以使用`bind`函数将一个套接字与本地IP地址和端口绑定在一起。`bind`函数用于服务器端,用来指定服务器要监听的IP地址和端口号。 以下是`bind`函数的使用方法: ```cpp BOOL bind( const SOCKADDR* lpSockAddr, // 指向一个SOCKADDR结构体,包含要绑定的IP地址和端口号信息 int nSockAddrLen // SOCKADDR结构体的长度 ); ``` 其中,`lpSockAddr`参数是一个指向`SOCKADDR`结构体的指针,该结构体包含了要绑定的IP地址和端口号信息。可以使用`CSocket::Create()`函数创建一个套接字对象后,再通过`GetSockName()`函数获取本地IP地址和端口号,并将其填充到`SOCKADDR`结构体中。 以下是一个简单的示例代码,演示了如何在MFC中使用`bind`函数进行绑定: ```cpp // 创建服务器套接字 CSocket serverSocket; serverSocket.Create(); // 获取本地IP地址和端口sockaddr_in serverAddress; int serverAddressLength = sizeof(serverAddress); serverSocket.GetSockName((sockaddr*)&serverAddress, &serverAddressLength); // 设置服务器地址和端口号 serverAddress.sin_port = htons(12345); // 设置要监听的端口号 // 绑定套接字 if (serverSocket.Bind((sockaddr*)&serverAddress, sizeof(serverAddress)) == FALSE) { // 绑定失败处理... } // 监听连接请求 serverSocket.Listen(); ``` 请注意,上述代码只是一个简单示例,实际使用可能需要进行错误处理和更全面的逻辑。同,还需要注意在绑定之前,确保套接字已经被创建成功,并且设置了正确的地址族(AF_INET或者AF_INET6)和套接字类型(SOCK_STREAM或者SOCK_DGRAM)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值