2016-04-07 29 views
0

私はクライアントサーバーのチャットアプリケーションを1つのサーバーと複数のクライアントシナリオで作成しようとしています。私のサーバは動作していますが、クライアントを動作させることはできません。私はrecv()かsend()のどちらを行うべきかを選択するselect()関数を使用しています。クライアントの実装のための私のコードはここにあります。Cソケット:recvと同時に送信

main() 
{ 
int sockfd; 
struct sockaddr_in serv_addr; 

int i, sent; 
char buf[100]; 
char buff[100]; 

/* 
Opening a socket 
Check whether opening is successful or not 
*/ 
if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){ 
    printf("Unable to create socket\n"); 
} 
printf("Socket created\n"); 


serv_addr.sin_family = AF_INET; 
serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); 
serv_addr.sin_port = htons(6000); 

/* 
Establish a connection with the server process 
*/ 
if((connect(sockfd, (struct socketaddr *)&serv_addr, sizeof(serv_addr)))<0){ 
    printf("Unable to connect to server\n"); 
    exit(0); 
} 

printf("Client connected\n"); 

while(1){ 

    for(i=0; i<100; i++){ 
     buf[i] = '\0'; 
     buff[i] = '\0'; 
    } 

    fd_set rfd, wfd; 
    struct timeval tv; 
    tv.tv_sec = 0; 
    tv.tv_usec = 0; 
    FD_ZERO(&rfd); 
    FD_ZERO(&wfd); 

    FD_SET(sockfd, &rfd); 
    //FD_SET(sockfd, &wfd); 
    FD_SET(0, &wfd); 

    if((select(sockfd + 1, &rfd, &wfd, NULL, &tv) < 0)) { 
     printf(" Select error \n"); 
     exit(0); 
    } 

    if(FD_ISSET(sockfd, &rfd)) { // we got data ... need to read it 
     recv(sockfd, buff, 100, 0); 
     printf("Received result from server = %s\n",buff); 
    } 

    if(FD_ISSET(0, &wfd)) { 
     fflush(stdin); 
     printf(">"); 
     gets(buf); 
     sent = send(sockfd, buf, strlen(buf) + 1, 0); 
     printf("-------------Sent %d bytes to server--------------\n", sent); 
    } 
} 
printf("----------------Closing client------------------ \n"); 
close(sockfd); 
} 

各クライアントは、チャットアプリケーションのように、1つのクライアントからサーバーに送信されるメッセージを取得する必要があります。どんな助けもありがとう。

+1

あなたの問題とは無関係ですが、入力ストリーム( 'stdin'など)で' fflush'を呼び出すことは* undefined *であることを知っておくべきです。あなたのコードを移植可能にしたいなら、それをしないでください。また、*** gets ***を使うべきではありません。危険で、Cの標準からも削除されています。また、 ["magic number"](https://en.wikipedia.org/wiki/Magic_number_%28programming%29)の代わりに 'STDIN_FILENO'を' 0'に設定してください。 –

+0

@Joachimありがとうございました! 'gets'の代わりに' fgets'を使うべきですか? –

+0

はい、これが推奨代替品です。 'fgets'はバッファに改行を追加するので、それをチェックして削除する必要があります(文字列終端文字で置き換える)。 –

答えて

2

ファイル記述子にを書き込んでください。それは意味をなさない、あなたはから読むことができるかどうかをチェックする必要があります。

つまり、読み取りセットにもSTDIN_FILENOを追加し、書き込みセットはまったく追加しないでください。

+0

ありがとう!問題を解決した –

0

私は同じ問題を数日前に持っていますが、C++にしています。私の問題は、これらのリンクを使用して解決された:

おそらくあなたがあなたの状況に適応することができますあなたが望むように、このソケットサーバは、放送を行います。それをコンパイルしようとすると、それがどのように動作するかがわかります。

助けが必要な場合は、お気軽にお問い合わせください。

+0

あなたの返信ありがとう! Joachim Pileborgの答えは私の問題を解決しましたが、あなたの返答に感謝します。 –

関連する問題