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

原创
小哥 2年前 (2023-05-20) 阅读数 34 #大杂烩
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后可得到自动分配的端口
}
版权声明

所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除

热门