2017-05-10 109 views
0

我正在C中進行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

請詳細說明這個問題。 「cicle」是什麼?顯示樣本數據等。另請參閱https://stackoverflow.com/help/mcve – handle

+0

這是用於(i = 0; i Pipox

回答

0

在讀通話時,您可能會得到全部或部分的字符串,你提到的(4 11 21 9 11)

每個之後讀叫你需要分析你接收到的數據,請檢查您是否得到了整個字符串或部分一個,如果你得到部分文章,再讀一遍以獲得其他數據。 後你確認你有完整的數據,你必須要先調用write送4回客戶端

然後回來閱讀再次調用

相關問題