(gelöst) Socket Frage, wann bekommt man ENETUNREACH ...

Dein Thema passt einfach in kein Forum? Dann probiers mal hier.
Antworten
Ritchie
Beiträge: 86
Registriert: 29. Januar 2007 19:41

(gelöst) Socket Frage, wann bekommt man ENETUNREACH ...

Beitrag von Ritchie »

Hallo Zusammen,

ich schreibe gerade einen TCP/IP Client + TCP/IP Server für das S.N.A.P Protokoll um einige Microcontroller an Linux anzubinden.

Starte ich den Server zuerst und danach den Client, arbeitet die Übertragung korrekt.

Ich habe mit folgende Situation :

1) Server wird beenden.
Client läuft in Fehler und schliesst die Verbindung.
Nach einem Neustart des Servers, bekommt der Client trotzdem die Meldung
ENETUNREACH vom Connect Kommando.

2) Server wird nach dem Client gestartet.
Der Client bekommt die Meldung ENETUNREACH vom Connect Kommando.

3) Wird nach einem der Fehler von 1 + 2 der Client beendet und nur der Client
neu gestartet, arbeitet die Verbindung wieder korrekt

Um die Meldung "Broken Wire" zu unterdrücken, verwende ich nur "sendto" und recv" Routinen, mit den entsprechendem Parameter. Das Verhalten war aber auch mit einem simplem "write" schon vorhanden.

hier der Code der Openroutine:

Code: Alles auswählen

	struct sockaddr_in 	addr;

	if( m_SocketDesc == 0)
		{
		m_SocketDesc=socket(AF_INET, SOCK_STREAM, 0);												// get a socket descriptor
		memset(&addr, 0, sizeof(addr));																						// clear the address
		addr.sin_family = AF_INET;																									// set up IP Address
		addr.sin_addr.s_addr =inet_addr(m_ServerIPAdress);
		addr.sin_port = htons(m_IPPort);																						// Set up the Port of the comunication
		if(connect(m_SocketDesc, (struct sockaddr*)&addr, sizeof(addr))==-1) 
			{
			qDebug() << "Socket Desc.:"  << m_SocketDesc << "Error no. "  << errno;
			close(m_SocketDesc);
			
			m_SocketDesc=0;
			sleep(5);
			return		1;
			}
		}

	int opt=1;
	setsockopt(m_SocketDesc, SOL_SOCKET, SO_KEEPALIVE, &opt, 4);
hier der Code der Close Routine

Code: Alles auswählen

	if( m_SocketDesc != 0)																											// Close only if a descriptor exists
		{
		shutdown(m_SocketDesc,SHUT_RDWR );

		if( close(m_SocketDesc) == 0 )
			m_SocketDesc=0;
		}

Bin für jeden Hinweis zu haben.

Hinweis: Ich habe die Routinen bewusst ohne QT geschrieben, da ich die gleichen Routinen in einem Embedded System verwenden wollte.

Oder bekomme ich ein Problem, wenn ich in einem Teil des Programms QTCPSocket Funktionen verwende und in einem bestimmten Bereich (SNAP Protokoll Treiber), diese "raw" Funktionen verwende.


Edit:
Ich konnte die eigentliche Ursache nicht finden, jedoch habe ich den QT Programmteil jetzt auch über QTCPSocket geschrieben. Den Server habe ich jetzt als Threaded geschrieben. Die Beispiele, welche ich aus einem Buch hatte, waren wohl nicht der Hit.

Jetzt arbeitet das Programm so wie ich mir das vorstelle.

Gruss R.
Antworten