关于UDP使用系统自动分配的端口

本文介绍了如何通过C++实现从socket获取客户端IP和端口,包括静态函数GetIPPort的使用,以及在test函数中创建socket并进行数据发送后的端口获取示例。

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

static string GetIPPort(sockaddr_in& ad)
{
	sockaddr_in *pAddr = &ad;
	string strClientIP = inet_ntoa(pAddr->sin_addr);
	int nClinetPort = ntohs(pAddr->sin_port);
	char cc[100];
	sprintf_s(cc, 100, "%s:%d", strClientIP.c_str(), nClinetPort);
	return cc;
}

static string GetIPPort(SOCKET& sk)
{
	sockaddr_in pAddr;
	int nlen = sizeof(pAddr);
	int nret = getsockname(sk,(SOCKADDR*)&pAddr, &nlen);
	if (nret ==0)
	{
		return GetIPPort(pAddr);
	}
	
	return "";
}

void test()
{
	SOCKET	s = socket(AF_INET, SOCK_DGRAM, 0);
	if (s == INVALID_SOCKET)
	{
		printf("socket() failed; %d\n", WSAGetLastError());
		WSACleanup();//释放套接字资源
		return ;
	}

	int nTimeout = 5000;
	setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, (char*)&nTimeout, sizeof(nTimeout) );

	SOCKADDR_IN		localAddr;						
	localAddr.sin_family = AF_INET;
	localAddr.sin_port = 0;//htons((short)5003); 赋值0,bind时系统自动分配端口		
	localAddr.sin_addr.s_addr = htonl(INADDR_ANY);
	
	//bind(s, (sockaddr*)&localAddr, sizeof(SOCKADDR_IN)); 也可以不bind,第一次sendto系统自动bind

	string stradd = GetIPPort(s); //调用bind后可得到分配的端口,否则可在sendto后得到

	int nPort = 5002;
	SOCKADDR_IN		destAddr;						
	destAddr.sin_family = AF_INET;
	destAddr.sin_port = htons(nPort);				
	destAddr.sin_addr.s_addr = inet_addr("192.168.1.2");

	char c = 'a';
	sendto(s, (char*)&c, 1, 0, (SOCKADDR*)&destAddr, sizeof(SOCKADDR));
	stradd = GetIPPort(s); 		//sendto后可得到自动分配的端口
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值