2012-02-04 10 views
0

私はネットワークプログラミングに慣れていないので、ソケットAPIを使用する小さなプログラムを作成することでこれを学習しています。現在、私は単純なエコーサーバを作成しています。これは、フォークを使用して接続要求を取得するとすぐにフォークを使用して、前のバージョンの反復のように追加されます。サーバ(here)。しかし、サーバーを起動してクライアントを起動し、コンソールにメッセージを入力すると、予期せず終了します。 Gdbの下でプログラムを実行すると、SIGPIPEが配信されたことが示されます。しかし、ソケットがまだ有効であることを知る限り、SIGPIPEは発生してはいけません。関係するあらゆる種類の助けに感謝します。ここ は、ここでクライアントコードTCPベースの同時エコークイントサーバでSIGPIPEエラーが発生しました。

#include <stdio.h> 
#include <stdlib.h> 
#include <sys/socket.h> 
#include <sys/types.h> 
#include <netinet/in.h> 
#include <string.h> 

#define MAXCOUNT 1024 

int main(int argc, char* argv[]) 
{ 
    int sfd,i; 
    struct sockaddr_in saddr; 
    char buff[MAXCOUNT]; 
    char mesg[MAXCOUNT]; 
    sfd = socket(AF_INET,SOCK_STREAM,0); 
    memset(&saddr,0,sizeof(saddr)); 
    saddr.sin_family = AF_INET; 
    inet_pton(AF_INET,"127.0.0.1",&saddr.sin_addr); 
    saddr.sin_port = htons(5008); 
    connect(sfd,(struct sockaddr*) &saddr,sizeof(saddr)); 
    fgets(buff,MAXCOUNT,stdin); 
    send(sfd,buff,strlen(buff),0); 
    if (recv(sfd,mesg,MAXCOUNT,0) == -1) { 
     perror("Nothing to read\n"); 
     exit(1); 
    } 
    printf("%s\n",mesg); 
    exit(0);  
} 

あるサーバコードは%s書式指定子は、Cスタイルの文字列ではなく、任意のデータです

#include <stdio.h> 
#include <stdlib.h> 
#include <sys/socket.h> 
#include <sys/types.h> 
#include <netinet/in.h> 
#include <string.h> 

#define MAXCOUNT 1024 

int main(int argc, char* argv[]) 
{ 
    int sfd,nsfd,cn; 
    pid_t c; 
    char buf[MAXCOUNT]; 
    socklen_t clen; 
    struct sockaddr_in caddr,saddr; 

    sfd = socket(AF_INET,SOCK_STREAM,0); 
    memset(&saddr,0,sizeof(saddr)); 
    saddr.sin_family = AF_INET; 
    saddr.sin_addr.s_addr = htonl(INADDR_LOOPBACK); 
    saddr.sin_port = htons(5008); 

    bind(sfd,(struct sockaddr*) &saddr,0); 

    listen(sfd,2); 
    for (; ;) { 
     clen = sizeof(caddr); 
     nsfd = accept(sfd,(struct sockaddr*) &caddr, &clen); 
     if((c = fork()) == 0) { 
      close(sfd); 
      memset(buf,0,sizeof(buf)); 
      cn = recv(nsfd,buf,sizeof(buf),0); 
      if (cn == 0) { 
       perror("Reading from the client socket failed\n PROGRAM CRASH :\n"); 
       exit(1); 
      } 
      buf[cn] = '\0'; 
      send(nsfd,buf,strlen(buf),0); 
      close(nsfd); 
      exit(0); 
     } 
    } 
    return 0; 
} 

答えて

0
send(sfd,buff,strlen(buff),0); 
if (recv(sfd,mesg,MAXCOUNT,0) == -1) { 
    perror("Nothing to read\n"); 
    exit(1); 
} 
printf("%s\n",mesg); 

です。そして戻り値をrecvから捨てるので、あなたは何バイトのバイト数を知ることができません。

また、クライアントはソケットを正常にシャットダウンしたり、サーバーが送信できるすべてのデータを受信して​​いないことを確認します。したがって、異常終了を引き起こしている可能性があります。サーバーは送信が完了したときに接続を閉じます。したがって、クライアントは、接続が閉じられたことを検出するまで受信を試行し続ける必要があります。

関連する問題