关于UDP使用系统自动分配的端口
原创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
", 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后可得到自动分配的端口
}
版权声明
所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除
上一篇:一次Link2001错误的解决 下一篇:如何从一名软件工程师转行做人工智能?