そもそも、この仕事はプログラマーとして\ c ++で提供されました。 割り当てはトピックの名前です。
彼はインターネットに乗って、すべてがチャットとクライアント/サーバー通信でいっぱいでしたが、悲しいかな、私は同様のタスクを持つコードを見つけませんでした。 ECHOクライアントサーバーのようなプリミティブがありました。これを基礎として使用することにしました。
これが私たちのクライアントです:
struct sockaddr_in addr;
これはサーバーコードです。
if( (master_socket = socket(AF_INET , SOCK_STREAM , 0)) == 0) { perror("socket failed"); exit(EXIT_FAILURE); }
このすべての後、クライアントは送信または書き込み機能を使用してサーバーにメッセージを送信し、サーバー側でメッセージを受け入れ、読み取りおよび送信機能を使用してクライアントに送信する必要があります。
一般に、送信関数と受信関数にはさまざまな機能があります。たとえば、sendとrecvは確認フラグをメッセージとともに送信します。読み取りおよび書き込み機能は確認を必要としません。つまり、送信時にメッセージがバイトを失う可能性があり、これは修正されません。
ソケットは二重であり、クライアントとサーバー間の接続を作成するため、接続されている他のソケットからメッセージを書き込むことはできないため、サーバーに接続されているすべてのアクティブなソケットを含む配列を作成する必要があります。 そしてもう1つの発言が非常に重要です。
複数のソケット間で通信するには、選択機能を使用する必要があります。選択機能は、リストからソケットを選択してメッセージを送信するなど、記録されたすべてのソケットが終了するまで続けます。
その後、接続されたソケットの正しい値がソケット配列に書き込まれ、メッセージを送信するときにそれらをソートするためだけに残ります。
sd = client_socket[i]; if (FD_ISSET( sd , &readfds)) {
これらすべてを関数に書き込み、個別のストリームを作成します。
void *server(void *); pthread_create(&threadA[0], NULL, server, NULL); pthread_join(threadA[0], NULL);
クライアントについては、ソケットの読み取りと書き込みのために2つの異なるストリームを作成する必要があります。
void *write(void *); void *read(void *); pthread_create(&threadA[0], NULL, write, NULL); pthread_create(&threadA[1], NULL, read, NULL); pthread_join(threadA[1], NULL); pthread_join(threadA[0], NULL); void *write (void *dummyPt) { for(;;) { char s[BUF_SIZE]; cout << "<----"; bzero(s, BUF_SIZE + 1); cin.getline(s, BUF_SIZE); send(sock, s, strlen(s), 0); } close(sock); } void *read (void *dummyPt) { char test[BUF_SIZE]; bzero(test, BUF_SIZE + 1); bool loop = false; while(!loop) { bzero(test, BUF_SIZE + 1); int rc = read(sock, test, BUF_SIZE); if ( rc > 0) { string tester (test); cout << ": "<< tester << endl; if(tester == "exit_server") break; } } cout << "\nClosing thread and conn" << endl; close(sock); }
これですべてが機能します。 写真を撮ってくれてありがとう。 これが、私がクライアント/サーバーを作成しようとしたが、ネットワーク上で必要な情報を見つけることができなかった人にとって有用であることを願っています。