2017-05-10 12 views
0

クライアントではTCPクライアント/サーバ通信を行っています。クライアントはデータ数(6以上ではない)を取得し、データを取得してこのような単一文字列のメッセージ:4 11 21 9 11.
4はデータの数であり、11,21,9,11はデータです。複数の数字で一意の文字列を送信するクライアント/サーバTCP

次に、サーバーはメッセージを読み取って印刷し、受信したデータ数をクライアントに送信する必要があります(4)。

私はクライアントのためにこれを試してみました:

#include <stdio.h>  
#include <sys/types.h> 
#include <sys/socket.h> 
#include <netdb.h> 
#include <stdlib.h> 
#include <string.h> 
#include <unistd.h> 
#include <arpa/inet.h> 




int main(int argc, char *argv[]) { 

    int simpleSocket = 0; 
    int simplePort = 0; 
    int returnStatus= 0; 
    char buffsend[256]; 
    char buffrecv[256]; 
    int n, i; 
    struct sockaddr_in simpleServer; 

    if (3 != argc) { 

     fprintf(stderr, "Usage: %s <server> <port>\n", argv[0]); 
     exit(1); 

    } 

    /* create a streaming socket  */ 
    simpleSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 

    if (simpleSocket == -1) { 

     fprintf(stderr, "Could not create a socket!\n"); 
     exit(1); 

    } 
    else { 
     fprintf(stderr, "Socket created!\n"); 
    } 

    /* retrieve the port number for connecting */ 
    simplePort = atoi(argv[2]); 

    /* setup the address structure */ 
    /* use the IP address sent as an argument for the server address */ 
    //bzero(&simpleServer, sizeof(simpleServer)); 
    memset(&simpleServer, '\0', sizeof(simpleServer)); 
    simpleServer.sin_family = AF_INET; 
    //inet_addr(argv[2], &simpleServer.sin_addr.s_addr); 
    simpleServer.sin_addr.s_addr=inet_addr(argv[1]); 
    simpleServer.sin_port = htons(simplePort); 

    /* connect to the address and port with our socket */ 
    returnStatus = connect(simpleSocket, (struct sockaddr *)&simpleServer, sizeof(simpleServer)); 

    if (returnStatus == 0) { 
     fprintf(stderr, "Connect successful!\n"); 
    } 
    else { 
     fprintf(stderr, "Could not connect to address!\n"); 
    close(simpleSocket); 
    exit(1); 
    } 





    /* get the message from the server */ 



     do { 

     printf("get numb of data or terminate(write '0'): "); 
     fgets(buffsend,256,stdin); 
     n=atoi(buffsend); 
     if(n>6) { 
      printf("Error\n"); 

     } 
     else { 
       for(i=0;i<n;i++) { 
        printf("insert number: "); 
        fgets(buffsend,256,stdin); 
        write(simpleSocket, buffsend, strlen(buffsend)+1); 


     } 



    } while((n!=0) && (n>0)); 





    close(simpleSocket); 
    return 0; 

} 

そして、これは、サーバーのために:

#include <stdio.h>  
#include <sys/types.h> 
#include <sys/socket.h> 
#include <netdb.h> 
#include <stdlib.h> 
#include <string.h> 
#include <unistd.h> 

int main(int argc, char *argv[]) { 

    int simpleSocket = 0; 
    int simplePort = 0; 
    int returnStatus = 0; 
    char buff[256]; 
    char message[256]; 
    int count; 

    struct sockaddr_in simpleServer; 

    if (2 != argc) { 

     fprintf(stderr, "Usage: %s <port>\n", argv[0]); 
     exit(1); 

    } 

    simpleSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 

    if (simpleSocket == -1) { 

     fprintf(stderr, "Could not create a socket!\n"); 
     exit(1); 

    } 
    else { 
     fprintf(stderr, "Socket created!\n"); 
    } 

    /* retrieve the port number for listening */ 
    simplePort = atoi(argv[1]); 

    /* setup the address structure */ 
    /* use INADDR_ANY to bind to all local addresses */ 
    memset(&simpleServer, '\0', sizeof(simpleServer)); 
    simpleServer.sin_family = AF_INET; 
    simpleServer.sin_addr.s_addr = htonl(INADDR_ANY); 
    simpleServer.sin_port = htons(simplePort); 

    /* bind to the address and port with our socket */ 
    returnStatus = bind(simpleSocket,(struct sockaddr *)&simpleServer,sizeof(simpleServer)); 

    if (returnStatus == 0) { 
     fprintf(stderr, "Bind completed!\n"); 
    } 
    else { 
     fprintf(stderr, "Could not bind to address!\n"); 
    close(simpleSocket); 
    exit(1); 
    } 

    /* lets listen on the socket for connections  */ 
    returnStatus = listen(simpleSocket, 5); 

    if (returnStatus == -1) { 
     fprintf(stderr, "Cannot listen on socket!\n"); 
    close(simpleSocket); 
     exit(1); 
    } 

    while (1) 

    { 

     struct sockaddr_in clientName = { 0 }; 
    int simpleChildSocket = 0; 
    int clientNameLength = sizeof(clientName); 

    /* wait here */ 

     simpleChildSocket = accept(simpleSocket,(struct sockaddr *)&clientName, &clientNameLength); 

    if (simpleChildSocket == -1) { 

      fprintf(stderr, "Cannot accept connections!\n"); 
     close(simpleSocket); 
     exit(1); 

    } 

     /* handle the new connection request */ 
    /* write out our message to the client */ 


     while(read(simpleChildSocket, buff, 256)) 
      cont++; 
      printf("%s", buff); 
     printf("Data received: %d %s\n", cont, buff); 



     close(simpleChildSocket); 
    } 

    close(simpleSocket); 
    return 0; 

} 

問題は毎回、私は番号を挿入するのでcicle「のために」は、サーバのバッファが空にされています受信した最後の番号のみを出力します。 この問題を解決していただきありがとうございます。

+0

を呼び出す読み取るために戻って取得次に、あなたのクライアントに

を4を送信するために書き込みを呼び出す必要があり、問題を詳しく説明してください。 「サイクル」の「the」は何ですか?サンプルデータなどを表示します。また、https://stackoverflow.com/help/mcveを参照してください。 – handle

+0

これは、(i = 0; i Pipox

答えて

0

read呼び出しでは、あなたは(4 11 21 9 11)に言及した全体または一部の文字列を取得する可能性があります

それぞれは、あなたが受信したデータを解析する必要が呼び出しあなたは文字列全体または部分を持っているかどうかをチェック読んだ後1つ、部分的に1つの投稿を読んだら、もう一度読み込んで残りのデータを取得してください。 あなたが全体のデータを持って確認した後、再度

関連する問題