Problem mit Winsock



  • Hi,

    Ich wollte mich jetzt endlich mal mit der Basis der Netzwerkprogramierung, sprich Syncrone WinAPI Sockets, auseinandersetzen. Allerdings will schon mein erstes kleines Testprogramm nicht so wie ich. Der Lookup fuktioniert noch, aber die Verbindung schlägt immer fehl. Kann mir jemand helfen?

    Vielen dank im voraus

    #include "stdafx.h"
    #include <winsock.h>
    
    #include <iostream.h>
    
    u_long LookupAddress(const char* pcHost);
    SOCKET EstablishConnection(u_long nRemoteAddr, u_short nPort);
    
    int main(int argc, char* argv[])
    {
    	// Start Winsock up
        WSAData wsaData;
    	int nCode;
        if ((nCode = WSAStartup(MAKEWORD(1, 1), &wsaData)) != 0) 
    	{
    		cout << "WSAStartup() Fehler! Code: " << nCode << "." << endl;
            return 0;
        }
    	cout << "Winsocks erfolgreich initalisiert!" << endl;
    
    	const char* pServer = "www.google.de";
    	int nPort = 80;
    
    	// Adress Lockup
    	cout << "Uebersetze Hostadresse (" << pServer << ") ..." << endl;
        u_long nRemoteAddress = LookupAddress(pServer);
        if (nRemoteAddress == INADDR_NONE) 
    	{
            cout << "Konnte Adresse nicht aufloesen!" << endl;
    		WSACleanup();
            return 0;
        }
    	in_addr Address;
        memcpy(&Address, &nRemoteAddress, sizeof(u_long)); 
        cout << "Adresse aufgeloest: " << inet_ntoa(Address) << endl;
    
    	// Stelle Verbindung her
    	cout << "Verbinde zu " << inet_ntoa(Address) << " auf Port " << nPort << "..." << endl;
    
    	SOCKET s = EstablishConnection(nRemoteAddress, nPort);
    	if (s==INVALID_SOCKET)
    	{
    		cout << "Verbindung fehlgeschlagen! Code :" << WSAGetLastError() << endl;
    		WSACleanup();
    		return 0;
    	}
    	cout << "Verbindung hergestellt! Socket: " << s << endl;
    
    	return 0;
    }
    
    u_long LookupAddress(const char* pcHost)
    {
        u_long nRemoteAddr = inet_addr(pcHost);
        if (nRemoteAddr == INADDR_NONE) {
            // pcHost isn't a dotted IP, so resolve it through DNS
            hostent* pHE = gethostbyname(pcHost);
            if (pHE == 0) {
                return INADDR_NONE;
            }
            nRemoteAddr = *((u_long*)pHE->h_addr_list[0]);
        }
    
        return nRemoteAddr;
    }
    
    SOCKET EstablishConnection(u_long nRemoteAddr, u_short nPort)
    {
        // Create a stream socket
        SOCKET sd = socket(AF_INET, SOCK_STREAM, 0);
        if (sd != INVALID_SOCKET) {
            sockaddr_in sinRemote;
            sinRemote.sin_family = AF_INET;
            sinRemote.sin_addr.s_addr = nRemoteAddr;
            sinRemote.sin_port = nPort;
            if (connect(sd, (sockaddr*)&sinRemote, sizeof(sockaddr_in)) ==
                    SOCKET_ERROR) {
                sd = INVALID_SOCKET;
            }
        }
    
        return sd;
    }
    


  • Hat sich erledigt. Das kommt davon wenn man das Beispiel nicht richtig durchliest. Vor dem verbinden muß der Socket mit htons in Big Endian umgewandelt werden.


Anmelden zum Antworten