私はクライアントサーバーのチャットアプリケーションを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つのクライアントからサーバーに送信されるメッセージを取得する必要があります。どんな助けもありがとう。
あなたの問題とは無関係ですが、入力ストリーム( 'stdin'など)で' fflush'を呼び出すことは* undefined *であることを知っておくべきです。あなたのコードを移植可能にしたいなら、それをしないでください。また、*** gets ***を使うべきではありません。危険で、Cの標準からも削除されています。また、 ["magic number"](https://en.wikipedia.org/wiki/Magic_number_%28programming%29)の代わりに 'STDIN_FILENO'を' 0'に設定してください。 –
@Joachimありがとうございました! 'gets'の代わりに' fgets'を使うべきですか? –
はい、これが推奨代替品です。 'fgets'はバッファに改行を追加するので、それをチェックして削除する必要があります(文字列終端文字で置き換える)。 –