Probleme mit Select bei Sockets auf 64Bit



  • Habe ein Programm, welches in 32 Bit mit Sockets problemlos läuft!

    Nun will Ich es in 64 Bit benutzen, und damit gehts nicht.

    Also Problem habe Ich nun die select anweisung in meinem Programm ausgemacht, diese bricht immer ab ohne auch nur auf den Timeout zu warten.

    Bekomme dann immer WSAGetLastError 10038 was bedeutet "Socket operation on non Socket"

    Doch wenn Ich meinen frisch erzeugen Socket mit dem beim select vergleiche steht der gleiche wert drinn, dann sollte er doch gültig sein, oder?

    Codeausschnitte:

    Öffnen des Sockets

    fd = socket(AF_INET, SOCK_STREAM, 6);
        if (daveDebug & daveDebugOpen) {
    	LOG1(ThisModule "7\n");
    	FLUSH;
        }	
    
        if (daveDebug & daveDebugOpen) {
    	LOG2(ThisModule "socket is %d\n", fd);
       }	
       if (daveDebug & daveDebugOpen) {
    	LOG3(ThisModule "setsockopt %s %d\n", strerror(WSAGetLastError()),WSAGetLastError());
       }
    
        addrlen = sizeof(addr);
        if (daveDebug & daveDebugOpen) {
    	LOG1(ThisModule "8\n");
    	FLUSH;
        }	
       if (bind(fd, (struct sockaddr *) & addr, addrlen)) {
    	LOG2(ThisModule "bind Socket error: %s \n", strerror(errno));
        }
        if (connect(fd, (struct sockaddr *) & addr, addrlen)) {
    	if (daveDebug & daveDebugOpen) {
    	    LOG2(ThisModule "connect Socket error: %s \n", strerror(errno));
    	}    
    	closesocket(fd);
    	fd = 0;
        } else {
    	    LOG2(ThisModule "Connected to host: %s \n", peer);
    	printf("Socket: %d\n",fd);
    

    Select abfrage

    in di->fd.rfd steht der oben geöffnete socket! (Ist vom Typ Handle)

    int res,i,length;
    	fd_set FDS;
    	struct timeval t;
    	FD_ZERO(&FDS);
    	FD_SET((SOCKET)(di->fd.rfd), &FDS);
    
    	//di->timeout=10000000;
    	//LOG2("timeout wrt: %d \n",di->timeout);
    	t.tv_sec = di->timeout / 1000000;
    	t.tv_usec = di->timeout % 1000000;
    	//LOG2("timeout s: %d \n",t.tv_sec);
    	//LOG2("timeout ms: %d \n",t.tv_usec );
    	printf("Socket: %d\n",di->fd.rfd);
    	if (select(/*di->fd.rfd +*/ 1, &FDS, NULL, NULL, &t) <= 0) {
    		LOG2("WSAGetLastError: %d \n",WSAGetLastError());
    		if (daveDebug & daveDebugByte) LOG1("timeout in ReadISOPacket.\n");
    		return 0;
    	} else {
    


  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C (C89 und C99) 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.


  • Mod

    Na dann kontrolliere mal die Werte für Deinen Socket. Vermutlich stimmt genau die Fehlermeldung und die Socket Adresse ist falsch.



  • Aber auf 32 Bit funktioniert der Code ja!

    Un der wert welchen Ich bei printf("Socket: %d\n",fd); ausgebe habe Ich in beiden Codeteilen!



  • Gleiche Betriebssystem?



  • Ja, Windows7 64-Bit



  • Hatt da keiner noch ne idee dazu?



  • Schon mal versucht IPv6 zu deaktivieren vielleicht funktioniert es dann.



  • jogibear9988 schrieb:

    FD_SET((SOCKET)(di->fd.rfd), &FDS);
    

    Wieso musst du hier casten? Zeig mal die Struktur von dem di -Objekt und von welchem Typ ist das rfd?
    Kannst du das Ganze auf ein kleines kompilierbares Beispielprogramm runterbrechen, das den Fehler noch aufweist?



  • rfd ist vom Typ HANDLE, da es nicht nur für Sockets sondern auch für andere Handels verwendet wird.

    (Ich Versuch da eine OpenSourceLib (libnodave) welche zur Kommunikation mit Siemens SPSen ist auf 64 Bit zu bringen. Diese kann auch Protokolle über den seriellen Port, daher ist rfd vom Typ Handle)



  • Kannst du das Ganze auf ein kleines kompilierbares Beispielprogramm runterbrechen, das den Fehler noch aufweist?



  • Mhmm, glaub das wird nicht so einfach. Aber Ich schau mal ob Ich das hinbekomme. Vielleicht finde Ich ja dabei auch selbst den Fehler!

    Ansonsten:
    Vielleicht hat ja jemand lust schon mal in den Code der Lib zu schauen.

    Den gibts hier:
    http://sourceforge.net/projects/libnodave/ (ist nicht von mir!)

    In der openSocketw.c wird das Socket geöffnet, und in nodave.c erfolgt die ganze Verarbeitung...



  • Hast Du irgenwelche Erfolge mit der Umsetzung der Libnodave auf 64 Bit. gehabt. Ich versuche mich gerade selber erfolglos daran.
    Ich komme bis connectPLC . Diese Funktion gibt mir aber -1 zurück.

    Mike


Anmelden zum Antworten