1

他の誰かが書いた C++ プログラムを動作させようとしています。理解に苦しみます。UDP ソケットで poll() を使用できるかどうかは 100% もわかりませんが、リファクタリングしているコードでは、次のように poll() を使用して udp ソケットから読み取ります。

fd.fd = m_bsocket;
fd.events = POLLIN;


iPollResult = poll(&fd, 1, iTimeout);

if(iPollResult > 0)
{
    int iReceivedByteCount = recv(m_bsocket, p_pBuffer, p_iBufferSize, 0);
    if(iReceivedByteCount > 0)
    {
        *p_pReadSize = iReceivedByteCount;
    }
    else
    {
        eReturnValue = UDP_READ_ERROR;
    }
}

return eReturnValue;

コマンドラインを使用して、このプログラムにudpパケットを送信しようとしました:

エコー "123" | nc -u 127.0.0.1 25

poll() は常にタイムアウトして 0 を返すように見えるため、何も読み取れません。

udp データグラムを送信する小さな c# プログラムも作成しましたが、メッセージを受信できません。私は何が間違っているのだろうか...

4

2 に答える 2

2

UDP ソケットは別のホストに接続するために使用できますが、ほとんどの場合「コネクションレス」で使用されます。質問とコメントを読んでも、ソケットが接続されていることに意味がありません。代わりに、WouterH のコメントで示唆されているように、コネクションレスにする必要があります。

int sockfd = socket(AF_INET, SOCK_DGRAM, 0);

struct sockaddr_in sin = { 0 };
sin.sin_family = AF_INET;
sin.sin_port = htons(25);
sin.sin_addr.s_addr = INADDR_ANY;
bind(sockfd, (struct sockaddr *) &sin, sizeof(sin));

// Make socket non-blocking if needed

上記のコードでは、誰かがホストの任意のアドレスのポート 25 に UDP パケットを送信するたびに、ソケットがそれを傍受します。egpollまたはを使用selectして、いつデータが利用可能かを知ることができます。

于 2012-06-07T11:45:26.677 に答える
2

connect()UDP はコネクションレスであるため、呼び出す必要はありません。リッスンしているインターフェイスの IP またはすべてのインターフェイスのbind()0.0.0.0 ( ) へのソケットが必要です。INADDR_ANYまた、宛先に送信する場合は を使用しますsendto()

完全を期すために:connect()UDPソケットで呼び出す場合、send()関数のデフォルトの宛先を設定しているだけです(sendtoの代わりにsendを使用できます)。

データを受信したい場合は、常にインターフェースへbind()のソケット、またはすべてのインターフェースが必要です。受信しているメッセージの送信元アドレスを確認する必要があることに注意してください。recvfrom()そのため、送信元アドレスを使用して確認することにより、送信者をフィルタリングすることができます。

于 2012-06-07T11:47:41.323 に答える