繁体   English   中英

如何从相同的SRC和DEST端口(C ++)运行UDP套接字

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

我不知道如何在相同的源端口和目标端口上发送和接收多个消息。 我的服务器必须一直保持侦听状态,但是发送是间歇性的(可能在随机时间发生),因此从技术上讲,发送和接收应该在单独的线程上。 请帮忙。 这是我的代码:

    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。

我的服务器必须一直保持侦听状态,但是发送是间歇性的(可能在随机时间发生),因此从技术上讲,发送和接收应该在单独的线程上。

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

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

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

在您的sendOneWayUDPMSG函数中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM