DevC++ Socket: OpenANdConnect

Hallo,

Ich möchte eigentlich nicht mehr, als ein Beispiel von der msdn 1:1 bei mir auszuführen. Nutze Vista Sp1 mit dem neusten DevC++. Doch es will nicht hinhauen:
--> http://msdn.microsoft.com/en-us/library/ms741557(VS.85).aspx

In DevC++ habe ich:
main.cpp
Code:
#include <stdio.h>
#include <winsock2.h>
#include <windows.h>
#include <string>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
    system("PAUSE");
    return EXIT_SUCCESS;
}

/*
WSAConnectByName Function, msdn:
http://msdn.microsoft.com/en-us/library/ms741557(VS.85).aspx
*/

SOCKET OpenAndConnect(LPSTR NodeName, LPSTR PortName) 
{
    SOCKET ConnSocket;
    int ipv6only = 0;
    int iResult;
    BOOL bSuccess;
    SOCKADDR_STORAGE LocalAddr = {0};
    SOCKADDR_STORAGE RemoteAddr = {0};
    DWORD dwLocalAddr = sizeof(LocalAddr);
    DWORD dwRemoteAddr = sizeof(RemoteAddr);
  
    ConnSocket = socket(AF_INET6, SOCK_STREAM, 0);
    if (ConnSocket == INVALID_SOCKET){
        return INVALID_SOCKET;
    }

    iResult = setsockopt(ConnSocket, IPPROTO_IPV6,
        IPV6_V6ONLY, (char*)&ipv6only, sizeof(ipv6only) );
    if (iResult == SOCKET_ERROR){
        Closesocket(ConnSocket);
        return INVALID_SOCKET;       
    }

    bSuccess = WSAConnectByName(ConnSocket, NodeName, 
            PortName, &dwLocalAddr,
            (SOCKADDR*)&LocalAddr,
            &dwRemoteAddr,
            (SOCKADDR*)&RemoteAddr,
            NULL,
            NULL);
    if (bSuccess){
        return ConnSocket;
    } else {
        return INVALID_SOCKET;
    }
}

Linker
Code:
../../Dev-Cpp/lib/libws2_32.a
../../Dev-Cpp/lib/libwsock32.a


---------------------------


Folgende Fehler springen mir beim kompilieren entgegen:

Code:
 D:\C++\WINSOCK2\main.cpp In function `SOCKET OpenAndConnect(CHAR*, CHAR*)': 
34 D:\C++\WINSOCK2\main.cpp `IPV6_V6ONLY' undeclared (first use this function) 
  (Each undeclared identifier is reported only once for each function it appears in.) 
36 D:\C++\WINSOCK2\main.cpp `Closesocket' undeclared (first use this function) 
46 D:\C++\WINSOCK2\main.cpp `WSAConnectByName' undeclared (first use this function)


Was muss ich sonst noch beachten, damit er die Funktionen und Konstanten kennt? Laut msdn sollte das ja genügen...
 
Wenn du in Windows C++ entwickelst würd ich generell VisualStudio (Express) benutzten. Vllt funkts ja dann.
 
Manche Typen, Konstanten... usw sind Microsoft-Standard und in DevCpp / Code::Blocks nicht vorhanden (ich hatte mal das Problem mit dem Typ DWORD). Entweder suchst du die Definitionen und kopierst sie von Hand oder du gewöhnst dich einfach an Visual Studio / Visual C++ da das von Microsoft für Microsoft-Entwicklung geschaffen wurde.
 
VC++ meint etwa das selbe:

Code:
1>d:\vc++\wsock\wsock\wsock\wsock.cpp(30) : error C2065: 'IPV6_V6ONLY': nichtdeklarierter Bezeichner
1>d:\vc++\wsock\wsock\wsock\wsock.cpp(32) : error C3861: "Closesocket": Bezeichner wurde nicht gefunden.

:(

btw: ich hab da jetzt keineLibs(Linker) angegeben... evtl. ist es deswegen. Wie das bei VC++ geht, muss ich erst noch herausfinden...
 
Versuch mal -lws2_32 oder -lwsock32 als Linker-Parameter einzustellen.

Edit: Project -> Properties ([Alt]+[F7]) -> Configuration Properties -> Linker -> Command Line -> Additional Options
 
Original von Cyberm@ster
Versuch mal -lws2_32 oder -lwsock32 als Linker-Parameter einzustellen.

Edit: Project -> Properties ([Alt]+[F7]) -> Configuration Properties -> Linker -> Command Line -> Additional Options
Danke, aber damit ändert sich leider auch nichts. Ich google schon die ganze Zeit, aber dieses Problem scheint niemand anderes zu haben. Evtl. nutzt auch noch fast niemand wsaconnectbyname...

damn. Ganzer Tag nur dieses Problem versucht zu lösen. :rolleyes:

EDIT: Hat hier keiner ne Ahnung warum das nicht hinhaut, bez. was man alles beachten muss, damit es funktioniert? Wäre wirklich sehr dankbar, wenn mir einer helfen würde... ;)
 
Nabend

ich hab mir das mal angesehen.

1>d:\vc++\wsock\wsock\wsock\wsock.cpp(30) : error C2065: 'IPV6_V6ONLY': nichtdeklarierter Bezeichner

Du musst hierfür noch die "Ws2tcpip.h" includieren. Mehr infos dazu hier .


1>d:\vc++\wsock\wsock\wsock\wsock.cpp(32) : error C3861: "Closesocket": Bezeichner wurde nicht gefunden.

hmm.. scheint einfach nur ein tippfehler zu sein. Mit nem kleinen c (closesocket) geht's

mfg
 
Danke dir! Jetzt scheint es zu funktionieren.

Lib zum einbinden:
Code:
Ws2_32.lib


Includes:
Code:
#include "stdafx.h"
#include "Winsock2.h"
#include "windows.h"
#include "Ws2tcpip.h"

Korrekter Code:
Code:
SOCKET OpenAndConnect(LPSTR NodeName, LPSTR PortName) 
{
    SOCKET ConnSocket;
    int ipv6only = 0;
    int iResult;
    BOOL bSuccess;
    SOCKADDR_STORAGE LocalAddr = {0};
    SOCKADDR_STORAGE RemoteAddr = {0};
    DWORD dwLocalAddr = sizeof(LocalAddr);
    DWORD dwRemoteAddr = sizeof(RemoteAddr);
  
    ConnSocket = socket(AF_INET6, SOCK_STREAM, 0);
    if (ConnSocket == INVALID_SOCKET){
        return INVALID_SOCKET;
    }

    iResult = setsockopt(ConnSocket, IPPROTO_IPV6,
        IPV6_V6ONLY, (char*)&ipv6only, sizeof(ipv6only) );
    if (iResult == SOCKET_ERROR){
        closesocket(ConnSocket);
        return INVALID_SOCKET;       
    }

    bSuccess = WSAConnectByNameA(ConnSocket, NodeName, 
            PortName, &dwLocalAddr,
            (SOCKADDR*)&LocalAddr,
            &dwRemoteAddr,
            (SOCKADDR*)&RemoteAddr,
            NULL,
            NULL);
    if (bSuccess){
        return ConnSocket;
    } else {
        return INVALID_SOCKET;
    }
}
 
Zurück
Oben