データグラムソケット(UDP)に基づいて反復サーバーを作成しようとしています。 これは、最初のrecvfrom()コールから取得した最初のクライアントへの接続を呼び出します(これは実際の接続ではありません)。 このクライアントにサービスを提供した後、私はUDPソケットを切断します(AF_UNSPECで接続を呼び出す) 次にrecvfrom()を呼び出して、次のクライアントから最初のパケットを取得します。接続されたデータグラムソケットを切断して再接続する
問題は、ループの2番目の反復でrecvfrom()の呼び出しが0になっていることです。クライアントは空のパケットを送信しないので、何が起きる可能性があります。
これはIAMのは、(擬似コード)を行うものです:
s = socket(PF_INET, SOCK_DGRAM, 0)
bind(s)
for(;;)
{
recvfrom(s, header, &client_address) // get first packet from client
connect(s,client_address) // connect to this client
serve_client(s);
connect(s, AF_UNSPEC); // disconnect, ready to serve next client
}
編集:私は誤って空のパケットを送信し、私のクライアントのバグを発見しました。 私の問題は、どこにもリクエストを送信する代わりにクライアントを待機させる方法です(サーバーは別のクライアントに接続されており、他のクライアントにはまだ対応していません)。
Connectは、send()またはrecv()を使用しているときに、アドレスを受信し、送信する内部フィルタを設定します。 recv(): "SOCK_DGRAMソケットの場合、データは、接続呼び出しで指定された宛先アドレスの最初のキューに入れられたデータグラムから抽出されます"。 – codymanix
あなたが正しいです、私のクライアントは(バグのために)空のパケットを送っていました。今私は別の問題があります。キュー内で待機する必要があるクライアントは、最初の要求パケット(サーバーから受信されない)を送信します。それから応答を受け取ろうとし、recvは-1を返します。クライアントを待たせるにはどうすればいいですか? – codymanix
あなたはまだこの問題に直面していますか(あなたの投稿の編集部分)、またはconnectを削除して解決していますか? –