2011-10-03 17 views
0

私は、cでソケットを使用してTCPサーバー/クライアントを実装しようとしています。 私は、クライアントで送信したものが、exitが入力されるまで1行ずつサーバーに表示されるようにプログラムを書いています。 プログラムは動作しますが、データはすべて最後にサーバーに表示されます。誰でもコードを確認できますか? NULで終了しないようにデータが正しく送受信されない

TCPサーバ

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

main() 
{ 
    char buf[100]; 
    socklen_t len; 
    int k,sock_desc,temp_sock_desc; 
    struct sockaddr_in client,server; 

    memset(&client,0,sizeof(client)); 
    memset(&server,0,sizeof(server)); 
    sock_desc = socket(AF_INET,SOCK_STREAM,0); 
    server.sin_family = AF_INET; 
    server.sin_addr.s_addr = inet_addr("127.0.0.1"); 
    server.sin_port = 7777; 

    k = bind(sock_desc,(struct sockaddr*)&server,sizeof(server)); 
    k = listen(sock_desc,20); 
    len = sizeof(client); 
    temp_sock_desc = accept(sock_desc,(struct sockaddr*)&client,&len); 

    while(1) 
     { 
     k = recv(temp_sock_desc,buf,100,0); 
     if(strcmp(buf,"exit")==0) 
      break; 

     if(k>0) 
      printf("%s",buf); 
    } 

    close(sock_desc); 
    close(temp_sock_desc); 
    return 0; 
} 

TCPクライアント

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

main() 
{ 
    char buf[100]; 
    struct sockaddr_in client; 
    int sock_desc,k; 

    sock_desc = socket(AF_INET,SOCK_STREAM,0); 
    memset(&client,0,sizeof(client)); 
    client.sin_family = AF_INET; 
    client.sin_addr.s_addr = inet_addr("127.0.0.1"); 
    client.sin_port = 7777; 

    k = connect(sock_desc,(struct sockaddr*)&client,sizeof(client)); 

    while(1) 
     { 
     gets(buf); 
     k = send(sock_desc,buf,100,0); 

     if(strcmp(buf,"exit")==0) 
      break; 
    } 

    close(sock_desc); 
    return 0; 
} 
+0

をいくつかのより多くのインデントがいいだろう。 – ThiefMaster

+1

決して 'gets()'を使うべきではありません。代わりに 'fgets()'を使用してください。 – JeremyP

答えて

2
while(1){ 
    k = recv(temp_sock_desc,buf,100,0); 
    if(memcmp(buf,"exit", 4)==0) 
     break; 
    if(k>0) 
     printf("%*.*s", k, k, buf); 
} 

のrecv()の結果は、文字列ではありません。 上記の「修正」は完全に正しいわけではありませんが、正しい方向に向けることを目的としています。

+0

+1質問を編集して時間を無駄にしている間に、誰かが回答を提供することになります – Dialecticus

+0

重複を探すのに時間がかかる可能性がありました;-) – wildplasser

+0

なぜそれがヌル終了しませんか? gets(buf)は文字列の最後に0を書き込み、send(...、...、100)は末尾のゼロを含むバッファ全体を送出します。 – blaze

1

gets()は改行改行を '\ 0'に置き換えます。結果の文字列はサーバーに送られ、サーバーはstdoutに書き込みます。 stdoutはバッファリングされているので、プログラムが終了するか '\ n'が表示されるまで何も画面に表示されません。

は '\ n' はあなたのprintfに追加します。

if(k>0) 
    printf("%s\n",buf); 
関連する問題