WinSock: SOCKET zu IP-Adresse?
-
DPK schrieb:
//... struct sockaddr *pFrom //... *pFrom = (struct sockaddr *) grClientAddr; // <- ? //...Weiß jemand, was ich an der markierten Stelle verkehrt mach[e]?

Ich würde denken, du castest zuerst eine socketaddr_in in eine socketaddr* (beachte: Objekt zu Pointer -> kann nich gut gehen) und dann castest du den Pointer wieder zurück in ein Objekt.
-
Danke, also wäre
*pFrom = (struct sockaddr *) &grClientAddr; // <- ?richtiger?
-
Nö, da castest du immer noch Pointer zu Objekt.
Was gehe würde, ist:*pFrom = *((struct sockaddr *) &grClientAddr);Aber ich denke, das kann man auch ein bisschen einfacher formulieren:
*pFrom = (struct sockaddr) grClientAddr;Allerdings hab Ich keine Ahnung, ob man eine sockaddr_in überhaupt in eine sockaddr casten kann.
-
Der erste Schnipsel lässt das Programm abstürzen und der zweite funktioniert so nicht, aus dem Grund, den du schon nanntest...
1>.\TSSprotect.c(68) : error C2440: 'Typumwandlung': 'sockaddr_in' kann nicht in 'sockaddr' konvertiert werdenPassiert das aber nicht in dem Beispiel in der MSDN hier?
// ... [b]sockaddr_in[/b] RecvAddr; // ... recvfrom(RecvSocket, RecvBuf, BufLen, 0, ([b]SOCKADDR *[/b])&SenderAddr, &SenderAddrSize); // ...
-
Ich habe mich in dem zitierten Quelltext vertan, es müsste eigentlich
// ... [b]sockaddr_in[/b] [i]Sender[/i]Addr; // ... recvfrom(RecvSocket, RecvBuf, BufLen, 0, ([b]SOCKADDR *[/b])&SenderAddr, &SenderAddrSize); // ...sein.
-
Hm.. offenbar muss man hier eine sockaddr_in beim IP-Protokoll an die Funktion übergeben. Aber ich sehe grade, du könntest dir den ganzen Aufwand so ersparen:
int iReturn; iReturn = OrigRecvFrom(uiSock, szBuf, iBufLen, iFlags, (struct sockaddr *) pFrom, pFromLen);
-
Dann stehe ich aber wieder am Anfang, denn ich schaffe es einfach nicht heraus zu finden, wie ich dann von pFrom auf die IP-Adresse schließen kann. Die entsprechenden Seiten in der MSDN verstehe ich nicht so recht.
-
Ev. hilft das:
sockaddr_in from = {}; int fromlen = sizeof(from); recvfrom(client, buf, len, 0, (sockaddr*)&from, &fromlen); const char* addr = inet_ntoa(from.sin_addr); printf("from ip address: %s\r\n", addr);
-
Danke, aber darauf bin ich auch schon gekommen. Sieht man ja in vielen Beispielen. Aber es klappt nicht...
1>.\TSSprotect.c(67) : error C2039: 'sin_addr': Ist kein Element von 'sockaddr' 1> C:\Program Files\Microsoft SDKs\Windows\v6.0A\include\winsock.h(485): Siehe Deklaration von 'sockaddr'Liegt wohl daran, dass ich die Funktion hooke und im Funktionskopf
int MyRecvFrom(SOCKET uiSock, char *szBuf, int iBufLen, int iFlags, struct [b]sockaddr[/b] *pFrom, int *pFromLen)steht...

-
Mir ist es zwar gelungen, den Code zu kompilieren
int MyRecvFrom(SOCKET uiSock, char *szBuf, int iBufLen, int iFlags, struct [b]sockaddr_in[/b] *pFrom, int *pFromLen), aber das Programm stürzt trotzdem an der Stelle ab, an der recvfrom aufgerufen wird...

-
bump (sorry)