WinSock Daten kommen nicht richtig an
-
Hallo Leute!
Ich habe im Moment ein sehr rätselhaftes Problem mit WinSock.
Ich möchte für ein Spiel einen Paket Filter für die Server bauen. Es gibt da bereits eine Komponente von jemandem (in C++ geschrieben), der aber nicht mehr an seinem Paket Filter weiterentwickelt und es (logischerweise) inzwischen neue Pakete gibt, die den Server abschmieren lassen.
Das zur Geschichte.Jetzt noch eine Information für euch (zur Ubersicht). Der Datenverkehr läuft normalerweise so:
Spiele Client drückt auf Login, dann kommt eine Verbindungsanfrage -> Paket Filter von Tom 94 (so heißt derjenige) Verbindungsanfrage -> Cache Server (heißt so).
Cache Server schickt Daten an Tom's Filter -> Daten werden weitergeleitet zum Client.
Client schickt Daten zu Tom's Filter -> Daten gehen von da aus zum Cache Server.Meine Komponente sitzt jetzt zwischen Tom's Filter und dem Cache Server, sähe also so aus:
Client -> Tom's Filter -> Mein Programm -> Cache Server
und umgekehrt:
Cache Server -> Mein Programm -> Tom's Filter -> ClientSo, das zur Kommunikation.
Mit Delphi habe ich diese Kombination getestet - funktioniert einwandfreiIch binde also in meinem C Programm den Socket auf den passenden Port, warte dort auf eingehende Verbindungen und baue dann eine Verbindung zum Cache Server auf. Dann werden vom Cache Server Daten verschickt, die auch beim Client ankommen, allerdings bleiben die Daten vom Client auf dem Rückweg in Tom's Filter stecken.
Wenn ich vom Client direkt auf mein Programm verbinde, kommen die Daten vom Client auch rein, es muss also irgentwie an Tom's Programm liegen, oder ich habe das falsche Datenformat -- keine Ahnung!Hier erstmal ein bisschen von meinem Code:
#include <stdio.h> #include <winsock2.h> #pragma comment( lib, "ws2_32.lib" ) #define port_pf 5600 // Port, auf den Tom's Filter verbindet #define port_cache 15400 // Port des Cache Servers #define MAX_CLIENTS 5 #define BUF_SIZE 8192 struct userliste { SOCKET client; char ip[15]; }; struct userliste userArray[MAX_CLIENTS]; int main (void) { long rc; FD_SET fdSet; int i; char sendbuf[BUF_SIZE]; char recvbuf[BUF_SIZE]; int bytesSent; int bytesRecv = SOCKET_ERROR; char sendbufCache[BUF_SIZE]; char recvbufCache[BUF_SIZE]; int bytesSentCache; int bytesRecvCache = SOCKET_ERROR; // Initialisierung WSADATA wsa; WSAStartup(MAKEWORD(2,0),&wsa); // Verbindung zum Cache Server SOCKET cacheSocket; SOCKADDR_IN cacheAddr; int cacheConnect; cacheSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); memset(&cacheAddr,0, sizeof(cacheAddr)); cacheAddr.sin_family = AF_INET; cacheAddr.sin_port = htons(port_cache); cacheAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); // Packet Filter Listen Socket erstellen SOCKET acceptSocket; acceptSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); // Packet Filter Listen Socket binden SOCKADDR_IN addr; memset(&addr,0,sizeof(SOCKADDR_IN)); addr.sin_family = AF_INET; addr.sin_port = htons(port_pf); addr.sin_addr.s_addr = INADDR_ANY; rc = bind(acceptSocket,(SOCKADDR*)&addr,sizeof(SOCKADDR_IN)); if(rc == SOCKET_ERROR) { printf("Fehler: bind(), Fehler Code: %d\n",WSAGetLastError()); return 1; } else { printf("Socket bound to port %d.", port_pf); } rc = listen(acceptSocket, MAX_CLIENTS); if (rc == SOCKET_ERROR) { printf("Server: listen(): Error listening on socket %ld.\n", WSAGetLastError()); } else { printf("Waiting for incoming connections."); } for(i=0;i<MAX_CLIENTS;i++) { userArray[i].client = INVALID_SOCKET; } while(1) { FD_ZERO(&fdSet); // Inhalt leeren FD_SET(acceptSocket,&fdSet); // Den Socket der Verbindungen annimmt hinzufügen // alle gültigen Client Sockets hinzufügen (nur die die nicht INVALID_SOCKET sind) for(i=0;i<MAX_CLIENTS;i++) { if(userArray[i].client != INVALID_SOCKET) { FD_SET(userArray[i].client,&fdSet); } } rc = select(0,&fdSet,NULL,NULL,NULL); if(rc == SOCKET_ERROR) { printf("Fehler: select, fehler code: %s\n",WSAGetLastError()); return 1; } // acceptSocket is im fd_set? => Verbindung annehmen (sofern ein Platz frei ist) if(FD_ISSET(acceptSocket,&fdSet)) { // einen freien Platz für den neuen Client suchen -> Verbindung annehmen for(i=0;i<MAX_CLIENTS;i++) { if(userArray[i].client == INVALID_SOCKET) { // Verbindung annehmen userArray[i].client = accept(acceptSocket,NULL,NULL); userArray[i].ip[i] = '\0'; printf("%d connected.", i); // Cache Verbindung aufbauen cacheConnect = connect(cacheSocket,(SOCKADDR *)&cacheAddr,sizeof(SOCKADDR_IN)); printf("Connected to Cache Server (%d)", i); while(1) { bytesRecvCache = recv(cacheSocket, recvbufCache, sizeof(recvbuf), 0); if(bytesRecvCache == 0 || bytesRecvCache == SOCKET_ERROR) { // Cache Server disconnected } else { recvbufCache[bytesRecvCache] = '\0'; strcpy(sendbufCache, recvbufCache); bytesSentCache = send(userArray[i].client, sendbufCache, strlen(sendbufCache), 0); printf("Cache Server -> Packet Filter: %s [%d Bytes]\n", recvbufCache, bytesRecvCache); break; } } // -- break; } } } // Prüfen, welche Client Sockets im fd_set sind for(i=0;i<MAX_CLIENTS;i++) { // Packet Filter -> Cache Anfragen if(userArray[i].client == INVALID_SOCKET) { continue; // ungültiger Socket, d.h. kein verbunder Client an dieser Position im Array } if(FD_ISSET(userArray[i].client,&fdSet)) { bytesRecv = recv(userArray[i].client, recvbuf, sizeof(recvbuf), 0); if(bytesRecv == 0 || bytesRecv == SOCKET_ERROR) { closesocket(userArray[i].client); // Socket schließen userArray[i].client = INVALID_SOCKET; // Platz wieder freigeben printf("%d disconnected.", i); } else { recvbuf[bytesRecv] = '\0'; printf("Bytes received: %s (%d Bytes)", recvbuf, bytesRecv); } } } } }Wenn also auf dem Server eine Verbindung kommt, wird eine Verbindung zum Cache Server aufgebaut, Daten vom Cache Server kommen an, gehen durch Tom's Filter durch, dann sollte der Client Daten zurückschicken, die aber nichtmal bei mir ankommen, also sehr wahrscheinlich in Tom's Filter stecken bleiben.
Meine Frage ist jetzt: Wie bekomme ich es hin, dass Tom's Paket Filter die Daten vom Client nicht abblockt, sondern sie durchlässt. Muss ich noch irgentwas am Programmcode ändern - oder oder oder ?!
Für einen Ansatz, wie ich das Problem lösen kann, wäre ich sehr dankbar.
Zum Abschluss bedanke ich mich noch bei allen Leuten, die sich die Mühe gemacht haben / sich die Mühe machen, diesen Thread zu lesen und sich mit meinem Problem auseinanderzusetzen.
Lieben Gruß
Gecko
-
#include <winsock2.h>Was ist denn das?

