Hallo zusammen
Ich sende Daten von einem Linux PC an einen TMS320F2838D auf dem lwIP
läuft. Ich möchte erreichen, dass man den entsprechenden Linux Prozess
beenden kann und die TCP Verbindung danach schnell wiederaufbauen kann
durch einen Neustart des Linux Prozesses.
Wenn ich das nun auf meinem Rechner teste funktioniert das jeweils fünf
mal gut, d.h. ich kann den Linux Prozess mittels SIGINT beenden und die
TCP Verbindung wird korrekt geschlossen, auf Wireshark sehe ich das
entsprechende FIN-ACK-FIN-ACK Muster.
Komischerweise funktioniert es nach dem fünften Wiederaufbauversuch
nicht mehr, d.h. wenn ich den Prozess zum fünften mal Neustarte sehe ich
auf Wireshark ein `SYN` Paket an den uC aber der lwIP uC reagiert nicht
darauf.
Ich sehe kein Antwortpaket des uC und wenn ich den uC debugge wird die
entsprechende callback Routine `accept_cb` zum Akzeptieren von TCP
Verbindungen auch nicht aufgerufen.
Auf dem uC scheint jedoch immer noch ein "welcoming_socket" vorhanden zu
sein der sich im state `LISTEN` befindet (also derselbe welcoming_socket
der zuvor bereits vier mal eine TCP Verbindung ohne Probleme
entgegengenommen hat), das zeigt zumindest der Debugger an wenn ich mir
die entsprechende struct anschaue.
Ich benutze den folgenden Code zum Aufsetzen des welcoming_socket:
1 | void setupCommInterface(void){
|
2 | //create a new tcp pcb
|
3 | struct tcp_pcb* connection_pcb = tcp_new();
|
4 | //bind the pcb to the port comm_port
|
5 | err_t err=tcp_bind(connection_pcb,IP_ANY_TYPE,COMM_PORT);
|
6 | if(err!=ERR_OK){
|
7 | if(err==ERR_USE){
|
8 | while(1){}
|
9 | }
|
10 | else if(err==ERR_VAL){
|
11 | while(1){}
|
12 | }
|
13 | while(1){}
|
14 | }
|
15 |
|
16 | welcoming_socket_pcb=tcp_listen(connection_pcb);
|
17 |
|
18 | tcp_accept(welcoming_socket_pcb,accept_cb);
|
19 | }
|
Die callback Routine welche die eingehende TCP Verbindung akzeptieren
sollte ist die folgende:
1 | // TCP accept callback function is called when an incoming TCP connection on COMM_PORT is established
|
2 | err_t accept_cb(void * arg, struct tcp_pcb* new_pcb, err_t err){
|
3 | if(err==ERR_OK){
|
4 | //set the connection active flag
|
5 | connection_active=true;
|
6 | //register callback for received data
|
7 | tcp_recv(new_pcb, tcp_recvd_cb);
|
8 | return ERR_OK;
|
9 | }
|
10 | else{
|
11 | while(1){
|
12 | //wait forever to preserve debug state
|
13 | }
|
14 | }
|
15 | }
|
Gibt es da vielleicht irgendeine Socket-Option die den fünften
verbindungsaufbau unterbindet?