2017-02-01 9 views
0

クライアントを作成してサーバーに接続します。私はクライアントプロセスがサーバーの前に実行されることを知っているので、受け入れられるまで無限ループで接続を行います。次に、クライアントにメッセージを入力してサーバーに送信して、画面に表示します。コードからすべてのエラー検出を削除して短くしましたが、そこにいなければなりません。私はこのようにしようとしていますが、サーバーは何も受信せず、クライアントは2番目の接続を行うことができません。C posixソケット、クライアントからサーバーにデータを送信できません

サーバー

int main(int argc, char *argv[]) 
{ 
    int sockfd, newsockfd; 
    socklen_t clilen; 
    char buffer[256]; 
    struct sockaddr_in serv_addr, cli_addr; 
    sockfd = socket(AF_INET, SOCK_STREAM, 0); 
    serv_addr.sin_family = AF_INET; 
    serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); 
    serv_addr.sin_port = htons(5000); 
    bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)); 
    listen(sockfd, 5); 
    clilen = sizeof(cli_addr); 
    while (newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr,&clilen) >= 0) 
    { 
     read(newsockfd, buffer, 255); 
     close(newsockfd); 
    } 
    close(sockfd); 
    return 0; 
} 

クライアント

int main(int argc, char *argv[]) 
    { 
    int sockfd; 
    struct sockaddr_in serv_addr; 

    char buffer[256]; 
    sockfd = socket(AF_INET, SOCK_STREAM, 0); 
    serv_addr.sin_family = AF_INET; 
    serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); 
    serv_addr.sin_port = htons(5000); 
    while (1) { 
     while ((connect(sockfd,(struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0)) { 
      printf("trying to connect\n"); 
      sleep(1); 
     } 
     printf("connected\nplease, enter a message\n"); 
     scanf("%s", buffer); 
     write(sockfd, buffer, strlen(buffer)); 
    } 
    close(sockfd); 
    return 0; 
} 
+0

'connect()'が失敗すると、同じソケットで再び呼び出すことができるという保証はありません。通常、それぞれの 'connect()'試みでソケットを破壊して再作成するのが最善です。しかし、いったん 'connect()'が成功すると、クライアントは次のループの繰り返しで 'connect()'をもう一度呼び出す前に、接続されたソケットを閉じていません。 –

+0

コードからすべてのエラー処理を削除すると、どうすればそのエラーをデバッグできると思われますか?これは合理的な戦略ではありません。また、エラーコードを提供するまでは答えることのできない質問ですが、エラー処理を取り消すまでは実行できません。それまではエラーコードがないことを証明することはできません。 – EJP

答えて

2

私はあなたのコードをコンパイルしただけでどのように知りませんが、あなたは警告フラグを設定していた場合(-Wall gcc)この警告を受け取ったでしょう

server.c: In function ‘main’: 
server.c:33:44: warning: suggest parentheses around assignment used as truth value [-Wparentheses] 
if (newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr,&clilen) >= 0) { 

はそれで演技、私は

if (newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr,&clilen) >= 0) { 

が..私はこれ以上の追加の警告を得た

if ((newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr,&clilen)) >= 0) { 

(余分な括弧に注意してください)には、この..変更、およびサーバーがキャッチクライアントのメッセージここで

はこれをデバッグ中に私が走ったサーバーである(これは基本的にわずかな変更を加えて、あなたのコードである)

int sockfd, newsockfd; 
socklen_t clilen; 
char buffer[256]; 
int nbytes = 0; 
struct sockaddr_in serv_addr, cli_addr; 
sockfd = socket(AF_INET, SOCK_STREAM, 0); 
serv_addr.sin_family = AF_INET; 
//serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); 
serv_addr.sin_addr.s_addr = INADDR_ANY; 
serv_addr.sin_port = htons(5007); 
bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)); 


if (listen(sockfd, 5) <0) { } 

clilen = sizeof(cli_addr); 
if ((newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr,&clilen)) >= 0) { 

    while ((nbytes = read(newsockfd, buffer, sizeof(buffer)))<0) { 
     sleep(1); 
    } 

    printf("client sent: %s", buffer); 
} 
close(newsockfd); 
close(sockfd); 
return 0; 
0

もう一つの問題は、我々はソケットに、我々は同じように、クライアントに接続しないたびに作成する必要がありますということでした。

while (1) { 
    sockfd = socket(AF_INET, SOCK_STREAM, 0); 
    while ((connect(sockfd,(struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0)) { 
     printf("trying to connect\n"); 
     sleep(1); 
    } 
    printf("connected\nplease, enter a message\n"); 
    scanf("%s", buffer); 
    write(sockfd, buffer, strlen(buffer)); 
} 
+0

複数のソケットに同時に接続したい場合を除き、ソケットを1つしか使用しないでください。 また、whileループから正しく切断されていないので、ソケットを正しく閉じることができません。終了後にOSがそのポートを解放するのを待たなければならないので、テストを傷つけるでしょう – svarog

関連する問題