C++ sendto Sendet nicht

Tockra

Lt. Commander
Registriert
Dez. 2008
Beiträge
1.058
Hallo Leute,

ich habe mir einen kleinen Wrapper für die UDP Sockets geschrieben, der ähnlich wie die Klasse DatagramSocket in Java funktioniert.
Nun bin ich soweit, dass der Socket von einer anderen Anwendung Daten empfangen kann, habe aber aktuell ein Problem damit selbst Nachrichten raus zu schicken.
Hier mal mein Programcode:

Code:
void ClientBroadcastListener::listen() {
	while (true) {
		try {
			char buf[33];
			SOCKADDR_IN addr;
			dc.recvfrom(buf, 32, &addr);
			cout << "Message von: " << inet_ntoa(addr.sin_addr) << ":"<< addr.sin_port << " Nachricht: " << buf << endl;

			char* s = "Suck my piep";
			addr.sin_port = htons(2323); //Diese erneute Zuweisung habe ich nur zur Sicherheit gemacht.
			addr.sin_family = AF_INET; 
			addr.sin_addr.s_addr = inet_addr("192.168.178.3");
			dc.connect(addr);
			dc.sendto(s, 32);
			//dc.disconnect();
		}
		catch (Exception& e) {
			cout << e.what();
			break;
		}
	}
}

void DatagramSocket::connect(SOCKADDR_IN inetAddress) {
	this->inetAddress = inetAddress;
	port = inetAddress.sin_port;
}

void DatagramSocket::sendto(char* buf, int length) {
	cout << inet_ntoa(inetAddress.sin_addr) << endl;
	if (::sendto(s, buf, length, 0, (sockaddr *)&inetAddress, sizeof(inetAddress)) == SOCKET_ERROR) {
		throw IOException("Fehler beim Senden an die gegebene Addresse");
	}
}


Nun blockiert meine andere Anwendung die auf Port 2323 auf ein UDP Packet wartet, aber die c++ Anwendung sendet kein Paket raus. Habe mal in Wireshark geschaut und auch dort kein Paket an Port 2323 gefunden... Es wird keine IOException geworfen...

Ich verstehe nicht wirklich wo der Fehler liegt...

Gruß
T
 
Da ich ne Wrapper Klasse drum herrum geschrieben habe, fehlt das. Das wird aktuell im Konstruktor gemacht:
Code:
DatagramSocket::DatagramSocket():port(-1),bound(false) {

	if (int tmp = startWinsock() != 0) {
		throw IOException("Problem beim start von WinSock! Error: "+tmp);
	}
	
	s = socket(AF_INET, SOCK_DGRAM, 0);
	if (s == INVALID_SOCKET) {

		throw SocketErrorException("Fehler beim Socket erstellen");
	}
	
	

}
DatagramSocket::DatagramSocket(int port):DatagramSocket() {
	local_port = port;
	local_inetAddress.sin_family = AF_INET;
	local_inetAddress.sin_addr.s_addr = inet_addr("127.0.0.1");
	local_inetAddress.sin_port = htons(port);

	bind(local_inetAddress);
}

Wie gesagt, dass Empfangen funktioniert fehlerfrei.
 
Hast du mal geschaut, ob sendto() eventuell 0 zurückgibt? Laut msdn-Doku gibt das Ding ja die Anzahl der gesendeten Bytes zurück. Ich verstehe zwar im Moment nicht, wieso das Ding 0 Bytes schicken sollte, aber man sollte diese Möglichkeit zumindest in Betracht ziehen.

P.S. Dein char* buf Parameter in deiner sendto()-Methode sollte besser vom Typ const char* sein. Genau wie auch

Code:
char* s = "Suck my piep";

besser

Code:
const char* s = "Suck my piep";

sein sollte, da s auf ein String-Literal zeigt.
 
Zuletzt bearbeitet:
Danke für die Mühe, habe mein Problem gelöst. Ausnahmzweise war der Fehler nicht bei dem c++ Code, sondern beim Java Client, der das Packet empfangen sollte. Ich habe den Client mit .connect an die Broadcast Adresse gebunden und kein .disconnect gemacht, somit empfängt er nur Nachrichten, die von 255.255.255.255 kommen und verwirft scheinbar alle anderen.
Auch Wireshark hat nichts angezeigt, weil Nachrichten von 192.168.178.3 nach ...3 nicht über den Netzwerkadapter gehen, die Broadcast Nachricht die zu meinem C++ Programm gesendet wurde, wurde natürlich in Wireshark angezeigt, da diese auch über den Adapter gegangen ist, das hat bei mir für etwas Verwirrung gesorgt.
 
Zurück
Oben