CのUDPソケット

c sockets udp
CのUDPソケット

私はクラスの宿題の問題に取り組んでいます。 ファイル要求をリッスンするUDPサーバーを起動したい。 ファイルを開き、UDPを使用して要求元クライアントに送り返します。

サーバーコードを示します。

    // Create UDP Socket
    if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
        perror("Can't create socket");
        exit(-1);
    }

    // Configure socket
    memset(&server, 0, sizeof server);
    server.sin_family = AF_INET; // Use IPv4
    server.sin_addr.s_addr = htonl(INADDR_ANY); // My IP
    server.sin_port = htons(atoi(argv[1])); // Server Port

    // Bind socket
    if ((bind(sockfd, (struct sockaddr *) &server, sizeof(server))) == -1) {
        close(sockfd);
        perror("Can't bind");
    }

    printf("listener: waiting to recvfrom...\n");
    if (listen(sockfd, 5) == -1) {
        perror("Can't listen for connections");
        exit(-1);
    }

while (1) {
    client_len = sizeof(struct sockaddr_in);
    newsockfd = accept(sockfd, (struct sockaddr*)&client,&client_len);

    if (newsockfd < 0) {
        perror("ERROR on accept");
    }

    // Some how parse request
    // I do I use recv or recvfrom?
    // I do I make new UDP socket to send data back to client?

    sendFile(newsockfd, filename);

    close(newsockfd);
}

close(sockfd);

クライアントからデータを受信する方法はありませんか? そして、クライアントへの新しいUDP接続を確立する方法は?

  5  3


ベストアンサー

UDPとTCPの違い:

  • ストリーム指向ではなく、メッセージ指向です。 読み取り/書き込みまたは
    送信/受信 send / recvfrom。 メッセージのサイズは64Kに制限されています。 recvfromへの各呼び出しは、sendtoへの呼び出しによって送信される1つのメッセージを取得します。 recvfromがメッセージのサイズよりも小さいバッファーを渡すと、メッセージの残りは永久に失われます。

  • 接続なし。 したがって、listen / accept / connectはありません。 あなたはメッセージを送る
    特定のアドレス/ポートへ。 (ソケットがバインドされているアドレス/ポートで)メッセージを受信すると、受信メッセージのソースをrecvfromの出力パラメーターとして取得します。

  • 保証なし。 メッセージはドロップされるか、順不同で受信されます。
    正しく覚えていれば、切り捨てることはできません。

最後の注意点-UDPを介したTCPの再発明に気付くかもしれません。 その場合は、停止してTCPに戻ります。

12


C UDPサーバークライアントを作成しました。クライアントは登録番号を送信し、サーバーはフィードバックとして名前を付けます。

サーバ

0. Variable initialization
1. sock()
2. bind()
3. recvfrom()
4. sendto()

クライアント

0. gethostbyname()
1. sock()
2. bzero()
4. sendto()
5. recvfrom()

それが役に立てば幸い。 サンプルコードは、http://matrixsust.blogspot.com/2011/10/udp-server-client-in-c.html [udp server / client]にあります。

12


acceptは、接続指向(STREAM)ソケットにのみ使用されます。 UDPはストリーム指向ではないため、接続はなく、accept(2)を使用できません-EOPNOTSUPPを返します。

代わりに、バインドされたサービスソケットから直接パケットを読み取るだけで(通常はrecvfrom(2)を使用するので、thyがどこから来たかを知ることができますが、recvを使用するか、気にしない場合は単に読み取ることができます)、その後、パケットを送り返すことができます同じソケットを使用します(通常はsendto(2)を使用します)

2


UDPはコネクションレス型であることに注意してください。 パケットのみを送信し、ファイルの送信には適していません-コンテンツ全体が1つのUDPパケットに収まらない限り。

とにかくUDPパケットを送受信したい場合は、単にhttp://www.opengroup.org/onlinepubs/009695399/functions/sendto.html[sendto]/http://www.opengroup.org/onlinepubs/009695399を呼び出すだけです。 /functions/recvfrom.html[recvfrom]に適切なアドレスを指定します。

1


タイトルとURLをコピーしました