[英]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。
我的服务器必须一直保持侦听状态,但是发送是间歇性的(可能在随机时间发生),因此从技术上讲,发送和接收应该在单独的线程上。
不完全是。 您应该使用select
, poll
甚至可能使用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.