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

本文探讨了SOCK编程中系统指定端口的实践,通过bind函数设置sin_port为0实现让系统自动分配端口,并详细展示了如何使用getsockname函数获取系统实际分配的端口号,提供了一个具体的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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);

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值