3

クライアントからの入力を受け取り、サーバー上で操作を実行し、データをクライアントに書き込むプログラムを実装しました。lsコマンドは、たとえば私が選んだものです。

今、私の疑問は、

1) 入力のバイト数が非常に大きい場合は??

2) ソケットポートを介して送信できる最大データは??

client.c

int main()
{
        FILE *fp;
        int servfd, clifd;
        struct sockaddr_in servaddr;
        struct sockaddr_in cliaddr;
        int cliaddr_len;
        char str[4096], clientip[16];
        int n;

        servfd = socket(AF_INET, SOCK_STREAM, 0);
        if(servfd < 0)
        {
                perror("socket");
                exit(5);
        }

        servaddr.sin_family = AF_INET;
        servaddr.sin_port = htons(SERVPORT);
        servaddr.sin_addr.s_addr = inet_addr(SERVIP);

        if(bind(servfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0)
        {
                perror("bind");
                exit(0);
        }

        listen(servfd, 5);

        printf("Server is waiting for client connection.....\n");

        while(1)
        {
                cliaddr_len=sizeof(cliaddr);
                clifd = accept(servfd, (struct sockaddr *)&cliaddr, &cliaddr_len);

                strcpy(clientip, inet_ntoa(cliaddr.sin_addr));
                printf("Client connected: %s\n", clientip);

                if(fork() == 0)
                {
                        close(servfd);
                        while(1)
                        {
                                n = read(clifd, str, sizeof(str));
                                str[n] = 0;

                                if(strcmp(str, "end") == 0)
                                {
                                        printf("\nclient(%s) is ending session and server is waiting for new connections\n\n", clientip);
                                        break;
                                }
                                else if (strcmp(str, "ls") == 0) {
                                        system("ls >> temp.txt");
                                        fp = fopen("temp.txt", "r");
                                        fread(str, 1, 500, fp);
                                        remove("temp.txt");
                                        }
                                else
                                        printf("Received from client(%s): %s\n", clientip, str);

                                write(clifd, str, strlen(str));
                        }
                        close(clifd);
                        exit(0);
                }
                else
                {
                        close(clifd);
                }
        }
}

server.c

int main()
{
        int sockfd;
        struct sockaddr_in servaddr;
        char str[500];
        int n;

        sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

        servaddr.sin_family = AF_INET;
        servaddr.sin_port = htons(SERVPORT);
        servaddr.sin_addr.s_addr = inet_addr(SERVIP);

        if(connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0)
        {
                printf("Could not connect to server: %s\n", strerror(errno));
                exit(1);
        }

        while(1)
        {
                printf("Enter message: ");
                scanf(" %[^\n]", str);
                write(sockfd, str, strlen(str));

                if(strcmp(str, "end") == 0)
                        break;

                n  = read(sockfd, str, sizeof(str));
                str[n] = 0;
                printf("Read from server: %s\n", str);
        }

        close(sockfd);
}
4

2 に答える 2

3

Q: 入力のバイト数が非常に大きい場合はどうなりますか?? ソケットポートを介して送信できる最大データは??

A: TCP/IP ストリームのサイズに制限はありません。理論的には、無限のバイト数を送受信できます。

... でも ...

1) 受信者は、1 回の読み取りで一度にすべてのバイトを取得できると想定してはなりません。ソケット データは常にループで読み取る必要があり、一度に必要なだけ読み取り、既に読み取ったデータに追加する必要があります。

2) 一度に「大量」のデータを送信できますが、OS はそれを背後でバッファリングします。

3) それでも、OS の制限があります。たとえば、ここでは最大送信バッファ サイズは 1 048 576 バイトです。

http://publib.boulder.ibm.com/infocenter/tpfhelp/current/index.jsp?topic=%2Fcom.ibm.ztpf-ztpfdf.doc_put.cur%2Fgtpc2%2Fcpp_send.html

さらに送信する必要がある場合は、ループ内で send() を実行する必要があります。

PS:

アニッシュが推奨するように、Beej のネットワーク プログラミングのガイドを必ず確認してください。

http://beej.us/guide/bgnet/output/html/multipage/

于 2013-04-26T04:47:49.710 に答える
2

あなたの質問1については、巨大なデータが多くのパケットに分割され、OSによって内部的に行われるパケットごとに送信されます。& 1 つのパケット サイズはシステム OS によって異なります (変更できます。MTU 最大転送単位と呼ばれます)。

&あなたの質問番号2について。ソケットポートによって送信されるデータは、送信するデータを送信したい限り、無限になる可能性があります。制限はありません.!!!

于 2013-04-26T04:39:15.430 に答える