This TIME_WAIT status confused me

Viewed 80

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

enter image description here

0 Answers
Related