WINSOCKETS
-
Hi, entschuldigt meine karge Frage aber ich versteh einfach nichts mehr..
1000 mal gemacht und jetzt geht nichts mehr..WSAGetLastError liefert totalen quatsch..
auf Windows XP -> 4198780
auf Windows 7 -> 20713852WARUM GEHT DAS NICHT?^^
Ich hoffe (bete schon fast..) dass bei euch der Groschen fällt

#include <stdlib.h> #include <stdio.h> #include <windows.h> #include <winsock.h> #pragma comment(lib,"Ws2_32.lib") int WinsockStartup(void) { WSADATA wsa; return WSAStartup(MAKEWORD(2,0),&wsa); } int main() { int mainSocket; int clientSocket; int port = 12345; struct sockaddr_in addr; int addr_size = sizeof(addr); char buffer[1024]; WinsockStartup(); if(mainSocket = socket(PF_INET, SOCK_STREAM, 0) == -1) printf("%i\r\n", WSAGetLastError); addr.sin_addr.s_addr=INADDR_ANY; addr.sin_port=htons(port); addr.sin_family=AF_INET; if(bind(mainSocket, (struct sockaddr*)&addr, sizeof(addr)) == -1) printf("%i\r\n", WSAGetLastError); if(listen(mainSocket, 3) == -1) printf("%i\r\n", WSAGetLastError); if(clientSocket = accept(mainSocket, (struct sockaddr*)&addr, &addr_size) == -1) printf("%i\r\n", WSAGetLastError); if(recv(clientSocket, buffer, sizeof(buffer)-1, 0) == -1) printf("%i\r\n", WSAGetLastError); else printf("%s\r\n", buffer); system("pause"); return 0; }
-
z.9 aus der funktion raus und sowas wie global
z.10 MAKEWORD(2,2)
z.23 wo testest den return von WinsockStartup()
z.25 AF_INETbtw. WSAGetLastError ist ne function also WSAGetLastError()
es gibt auch INVALID_SOCKET und SOCKET_ERROR makros denke die sind dann -1?man sollte sich die rückgabe von recv() merken... wer sagt dir das dein empfang ein c-string ist?
das war mal so das was mir aufgefallen ist da sind aber sicher noch mehr dinger drin...
-
z.b. das system("pause");

-
z.38 == hat doch ne höhere precedence als =
-
das gleiche dann wenns so ist auch in z.25
-
Stimmt, bei WSAGetLastError() fehlten die Klammern.
Löst aber immer noch nicht wirklich das komische Problem.. ?!?^^
FEHLERCODE: 10038
Socket operation on nonsocket.
MSDN:An operation was attempted on something that is not a socket. Either the socket handle parameter did not reference a valid socket, or for select, a member of an fd_set was not valid.
Hilft mir nicht wirklich weiter..^^
-
hast aber schon in z.25/38 die klammern gesetzt?
-
Hab alle anmerkungen durchgetestet,
kein erfolg
Aber danke schonmal für deine mühe^^
-
btw. nur testen ob etwas einen fehler bringt ist nicht so toll wenn man die folgenden befehle trotzdem ausführt. also sollten da noch ein paar "return 1;" oder so rein.
aber wart doch mal ein bischen kommt sicher noch jmd. der sich das anschaut ist ja noch recht früh :p
-
Hey, ich weis nicht genau warum, aber es klappt.. endlich..^^
accept(s, (struct sockaddr*) &clientAddr, &clientAddr_size)Habe jetzt für den "verbundenen" socket eine eigene sockaddr_in
angelegt.. (wie oben zu sehen).Entweder das wars, oder ein total doofer tippfehler oder so..
naja auf jeden fall funktionierts oO hat mich ja fast wahnsinnig gemacht^^Vielen Dank, und falls doch noch jmd den fehler finden sollte,
und dieser nicht der oben beschriebende sein sollte gerne rein schreiben.Falls es doch der fehler von oben war, vielleicht weis ja jmd hier mehr
und kann mal erklären warum man da eine eigene sockaddr_in struktur für braucht??
-
verzweifelt schrieb:
vielleicht weis ja jmd hier mehr und kann mal erklären warum man da eine eigene sockaddr_in struktur für braucht??
kann doch fast nicht sein... kanns aber gerade nicht testen

also erklärung bitte
-
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.
-
verzweifelt schrieb:
und dieser nicht der oben beschriebende sein sollte gerne rein schreiben.
Falls es doch der fehler von oben war, vielleicht weis ja jmd hier mehr
und kann mal erklären warum man da eine eigene sockaddr_in struktur für braucht??Darin legt accept() die Informationen ab, die du über deinen Verindungsparter bekommst(IP,Port,...). Aber NEIN es ist nicht zwangsläufig nötig, ich habe i.d.R. da einfach NULL drin und meine accepts klappen auch.