ソケットを作成し、接続を受け入れようとしています。すべて正常に動作します。しかし、出力は、次のコードがどのように機能するかについて私を混乱させています。
// this a server program
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#include <sys/stat.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <sys/un.h>
#include <arpa/inet.h>
#include <errno.h>
#include <wait.h>
#define LISTENQ (1024)
int main(void) {
int lstn_sock, conn_sock;
struct sockaddr_in my_serv;
short int pnum = 4080;
// create listening socket
if( (lstn_sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
printf("Error (socket): %s\n",strerror(errno));
exit(1);
}
// initialize socket address
memset( &my_serv, 0, sizeof(my_serv) );
my_serv.sin_family = AF_INET;
my_serv.sin_addr.s_addr = INADDR_ANY;
my_serv.sin_port = htons(pnum);
// associate address with socket.
if( bind(lstn_sock, (struct sockaddr *) &my_serv, sizeof(my_serv)) < 0){
printf("Error (bind): %s\n",strerror(errno));
exit(1);
}
//printf("lstn_sock: %d\n",lstn_sock);
// start listening to socket
if( listen(lstn_sock, LISTENQ) < 0){
printf("Error (listen): %s\n",strerror(errno));
exit(1);
}
// make it a daemon
while(1){
// retrieve connect request and connect
if( (conn_sock = accept(lstn_sock, NULL, NULL)) < 0){
printf("Error (accept): %s\n",strerror(errno));
exit(1);
}
printf("The server says hi!\n");
// close connected socket
if( close(conn_sock) < 0){
printf("Error (close): %s\n",strerror(errno));
exit(1);
}
}
return 0;
}
@ubuntu:$ ./my_code & @ubuntu:$ telnet localhost 4080
以下は、上記のコードからの 2 つの異なる出力です。
Output1
Trying ::1...
Trying 127.0.0.1..
localhost に接続されています。
エスケープ文字は「^]」です。
サーバーがこんにちは!
接続は外部ホストによって閉じられました。
Output2
Trying ::1...
Trying 127.0.0.1..
サーバーからこんにちは!
ローカルホストに接続しました。
エスケープ文字は「^]」です。
接続は外部ホストによって閉じられました。
「サーバーがこんにちは!」という動きの理由を誰か説明してください。
出力で。