如何从同一SRC和DEST端口(c++)运行UDP套接字

How to run UDP sockets from the same SRC and DEST port (c++)

本文关键字:c++ 运行 套接字 UDP 端口 DEST SRC      更新时间:2023-10-16

我不知道如何在同一源端口和目标端口上发送和接收多条消息。我的服务器必须一直监听,但发送是间歇性的(可以随机发生),所以从技术上讲,发送和接收应该在不同的线程上。请帮忙。这是我的代码:

    int main()
{
    std::thread UDPServerControlThread (KNXUDPControlServer,60000); //start server to listen on port 60000
    sendOneWayUDPMSG(SOMEDATA,DATASIZE); //I need this to send from the source port 60000 to the destination port 3671
    //wait some random time, do some processing...
    sendOneWayUDPMSG(MOREDATA,DATASIZE);
///more processing...
}

这里是上面提到的功能:

    void UDPControlServer(int serverPort)
    {
        struct sockaddr_in si_me, si_other;
        int s, slen = sizeof
(si_other) , recv_len;
    char buf[512];
    //create a UDP socket
    if ((s=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1)
    {
        DEBUG_MSG("CREATING UDP SOCKET FAILED" << endl);
    }
    // zero out the structure
    memset((char *) &si_me, 0, sizeof(si_me));
    si_me.sin_family = AF_INET;
    si_me.sin_port = htons(serverPort);
    //si_me.sin_addr.s_addr = htonl(INADDR_ANY);
    //bind socket to port
    if( ::bind(s , (struct sockaddr*)&si_me, sizeof(si_me) ) == -1)
    {
        DEBUG_MSG("BINDING SOCKET TO PORT FAILED" << endl);
    }
    //keep listening for data
    while(1)
    {
        //printf("*CONTROL-SERVER Waiting for data...");
        fflush(stdout);
        if ((recv_len = ::recvfrom(s, buf, 512, 0, (struct sockaddr *) &si_other, (socklen_t*)&slen)) == -1)
        {
            DEBUG_MSG("*CONTROL-SERVER RECEIVING FROM SOCKET FAILED" << endl);
        }
    }
    }

这个功能:

void sendOneWayUDPMSG(unsigned char * messagePayload, int messageSize)
{
    struct sockaddr_in si_in;
    int s, slen_in=sizeof(si_in);
    //char buf[512];
    if ( (s=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1)
    {
        DEBUG_MSG("FAILED TO CREATE SOCKET" << endl);
    }
    memset((char *) &si_in, 0, sizeof(si_in));
    si_in.sin_family = AF_INET;
    si_in.sin_port=htons(3671); // port
    if (::inet_aton(KNXIPInterfaceAddress.c_str() , &si_in.sin_addr) == 0)
    {
        fprintf(stderr, "inet_aton() failedn");
        exit(1);
    }
    //send the message
    if (sendto(s, messagePayload, messageSize , 0 , (struct sockaddr *) &si_in, slen_in)==-1)
    {
        DEBUG_MSG("SEND TO SOCKET FAILED" << endl);
    }
    close(s);
}

总之,我的代码基本上在端口60000上侦听,并在其本地端口3671上将数据发送到外部服务器。但是那些发送的数据包是从随机源端口发送的。我也需要把它们送到60000号港口。

我的服务器必须一直监听,但发送是间歇性的(可以随机发生),所以从技术上讲,发送和接收应该在不同的线程上。

不完全是。您应该使用selectpoll,甚至可能使用epoll多路复用I/O。

如果您想在传出数据包上使用与接收数据包的端口相同的源端口,只需重复使用UDPControlServer函数中的套接字描述符。。。

 if ((s=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1)
{
    DEBUG_MSG("CREATING UDP SOCKET FAILED" << endl);
}

在您的sendOneWayUDPMSG函数中。