WinSock



  • Hallo
    Ich probiere grade einen socket zu starten, der dann direkt wieder schließt.
    Habe aus einem älteren Buch ein Beispiel. Allerdings wenn ich das compiliere bekomme ich linker fehler.

    **** Full rebuild of configuration Debug for project socket ****
    
    make -k clean all 
    rm -rf  ./main.o  ./main.d socket.exe
    ' '
    'Building file: ../main.cpp'
    'Invoking: GCC C++ Compiler'
    g++ -O0 -g3 -Wall -c -fmessage-length=0 -omain.o ../main.cpp
    ../main.cpp: In function `int WinSockInitialize()':
    ../main.cpp:20: warning: control reaches end of non-void function
    'Finished building: ../main.cpp'
    ' '
    'Building target: socket.exe'
    'Invoking: GCC C++ Linker'
    g++ -L"C:/Programme/eclipse2/workspace/Hello World" -osocket.exe  ./main.o   
    ./main.o(.text+0x21): In function `Z17WinSockInitializev':
    C:/Programme/eclipse2/workspace/socket/Debug/../main.cpp:17: undefined reference to `WSAStartup@8'
    ./main.o(.text+0x87): In function `main':
    C:/Programme/eclipse2/workspace/socket/Debug/../main.cpp:29: undefined reference to `socket@12'
    ./main.o(.text+0x98):C:/Programme/eclipse2/workspace/socket/Debug/../main.cpp:31: undefined reference to `WSACleanup@0'
    ./main.o(.text+0xac):C:/Programme/eclipse2/workspace/socket/Debug/../main.cpp:33: undefined reference to `closesocket@4'
    ./main.o(.text+0xb4):C:/Programme/eclipse2/workspace/socket/Debug/../main.cpp:35: undefined reference to `WSACleanup@0'
    collect2: ld returned 1 exit status
    make: *** [socket.exe] Error 1
    make: Target `all' not remade because of errors.
    Build complete for project socket
    

    Dies ist der Quelltext:

    #include <windows.h>
    #include <winsock2.h>
    #include <stdio.h>
    
    #define RETURN_ON_ERROR(err) {\
    	WSACleanup();\
    	return (err);\
    }
    
    int WinSockInitialize (void)
    {
    
    	int err;
    	WORD wVersionReq;
    	WSADATA wsaData;
    	wVersionReq = MAKEWORD (1,1);
    	err=WSAStartup(wVersionReq, &wsaData);
    	if (err != 0)
    		exit (1);
    }
    
    int main (int argc, char **argv)
    {
    
    	SOCKET soc;
    
    	WinSockInitialize();
    
    	soc = socket ( AF_INET, SOCK_STREAM, 0);
    	if ( soc == INVALID_SOCKET)
    		RETURN_ON_ERROR(1);
    
    	closesocket(soc);
    
    	WSACleanup();
    return (0);
    
    }
    

    hoffe mir kann da jemand helfen.

    ich arbeite mit eclipse und dem MinGW kompiler.

    mfg
    silicore



  • 1. Die Funktion WinSockInitialize() benötigt noch eine "return"-Anweisung (oder du korrigierst den Rückgabewert von "int" nach "void").

    2. Du mußt dem Linker noch die .obj Datei mit den Socket-Funktionen übergeben, von alleine findet der sie nicht. (dazu trägst du am Ende des zweiten Befehls den richtigen Pfad ein)



  • Die richtige libraries sind für Winsock wsock32.lib und ws2_32.lib.


Anmelden zum Antworten