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

时间:2015-10-27 19:04:43

标签: c++ sockets udp

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

    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() failed\n");
        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端口。

1 个答案:

答案 0 :(得分:0)

  

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

不完全是。您应该使用selectpoll或甚至epoll多路复用您的I / O.

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

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

sendOneWayUDPMSG函数中。