1

こんばんは、私はcプログラミング言語でLinuxソケットを使用する初心者です。

今のところ、クライアントをサーバーと通信させようとしています。基本的に私が立ち往生しているのは、サーバーにクライアントからの接続を受け入れさせ、受信後に番号を出力させることです。これまでのサーバーのソースコードは次のとおりです。

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <time.h>

int main(int argc, char *argv[])
{
    int listenfd = 0, connfd = 0, n = 0;
    struct sockaddr_in serv_addr;
    char sendBuff[1024], recvBuff[1024];

    listenfd = socket(AF_INET, SOCK_STREAM, 0);
    memset(&serv_addr, '0', sizeof(serv_addr));
    memset(sendBuff, '0', sizeof(sendBuff));

    serv_addr.sin_family = AF_INET;
    serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    serv_addr.sin_port = htons(5000);

    bind(listenfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr));

    listen(listenfd, 10);

    while(1)
    {
        printf("in first while loop\n");
        connfd = accept(listenfd, (struct sockaddr*)NULL, NULL);
        while( (n = read(listenfd, recvBuff, sizeof(recvBuff)-1)) > 0)
        {
                printf("in second while loop\n");
                recvBuff[n] = 0;

                fputs(recvBuff, stdout);
        }
    }
}

関連性がないと思うので、クライアントコードを投稿しませんでした。クライアントに何かを送信するサーバーを作成しましたが、問題なく動作しました。しかし、サーバーにクライアントからの入力を受け入れさせる方法に真剣に混乱しています。前もって感謝します。

4

2 に答える 2

1

与えられた他の回答 ( から読み取るものconnfdではなくlistenfd) は、コードの問題を解決します。この回答は、サーバーソケットを取り巻く「深刻な混乱」を解消するために提示されています。

「ソケット」は、2 つのアプリケーション間のパイプとして最も一般的に考えられています。これは、受け入れられ接続されたソケットがコード内でどのように動作するかです (connfd上記の例)。

ただし、一般に、「ソケット」は単なる「ハンドル」であり、特定のポートにバインドして新しい接続を受け入れたいサーバーなど、他の方法でも使用できます。上記の例でlistenfdは、特定のポートにバインドするために使用されているソケット ハンドルであるため、接続を受け入れることができます。からの戻りが成功するたびに、接続されたソケット (例: ) に実際に新しいソケット ハンドルacceptが返されます。このソケットでは、実際にデータを読み書きできます。connfd

于 2013-03-21T05:07:26.997 に答える
0

変更する必要があります

connfd = accept(listenfd, (struct sockaddr*)NULL, NULL);
while( (n = read(listenfd, recvBuff, sizeof(recvBuff)-1)) > 0)

これに

connfd = accept(listenfd, (struct sockaddr*)NULL, NULL);
while( (n = read(connfd, recvBuff, sizeof(recvBuff)-1)) > 0)

リスニングソケットは接続のみを受け入れることができたので

于 2013-03-21T00:03:56.860 に答える