-
Was ist da der genaue Unterschied zu Winsock.h, wenn ich fragen darf? Habe bisher immer Winsock2.h benutzt, weil der Unterschied ist doch eigentlich nur, dass WinSock.h wsock32.lib benutzt und WinSock2.h die ws2_32.lib verwendet und WinSock2.h einfach WinSock.h als neue Version ist und sich die FD_Set Definitionen etc. unterscheiden.
-
mngbd wollte dich nur darauf aufmerksam machen, dass dies hier das ANSI C Forum ist und der Thread wohl im WINAPI-Forum besser aufgehoben wäre.
-
Geqoo schrieb:
Was ist da der genaue Unterschied zu Winsock.h, wenn ich fragen darf?
Ich hab keine Ahnung. Sonst weiß ich über C ganz gut bescheid, aber davon hab ich noch nie was gehört. Muss ich fleissiger sein?

-
Dieser Thread wurde von Moderator/in rüdiger aus dem Forum ANSI C in das Forum WinAPI verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Du solltest dein problem lokalisieren, ansonnsten kann dir wohl kaum einer weiterhelfen.
-
Wie lowbyte schon anmerkte, solltest du das Problem am besten erstmal genau lokalisieren. Du sagst dass der Fehler wahrscheinlich bei Toms Programm liegt, aber postest deinen Code und nicht den von Toms Programm? (Wenn ich da was falsch verstanden haben entschuldige, aber das finde ich irgendwie unlogisch^^)
Noch am Rande: Bitte Rückgabewert von WSAStartup() überprüfen

-
Ihr seit ja lustig. Ich soll Code von einem Programm posten, den ich nicht habe ?! (das Programm ist von jemand anderem) Wer lesen kann ist klar im Vorteil.
Problem ist schon gelöst, aber trotzdem danke, es lag an strlen beim Verschicken der empfangenen Daten.