私はバークレー ソケット (インターネット ドメインと Unix ドメインの両方) を使用していますが、サーバーが要求の読み取りとクライアントへの応答の書き込みに同じソケットを使用できるかどうか疑問に思っていました。または、クライアントはリプレイを待機する別のソケットを作成し、サーバーは受信したメッセージの処理後にそれに接続する必要があります。
ところで、接続指向のソケット (ストリーム ソケット、TCP など) について話しています。
これは簡略化されたサーバー コードです (簡略化のために、ここではシステム コールのエラー チェックを省略しています)。
int main() {
int server_socket, connected_socket;
struct sockaddr_in server_addr;
char buf[1024];
char aux[256];
int bytes_read;
server_socket = socket(AF_INET, SOCK_STREAM, 0);
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = INADDR_ANY;
server_addr.sin_port = htons(1234);
bind(server_socket, &server_addr, sizeof(server_addr))
listen(server_socket, 5)
connected_sodket = accept(server_socket, 0, 0);
do {
bzero(buf, sizeof(buf));
bytes_read = read(connected_socket, buf, sizeof(buf));
} while (bytes_read > 0);
/* Here I want to use connected_socket to write the reply, can I? */
close(connected_socket);
close(server_socket);
return (EXIT_SUCCESS);
}
そして、これは単純化されたクライアント コードです (単純化するために、ここではシステム コールのエラー チェックを省略しています)。
int main() {
int client_socket;
struct sockaddr_in server_addr;
client_socket = socket(AF_INET, SOCK_STREAM, 0);
hp = gethostbyname("myhost");
server_addr.sin_family = AF_INET;
memcpy(&server_addr.sin_addr, hp->h_addr_list[0], hp->h_length);
server_addr.sin_port = htons(1234);
connect(client_socket, &server_addr, sizeof(server_addr));
write(client_socket, MSG, sizeof(MSG));
/* Here I want to wait for a response from the server using client_socket, can I? */
close(client_socket);
return (EXIT_SUCCESS);
}
connected_socket
サーバーとクライアントで使用してclient_socket
、応答メッセージを返すことはできますか? または、「受け入れる」ときにサーバーで取得したクライアントアドレスを使用して、クライアントのソケットに接続する必要がありますか?
コメントが表示されているクライアント/サーバーで読み取り/書き込みを使用してみましたが、両方のプログラムがブロックされたままになり、デッドロックのようです。
よろしくお願いします!よろしく。