UDP recvfrom klappt nicht
-
Hallo
ich versuche nun schon vergeblich eine UDP Verbindung abzuhören.
Also ich schicke per UDP an Port 5050 ein Telegramm zu einer SPS.
Dieses Telegramm kommt an und wird korrekt verarbeitet.
Nun schickt mir die SPS eine Bestätigung (ACK).
Dies sehe ich alles im Wireshark. Die Ziel und Dest Ports passen - nur
will meine Empfangsroutiene nichts empfangen.
Die Bindung wird korrekt ausgeführt. Es kommt auch keine Fehlermeldung.
die IP ist 192.168.xxx.xxx
anbei der Code der Empfangsroutiene.
Danke für eure Ideen.UINT saia_receive(LPVOID pParam) { int nBytesRecv; char recvBuffer[80]; memset(recvBuffer, 0, sizeof(recvBuffer)); //Clear the buffer SOCKET sockRecv; SOCKADDR_IN sinRecv; sockRecv = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); sinRecv.sin_family = AF_INET; // address family Internet sinRecv.sin_port = htons (5050); //Port to connect on sinRecv.sin_addr.s_addr = htonl (INADDR_ANY); int sinlen=sizeof(sinRecv); RC=bind(sockRecv, (LPSOCKADDR)&sinRecv, sizeof(sinRecv)); if(RC==SOCKET_ERROR) { trace.Input(_T("Fehler beim binden an Port!")); POLL_SAIA=1; // beenden } else { trace.Input(_T("SAIA Polling gestartet.")); } while (POLL_SAIA==0) { nBytesRecv = recvfrom(sockRecv, recvBuffer, sizeof(recvBuffer), 0,(SOCKADDR*)&sinRecv, &sinlen); if(nBytesRecv==SOCKET_ERROR) { trace.Input(_T("Fehler beim empfangen")); } else { CString str; str.Format(_T("Empfangen %d, Bytes %d\n"), nBytesRecv); trace.Input(str); // Telegramm entschlüsseln } } AfxEndThread(0); return 0; }
-
warum benutzt du nicht eine abgeleitete Klasse von CAsyncSocket damit geht die verbindung auf jeden Fall, hab das selbst schon ne Verbindung zu 8 SPS´sen auf einmal aufgebaut
-
hm hab eben mit Winsock angefangen.
hast du mal ein Beispiel wie ich die CSocket fürs senden und empfangen benutzen muss?
Danke
-
na ich denke hier führt das etwas zu weit weil ich dir kein projekt posten kann, aber wenn du willst schreib mir ne email und ich schick dir das
-
so irgendwie bin ich echt zu blöd.
nBytesRecv zeigt mir an, dass 12 bytes angekommen sind. Das ist auch richtig so.
Kann mir bitte mal jemand sagen wie ich den recvBuffer in einen CString wandle.
oder wenigstens so, dass mir AfxMessageBox den Inhalt anzeigen kann.
Steh irgenwie auf dem Schlauch.
CString str=recvBuffer sollte doch gehen ist aber immer leer der CString.
Danke Holger
-
zu blöd - im Puffer stehe nun mal nur HEX Werte - die direkt anzuzeigen geht natürlich nicht. Habe die Hex char Werte 1:1 in Hex CStrigns gewandelt - nun ist alles schick.
Holger