Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

11.01.2011, 19:56

Winsocket Fehlercode 10038

Hallo,
ich möchte ein einfaches Testprogramm für Sockets erstellen. Das Programm wird ohne Fehler oder Warnungen Kompiliert und ausgeführt.
Jedoch erhalte ich von der WSAGetLastError() Funktion bei jeder Adresse den Fehlercode "10038".
Ich hab auch schon gegoogelt aber nichts Sinnvollen bzw. verständliches gefunden. Vielleich könnt ihr mir ja weiterhelfen?

Hier der Code:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include <stdio.h>
#include <cstdlib>
#include <iostream>
#include <windows.h>
#include <winsock.h>

int StartWinsock();

int main()
{   
    long            Winsock;
    SOCKET          soTest;
    SOCKADDR_IN     soAdress;
    
    if (Winsock = StartWinsock() == 0)
        std::cout << "Winsock erfolgreich gestartet!" << std::endl;
    else {
        std::cout << "Winsock error!!!" << std::endl;
        exit(1);}
        
    if (soTest = socket (AF_INET, SOCK_STREAM, 0) == INVALID_SOCKET) {
        std::cout << "Socketerstellung fehlgeschlagen!" << std::endl;
        exit(1);}
    else
        std::cout << "Socket erfolgreich erstellt!" << std::endl;
        
    // Bis Port 1000 prüfen
    for (unsigned short port=0; port<=1000; port++)
    {       
        memset(&soAdress,0,sizeof(SOCKADDR_IN));                        // Alles auf 0


        soAdress.sin_family=AF_INET;
        soAdress.sin_port=htons(port);                                  // Zielport
        soAdress.sin_addr.s_addr = inet_addr("192.168.111.17");         // Zieladresse
       
        Winsock = connect(soTest,(SOCKADDR*)&soAdress,sizeof(SOCKADDR));
        
        if(Winsock == SOCKET_ERROR) 
            std::cout << "Port " << port << ": " << WSAGetLastError() << std::endl;   
        else    
            std::cout << "Port " << port << " offen\a" << std::endl;
    }
    std::cout << "Alle ports geprueft!\a" << std::endl;
                
    
    system("PAUSE");
    return 0;
}

///////////////////////////////////////////

int StartWinsock()
{
    WSADATA wsa;
    return WSAStartup(MAKEWORD(2,0),&wsa);
}


Vielen Dank für eure Hilfe ;-)

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

11.01.2011, 20:04

Zitat von »http://msdn.microsoft.com/en-us/library/ms740668%28v=vs.85%29.aspx«

Socket operation on nonsocket.

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.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

3

12.01.2011, 06:25

Mh also irgendwie ist es mir nicht so ganz klar warum ich kein gültiges Socket haben sollte.

Und die fd_set Struktur bzw. select Funktion nutze ich ja nicht. Also kanns daran nicht liegen.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

4

12.01.2011, 06:55

Mal versucht innerhalb der Schleife ein neues socket anzulegen statt immer wieder auf dem gleichen eine neue Verbindung aufzubauen?
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Thoran

Alter Hase

Beiträge: 520

Wohnort: Stuttgart

Beruf: Senior Software Engineer

  • Private Nachricht senden

5

12.01.2011, 14:19

Zitat von »MSDN«

The bind function associates a local address with a socket.


Kann es sein, dass dir ein bind() nachdem socket(..) fehlt bevor du den connect(..) machst?

Thoran
Mein Entwicklertagebuch
Aktuelles Projekt: Universum Espionage
Eingestellt:Spieleengine SilverCore
Organisator "Spieleentwickler Stammtisch Stuttgart"

6

12.01.2011, 15:08

Jo, da fehlt definitiv ein bind() bevor du mit dem Socket connecten willst.

idontknow

unregistriert

7

12.01.2011, 20:19

Will ja nicht rumstänkern aber komischerweise funktioniert das connecten auch _ohne_ bind.. Bin mir nicht sicher ob es 100% bugfrei ist aber bei mir klappt es :P

8

12.01.2011, 21:14

@Blue Cobold.
Ich hab das Progamm so abgeändert das ich für jeden neuen Port ein neues Socket erstell. Funktioniert auch nicht.

Und meines wissens nach ist ein Bind() nur bei Serveranwendungen nötig oder nicht?
Naja ich habs ausprobiert und der Fehler ist immer noch da. Vlt kann jemand mal mein Code ausführen und schauen ob der gleiche Fehler auftritt?

Weiß echt nicht mehr weiter :S

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

9

12.01.2011, 21:46

Bind ist eigentlich nur notwendig, wenn man ein listen machen will, ja.

Morgen könnte ich den Code mal durchsteppen, heute habe ich aber keinen Nerv mehr dazu.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Thoran

Alter Hase

Beiträge: 520

Wohnort: Stuttgart

Beruf: Senior Software Engineer

  • Private Nachricht senden

10

13.01.2011, 11:15

In der Tat lag der Fehler hier

So klappt das nicht

C-/C++-Quelltext

1
2
3
 if (soTest = socket (AF_INET, SOCK_STREAM, 0) == INVALID_SOCKET) {
        std::cout << "Socketerstellung fehlgeschlagen!" << std::endl;
        exit(1);}


denn es fehlen Klammern um die Zuweisung herum. Also

C-/C++-Quelltext

1
2
3
if ((soTest = socket (AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) {
        std::cout << "Socketerstellung fehlgeschlagen!" << std::endl;
        exit(1);}


Das bisherige Problem war, das die SocketID 0 war und dein if das nicht gemerkt hat.
Bei mir hängt er jetzt im connect() auf Port 900 (hab nur einen Port getestet, eben 900) und wartet auf den Timeout. Kurz danach bekomme ich 10060: Connection timed out. Und so soll es ja sein


Thoran
Mein Entwicklertagebuch
Aktuelles Projekt: Universum Espionage
Eingestellt:Spieleengine SilverCore
Organisator "Spieleentwickler Stammtisch Stuttgart"

Werbeanzeige