Listen() и accept () системный вызов
Я читал о том, как работает вызов listen и как используется аргумент backlog, приведенный в нем. Но я хочу посмотреть, как это (очередь количества отставаний ) работает на уровне ядра.
Что я уже пробовал:
/* Exicute : gcc -o server inet4_server.c ./server <portid> <networkid> */ #include <stdio.h> #include <sys/socket.h> #include <netinet/in.h> #include <string.h> #include <stdlib.h> #include <unistd.h> #define BUF_SIZE 1024 int main(int argc,char *argv[]) { int sfd,newsockfd,cli_len=0,ret,data_len; struct sockaddr_in seraddr,cliaddr; char buffer[BUF_SIZE]; char c_addr[256]; if(argc < 3) { printf("Execute it with command line arguments like:\n ./socket portid(i.e.9055) networkip(10.102.1.181)\n"); printf("Or for loop back ./socket portid(i.e.9055) networkip(0.0.0.0)\n"); return 1; } sfd=socket(AF_INET,SOCK_STREAM,0); if(sfd<0) { perror("Error in socket\n"); close(sfd); return; } printf("Socket Is Created\n"); seraddr.sin_family=AF_INET; seraddr.sin_addr.s_addr=inet_addr(argv[2]); seraddr.sin_port=htons(atoi(argv[1])); memset(seraddr.sin_zero,'\0',sizeof(seraddr.sin_zero)); if(bind(sfd,(struct sockaddr *)&seraddr,sizeof(seraddr))<0) { perror("Error in bind"); close(sfd); return; } printf("Bind Is Done\n"); listen(sfd,3); printf("Listening..........\n"); while(1) { struct sockaddr_in cliaddr; cli_len=sizeof (cliaddr); newsockfd=accept(sfd,(struct sockaddr *)&cliaddr,&cli_len); if(newsockfd<0) { perror("Error in accept\n"); exit(1); } inet_ntop(AF_INET, &(cliaddr.sin_addr), c_addr, sizeof(c_addr)); printf("COnnection from Port : %d and IP : %s\n",(int)(htons(cliaddr.sin_port)), c_addr); while(1) { memset(buffer,0,BUF_SIZE); data_len = recv(newsockfd,buffer,BUF_SIZE,0); if(data_len < 0) { perror("Error in recv()\n"); } printf("Received : %s\n",buffer); printf("Reply to client : "); fgets(buffer, BUF_SIZE, stdin); send(newsockfd,buffer,BUF_SIZE,0); } printf("Client Is Closed\n"); close(newsockfd); } close(sfd); }
CHill60
Затем запустите его и посмотрите, как он работает.
Какой у вас вопрос?