UDPを使用して単純なWebサーバーとクライアントを作成していますが、これまでのところ:
- プログラムは相互に接続でき、
- クライアントはリクエストを送信できます。
- サーバーはリクエストを読み取ることができ、
- サーバーはクライアントの IP アドレスとクライアントのポートを認識できます。
- サーバーはメッセージをクライアントに送り返すことができます
私の問題はrcvfrom
、サーバーが応答を送信した後でも、クライアント コードが関数内で待機状態になることです。
以下は、サーバー メッセージを取得し、ソケットによって読み取られたバイト数を返す関数です。
ssize_t receive_from_server(rdp_socket *rsocket, char *buffer, size_t buf_len){
socklen_t sendsize = sizeof(rsocket->server_addr);
bzero(&(rsocket->server_addr), sendsize);
//STUCK HERE:
return recvfrom(rsocket->sockfd, buffer, buf_len, 0,
(struct sockaddr*)&(rsocket->server_addr), &sendsize);
}
SO_SNDTIMEO
両方のソケットオプトを設定しSO_RCVTIMEO
、数秒後にタイムアウトするようにしました。
質問:
近い将来、信頼できるデータ転送のために確認応答 (ACK) を追加する予定です。ACKの欠落が問題になる可能性があると思いますが、訓練された目で見ると、別の問題のように見えるのではないかと思っています.
タイムアウトが機能するためには ACK が必要ですか?
クライアントとサーバーが実際に相互に通信できるように同期するにはどうすればよいですか?