I'm Learning 《Unix Network Programming:Volum I》,when I run the examples showed below and use "netstat -natp" command to check the socket status,it showed a socket with TIME_WAIT status.However according to the book ,the side choose to "close" the socket is supposed to show a status of FIN_WAIT2 rather than "TIME_WAIT" before getting the message "FIN".Im confused.
Server.c:
#include <time.h>
#include <stdio.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#include <errno.h>
int main(int argc, char **argv)
{
int listenfd,connfd;
struct sockaddr_in servaddr;
char buff[1024];
time_t ticks;
listenfd = socket(AF_INET, SOCK_STREAM,0);
if(listenfd <0)
perror("socket error");
int reuse = 1;
if (setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, (const char*)&reuse, sizeof(reuse)) < 0)
perror("setsockopt(SO_REUSEADDR) failed");
#ifdef SO_REUSEPORT
if (setsockopt(listenfd, SOL_SOCKET, SO_REUSEPORT, (const char*)&reuse, sizeof(reuse)) < 0)
perror("setsockopt(SO_REUSEPORT) failed");
#endif
memset(&servaddr,0,sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(13);
if(bind(listenfd,(const struct sockaddr *)&servaddr, sizeof(servaddr))<0)
perror("bind error\n");
if(listen(listenfd,5)<0)
perror("listen error\n");
for ( ; ; )
{
connfd = accept(listenfd,(struct sockaddr *)NULL,NULL);
if(connfd <0)
perror("accept error\n");
ticks =time(NULL);
snprintf(buff,sizeof(buff),"%.24s\r\n",ctime(&ticks));
int nwrite=write(connfd,buff,strlen(buff));
printf("Write to socket %d :%s",connfd,buff);
int closefd = close(connfd);
if(closefd <0)
perror("close error\n");
}
}
Client.c:
#include <stdio.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
int main(int argc, char **argv)
{
int sockfd,n;
char recvline[1025];
struct sockaddr_in servaddr;
if( argc !=2)
printf("usage: a.out <IPaddress>");
if(( sockfd = socket(AF_INET, SOCK_STREAM,0))<0)
perror("socket error");
memset(&servaddr,0,sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(13);
if(inet_pton(AF_INET,argv[1], &servaddr.sin_addr) <=0)
perror("inet_pton error for %s",argv[1]);
if (connect(sockfd,(const struct sockaddr*) &servaddr,sizeof(servaddr))<0)
perror("connect error");
while((n=read(sockfd,recvline,1025))>0)
{
recvline[n] = 0;
if(fputs(recvline,stdout) == EOF)
perror("fput error");
}
if(n <0)
perror("read error");
exit(0);
}
Compilation commands:
Server.c :gcc -std=c18 -O3 -Wextra -pedantic -pedantic-errors Server.c -o server
Client.c :gcc -std=c18 -O3 -Wextra -pedantic -pedantic-errors Client.c -o client
Run:
Server:sudo ./server
Client:./client 127.0.0.1 or ./client 192.168.1.1
