私はクライアントとサーバーのプログラムを構築しています。以下は、サーバー側のメイン関数でソケットを参照するコードです。
listenfd = socket(AF_INET, SOCK_STREAM, 0);
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
serv_addr.sin_port = htons(5000);
bind(listenfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
listen(listenfd, 10);
pthread_t thread[10];
while(1)
{
connfd[i] = accept(listenfd, (struct sockaddr*)NULL, NULL);
//I WANT TO GET THE IP ADDRESS HERE
if( pthread_create(&thread[i], NULL, listener, NULL ) != 0 )
{
printf("Cannot create thread , exiting \n ");
exit(-1);
}
i++;
}
スレッドは次のとおりです。
void * listener( void * temp_pt )
{
int connfdLocal=connfd[i];
while ( (n = read(connfdLocal, recvBuff, sizeof(recvBuff)-1)) > 0)
{
printf("TESTING LISTENER");
write(connfdLocal, "TEST", strlen("TEST"));
}
if(n <= 0)
{
printf("\n Connection lost \n");
close(connfdLocal);
return 0;
}
}
さて、私は3つの質問があります:
何らかの理由で、クライアントとの接続が閉じられるまでスレッドが「TESTING LISTENER」を出力しないため、クライアント側で接続を閉じる必要があります。同様に、文字列「TEST」がクライアントに送信されるのは、サーバー上の接続を閉じるまでではありません。なぜこうなった?どうすれば修正できますか?
接続が確立された後にクライアントの IP アドレスを取得する方法はありますか? 「ここでIPアドレスを取得したい」と入力したところ
クライアント側でソケットが閉じられたときに「n」がすぐに0になるのはどうしてですか? read 関数は 1 回だけ実行され、n 値は 1 回だけ設定されていると思いました。