Winsock

july

Erfahrenes Mitglied
Hallo zusammen,

ich hab folgendes Problem. Ich hab eine Bibliothek geschrieben "Con_lib" (Sourcedateien im Anhang) und wenn ich versuch damit eine Kommunikation herzustellen klappt's anscheinend, aber sobald ich versuche eine Nachricht zu verschicken, sagt mir der Client, dass alles gut geklappt hat, aber der Server empfängt nichts und gibt die ganze Zeit Winsock 10054 Fehler zurück. Mit Wireshark hab ich am Port gesniffert und musste feststellen, dass da kein Paket verschickt wird (((
Was auch noch merkwürdig ist, dass eigentlich die Methode recv() blokierend ist und beim verschicken einer Nachricht erwarte ich, dass der Sever nur einmal den Fehlercode ausgibt, aber stattdessen läuft es ununterbrochen.
C++:
while(1)
{
	con.receive_message(&sock, msg_buf, &msg);
	cout << "server get message"<<endl;
}


Hat jemand eine Idee woran es liegen könnte? Vielen Dank im voraus.

Grüße July
 

Anhänge

  • Con_lib.zip
    2,2 KB · Aufrufe: 13
Zuletzt bearbeitet von einem Moderator:
Fehler 10054 sagt, dass die Verbindung auf der anderen Seite geschlossen wurde, daher blockiert auch recv nicht, da sofort klar ist, dass nie was empfangen wird. Wie schickst du denn Daten an den Server? Poste mal ein funktionierendes Minimalbeispiel mit Server und Client an dem man den Fehler sieht.
 
server.c

C++:
int main()
{
        int port,ret;
	unsigned long zentralenId;
	SOCKET sock;
	Connection con;
	char *msg_buf;
	message_t msg;
	cout << "Bitte geben Sie Ihre Portnr. an" << endl;
	cin>>port;
	srand ( time(NULL) );
	zentralenId = (unsigned long)rand();
	cout << "Die ZentralenID lautet:" << zentralenId <<endl;
	ret = con.con_open_server(port,&sock);
        if(ret!= 0)
	{
		return -1;
	}
	while(1)
	{
		con.receive_message(&sock, msg_buf, &msg);
       }
      return 0;
}


client.cpp

C++:
int main(){
	unsigned int auswahl, port,ret;
	SOCKET *sock;
	Connection con;
	meldung_t msg;
	message_t message;
	Meldungsgenerator mg;
	unsigned long client_id;
	//memset(&message,0,sizeof(message_t));
	cout << "Bitte geben Sie die Portnr. des Servers ein: "<< endl;
			scanf("%d", &port);
			//Die Message zusammensetzen
			message.aBit = ANFANGSBIT;
			message.chksum = CHECKSUMME;
			//message.msgId = idg.generateNewID();
			//printf("MessageId ist: %ld\n", message.msgId);
			message.clientId = client_id;
			message.receiverId = client_id;
			message.nachArt = 1;
			msg.melCode= 4;
			msg.loeschBereich =(char) rand() %20 + 1;
			msg.gruppe = (char) rand() %10 + 1;
			msg.melder = (char) rand()% 32 + 1;
			msg.meldArt = SET_MELDUNG;
			strcpy(msg.grText,"Es brennt!");
			message.message = msg;
			message.sBit = SCHLUSSBIT;
			sock = con.con_open_client(port, sock);
			ret=con.send_message(sock, client_id, &message, sizeof(message));
			if (ret<1)//sizeof(message))
			{
				cout << "Senden der Meldung ist fehlgeschlagen"<< endl;
			}
			else
			{
				cout << "Senden der Meldung an "<< message.receiverId<<" war erfolgreich."<<endl;
			}
                       con.connection_close(sock);
                       return EXIT_SUCCESS;
}
 
Zuletzt bearbeitet von einem Moderator:
Du schliesst die Verbindung sofort nach dem Senden. Das Senden wartet jedoch nicht darauf, dass du die Daten via recv empfangen hast. Wenn du einen Socket mit closesocket schliesst werden alle noch in der Warteschlange stehenden Daten entfernt und recv gibt dir dann auch den Error 10054 zurück. Pausiere testhalber mal dein Programm vor con.connection_close. Bsp:
C++:
...
Sleep(2000);
con.connection_close(sock);
 
Zurück