简体   繁体   English

如何在单个客户端上的UDP套接字上同时接收和发送数据

[英]How to recv and send data on UDP socket on single client simultaneously

I have to implement selectiveRepeat Mechanism on udp as it is in TCP. 我必须在udp上实现selectiveRepeat机制,就像在TCP中一样。 So in this respect i will be sending my window to the client and in same time will be expecting acks for sent data...I am trying to do this as shown below ... but in this code it sends data but does not recieve any ack.......can any one plz help 因此,在这方面,我将把窗口发送给客户端,同时期望发送数据的确认...我正尝试如下所示...但是在此代码中,它发送数据但未接收到任何确认.......任何人都可以帮助

`fd_set rfds;
fd_set wfds;
FD_ZERO(&rfds);
FD_ZERO(&wfds);

struct timeval timeout;
timeout.tv_sec = 5;
timeout.tv_usec = 0; 

FD_SET(socket, &rfds);
FD_SET(socket, &wfds);

while( FBS < LBS )
{


    int result = select(socket+1, &rfds, &wfds, NULL, &timeout);


    if(FD_ISSET(socket, &rfds))
    {

         Recieve();
    }
    if(FD_ISSET(socket, &wfds))
    {

        Send( "Some data");


    }   

    FBS++;

}`
fd_set rfds;
fd_set wfds;
FD_ZERO(&rfds);
FD_ZERO(&wfds);
struct timeval timeout;
timeout.tv_sec = 5;
timeout.tv_usec = 0; 

FD_SET(socket, &rfds);
FD_SET(socket, &wfds);

while( FBS < LBS )
{


int result = select(socket+1, &rfds, &wfds, NULL, &timeout);


if(FD_ISSET(socket, &rfds))
{

     Recieve();
     FD_SET(socket, &wfds);     //set socket wirtable
}
if(FD_ISSET(socket, &wfds))
{

    Send( "Some data");
    FD_CLR(socket, &wfds); // reset socket writable

}   

FBS++;

UPDATE : 更新

You need to remove socket from wfds after sending data FD_CLR(socket, &wfds). 发送数据FD_CLR(socket,&wfds)后,需要从wfds中删除套接字。 Because when you add socket in wfds and polling using select then select will always find that socket writable and will keep sending data infinitely untill socket it closed. 因为当您在wfds中添加套接字并使用select进行轮询时,select总是会发现该套接字可写,并且将一直无限发送数据,直到套接字关闭为止。 You have to set it to writable only iff there is data available to send. 仅当有可发送的数据时,才必须将其设置为可写。 In above scenario, at first set it as writable, then send data and remove it from wfds, then keep waiting for ACK 在上述情况下,首先将其设置为可写,然后发送数据并将其从wfds中删除,然后继续等待ACK

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

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