select()
UDP ソケット転送を使用してタイムアウトを作成しようとしています。int
からclient
にを送信しserver
、300 ミリ秒待って、ACK が得られない場合はパケットを再送信します。タイムアウトでこれを適切に設定する方法がわかりません。私がオンラインで収集したものとクラスからのメモからselect
、受信側で使用する必要があります.
サーバーのクライアントは、1 ~ 100 の数字を送受信します。ランダムにパケットをドロップする別のrouter
シミュレートされたコードがあります
クライアント側のコードは次のとおりです
int sent = 1;
int received = 1;
for (int i = 0; i < 100; i++)
{
string sent1 = to_string(sent);
char const *pchar = sent1.c_str();
if(!sendto(s, pchar, sizeof(pchar), 0, (struct sockaddr*) &sa_in, sizeof(sa_in)))
cout << "send NOT successful\n";
else
{
cout << "Client sent " << sent << endl;
sent++;
}
// receive
fd_set readfds; //fd_set is a type
FD_ZERO(&readfds); //initialize
FD_SET(s, &readfds); //put the socket in the set
if(!(outfds = select (1 , &readfds, NULL, NULL, & timeouts)))
break;
if (outfds == 1) //receive frame
{
if (!recvfrom(s, buffer2, sizeof(buffer2), 0, (struct sockaddr*) &client, &client_length))
cout << "receive NOT successful\n";
else
{
received = atoi(buffer2);
cout << "Client received " << received << endl;
received++;
}
}
}
コードは、逆になっていることを除いて、受信側でも同じです。つまり、最初に受信してから送信します。
私のコードはタイムアウトをまったく利用していません。これは基本的に私がやりたいことです:
send packet(N)
if (timeout)
resend packet(N)
else
send packet(N+1)