2017-04-17 8 views
1

シンプルなtcp server-clientを作成しようとしています。クライアントがサーバーにデータを送信しても、サーバーが応答しようとすると、接続全体がハングしても、プログラムは正常に機能します。私はwrite()/ read()関数を使用しています。サーバtcpから読み返そうとするとクライアントがハングする

Serverコード:

#include <stdio.h> 
#include <stdlib.h> 
#include <netdb.h> 
#include <netinet/in.h> 
#include <string.h> 
#include <stdbool.h> 

#define SIZE 700000000 


/////////////////////////////////////////////////////////////////////////// 


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


    int sockfd, newsockfd, portno, clilen; 
    char buffer[256]; 
    struct sockaddr_in serv_addr, cli_addr; 
    int n; 


    /* First call to socket() function */ 
    sockfd = socket(AF_INET, SOCK_STREAM, 0); 

    if (sockfd < 0) { 
    perror("ERROR opening socket"); 
    exit(1); 
    } 

    bzero((char *) &serv_addr, sizeof(serv_addr)); 
    portno = 5001; 

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



    if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) { 
    perror("ERROR on binding"); 
    exit(1); 
    } 

    listen(sockfd, 10); 
    clilen = sizeof(cli_addr); 

    /* Accept actual connection from the client */ 
    newsockfd = accept(sockfd, (struct sockaddr *)&cli_addr, &clilen); 

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


    bzero(buffer, 255); 

    int readbyte = 0; 

    do { 

    readbyte = read(newsockfd, buffer, 1024); 

    if (readbyte < 0) 
    { 
     perror("ERROR on reading socket!"); 
     break; 
    } 
    if (readbyte > 0) 
    { 
     //printf("Here is the message: %s\n",buffer); 
    } 


    } while (readbyte > 0); /* until EOF */ 



    int writen = write(newsockfd, "I received your message", strlen("I received your message") + 1); 

    if (writen<0){ 
    perror("Error"); 
    } 

    //debug(); 

    return 0; 
} 

クライアントコード:

#include <stdio.h> 
#include <stdlib.h> 

#include <netdb.h> 
#include <netinet/in.h> 

#include <string.h> 

////////////////////////////////////////////////////////////////// 


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

    int sockfd, portno, n; 
    struct sockaddr_in serv_addr; 
    struct hostent *server; 
    int mode; 
    char *code; 
    char buffer[256]; 
    char *uptr = buffer; 
    int i; 




    if (argc < 3) { 
    fprintf(stderr, "Use: %s [hostname] [port] [args]\n", argv[1]); 
    exit(0); 
    } 

    portno = atoi(argv[2]); 


    /* Create a socket point */ 
    sockfd = socket(AF_INET, SOCK_STREAM, 0); 

    if (sockfd < 0) { 
    perror("ERROR opening socket"); 
    exit(1); 
    } 

    server = gethostbyname(argv[1]); 

    if (server == NULL) { 
    fprintf(stderr, "ERROR, no such host\n"); 
    exit(0); 
    } 

    bzero((char *) &serv_addr, sizeof(serv_addr)); 
    serv_addr.sin_family = AF_INET; 
    bcopy((char *)server->h_addr, (char *)&serv_addr.sin_addr.s_addr, server->h_length); 
    serv_addr.sin_port = htons(portno); 

    int sock_et = connect(sockfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr); 

    /* Now connect to the server */ 
    if (sock_et < 0) { 
    perror("ERROR connecting"); 
    exit(1); 
    } 
/* some code... */ 

while (len > 0) { 

    int writen = write(sockfd, buf, len + 1); 

    if (writen < 0) 
    { 
     printf("Error writting to socket!\n"); 
     break; 
    } 

    len -= writen; 
    buf += writen; /* tricky pointer arythmetic */ 

    } 

printf("Finished writing to server\n"); 
    bzero(buffer, 256); 
    int readbyte; 

do { 

    readbyte = read(sock_et, buffer, 1024); 

    if (readbyte < 0) 
    { 
     perror("ERROR on reading socket!"); 
     break; 
    } 
    if (readbyte > 0) 
    { 
     //printf("Here is the message: %s\n",buffer); 
    } 


    } while (readbyte > 0); /* until EOF */ 

    printf("%s\n",buffer); 




    close(sockfd); 


    return 0; 
} 

任意の助けをいただければ幸いです!ありがとう!

+0

サーバとクライアントの両方で256バイトのバッファを持っていますが、そのバッファに1024バイトを読み込めることを 'read'に伝えます。遅かれ早かれバッファオーバーフローと*未定義の動作*につながり、おそらく本当に悪いことが起きます。 –

+0

あなたは正しく気づかれていません!ありがとうたくさん:) –

+0

@Someprogrammerdude私はそれを変更しましたが、まだハングアップしています –

答えて

0
  1. あなたのクライアントコードは、ソケットは(クライアントまたはサーバのいずれかで)開いている間は、読み取りから0(EOF)を取得するつもりはありません
  2. をコンパイルしていない - そう直後breakを追加今は成功した読書。
  3. あなたは、クライアントでは、サーバ
  4. でソケットをクローズしていない、あなたはsockfdから読み取る必要がある、ないsock_et

他の問題は、おそらくあります。ここからclient.c/server.cを使用しようとしているようです:http://www.linuxhowtos.org/C_C++/socket.htm

これらのファイルを使用するとうまくいきます。だから彼らから始めて、より慎重に変更を適用してください。

関連する問題