2016-03-12 16 views
6

Ho scritto un codice client client per capire gli stati TCP. Codice Cliente:Alcuni stati TCP non visualizzati nel terminale

#include <stdio.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <string.h> 

int main(){ 
int clientSocket; 
char buffer[1024]; 
struct sockaddr_in serverAddr; 
socklen_t addr_size; 

/*---- Create the socket. The three arguments are: ----*/ 
/* 1) Internet domain 2) Stream socket 3) Default protocol (TCP in this case) */ 
clientSocket = socket(PF_INET, SOCK_STREAM, 0); 

/*---- Configure settings of the server address struct ----*/ 
/* Address family = Internet */ 
serverAddr.sin_family = AF_INET; 
/* Set port number, using htons function to use proper byte order */ 
serverAddr.sin_port = htons(7891); 
/* Set IP address to localhost */ 
serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); 
/* Set all bits of the padding field to 0 */ 
memset(serverAddr.sin_zero, '\0', sizeof serverAddr.sin_zero); 

/*---- Connect the socket to the server using the address struct ----*/ 
addr_size = sizeof serverAddr; 
connect(clientSocket, (struct sockaddr *) &serverAddr, addr_size); 

/*---- Read the message from the server into the buffer ----*/ 
recv(clientSocket, buffer, 1024, 0); 

/*---- Print the received message ----*/ 
printf("Data received: %s",buffer); 

return 0; 
} 

Codice Server:

/****************** SERVER CODE ****************/ 

#include <stdio.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <string.h> 

int main(){ 
int welcomeSocket, newSocket; 
char buffer[1024]; 
struct sockaddr_in serverAddr; 
struct sockaddr_storage serverStorage; 
socklen_t addr_size; 
welcomeSocket = socket(PF_INET, SOCK_STREAM, 0); 
serverAddr.sin_family = AF_INET; 
serverAddr.sin_port = htons(7891); 
serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); 
memset(serverAddr.sin_zero, '\0', sizeof serverAddr.sin_zero); 

bind(welcomeSocket, (struct sockaddr *) &serverAddr, sizeof(serverAddr)); 

if(listen(welcomeSocket,5)==0) 
printf("Listening\n"); 
else 
    printf("Error\n"); 

addr_size = sizeof serverStorage; 
newSocket = accept(welcomeSocket, (struct sockaddr *) &serverStorage, &addr_size); 

strcpy(buffer,"Hello World\n"); 
send(newSocket,buffer,13,0); 

return 0; 
} 

Sono in esecuzione il comando netstat -an | grep 7891, così in vari punti del tempo, io sono sempre stati stabiliti, ASCOLTO, FINWAIT2, CLOSE_WAIT e TIME_WAIT. Come ottenere gli altri stati come SYN_RECV, SYN_SENT, FINWAIT1, CLOSING e LAST ACK.

Ho provato con varie opzioni di netstat e opzioni ss ma non invano.

+0

wireshark è il vostro migliore amico per l'apprendimento delle sequenze di trasferimento dei pacchetti. Cattura il traffico tra host e client solo per TCP e puoi osservare l'intera stretta di mano, trasferire e chiudere la sequenza a tuo piacimento. – user5976242

risposta

5

Non vedi SYN_RECV, SYN_SENT e altro, perché queste fasi sono troppo brevi. Ad esempio, quando dopo aver completato con successo accept() sul lato server, ESTABLISHED, tutti gli stati precedenti verranno eseguiti rapidamente dallo stack TCP. Quindi, stai guardando solo gli stati lunghi delle connessioni TCP.

È possibile raggiungere gli stati SYN_ * simulando SYN-flood: utilizzare il parametro backlog per listen(...,1) sul lato server e attendere prima di return 0. E prova a lanciare diversi client separati. Come risultato otterrete: 1 in ETSABLISHED e diversi negli stati SYN_ *.

Informazioni sugli stati di finalizzazione. Dovresti chiamare shutdown() e close() e impostare il sonno anche tra di loro. Vi consiglio di utilizzare fork() per rendere il processo figlio e utilizzare le primitive di sincronizzazione per comprendere gli stati TCP

Problemi correlati