Toon posts:

[C++] WinSock probleem met connect()

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hallo allemaal

Ik ben nogal nieuw met het programmeren van netwerk applicaties, dus vandaar dat ik hier probeer om hulp te vinden. Ik wil een applicatie maken die checkt of een URL nog wel bestaat of niet. Hiervoor moet ik een connectie maken met de server, een vervolgens een HTTP request sturen.

Tot nu toe heb ik het volgende:

code:
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
//---------------------------------------------------------------------------

#include <vcl>
#include <winsock>
#include <iostream>
#pragma hdrstop

//---------------------------------------------------------------------------

using namespace std;

void initWinSock(WSADATA&);

#pragma argsused
int main(int argc, char* argv[])
{
        WSADATA WSAData;
        HOSTENT* hp;
        SOCKADDR_IN ServerInfo;
        IN_ADDR ServerIPAddr;

        initWinSock(WSAData);

        char* serverName = "www.looze.net";
        hp = gethostbyname(serverName);

        /* als de URL niet bestaat */
        if(hp == 0) {
                cout << serverName << " is an invalid or non-existant hostname." << endl;
                cin.get();
                return 0;
        }

        /*loop door alle IP-adressen heen */
        for(int i = 0; hp->h_addr_list[i] != 0; ++i) {
                memcpy(&ServerIPAddr, hp->h_addr_list[i], sizeof(struct in_addr));
                cout << "IP-Address: " << inet_ntoa(ServerIPAddr) << endl;
        }

        /*Initialiseer de socket*/
        SOCKET theSocket;
        theSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
        if(theSocket == INVALID_SOCKET) {
                cout << "Error creating socket: Error " << WSAGetLastError() << endl;
                WSACleanup();
                cin.get();
                return 0;
        }

        /*Geef ServerInfo alle info die nodig is om te connecten*/
        ServerInfo.sin_family = AF_INET;
        ServerInfo.sin_addr = ServerIPAddr;
        ServerInfo.sin_port = htons(80);

        /*connect*/
        if(connect( theSocket, (SOCKADDR*) &ServerInfo, sizeof(ServerInfo) ) == SOCKET_ERROR) {
                cout << "Failed to connect: Error " << WSAGetLastError() << " (timeout)";
                WSACleanup();

                cin.get();
                return 0;
        } else {
                cout << "Connection succesfull!";
        }

    closesocket(theSocket);
    WSACleanup();

        cin.get();
        return 0;
}
//---------------------------------------------------------------------------

void initWinSock(WSADATA& WSAData) {
        WORD Version;

        Version = MAKEWORD(2,0);
        if(WSAStartup(Version, &WSAData) != 0) {
                cout << "Error initializing Winsock: Error " << WSAStartup(Version, &WSAData) << endl;
        }
}


Nogal een lap code. Maar ik kan met zekerheid zeggen dat het tot en met regel 53 allemaal goed gaat, ik vang namelijk over mogelijke errors af maar die zijn er tot die regel nog niet. Ook krijg ik van gethostbyname het goeie IP adres terug.

Het probleem is dus dat mijn connect (regel 56) functie niet werkt. Als deze functie wordt uitgevoerd, dan krijg ik altijd na +/- 30 seconden een timeout (error code 10060), terwijl ik zeker weet dat ik een goed IP-adres heb.

Wat is er mis met mijn code?

[ Voor 5% gewijzigd door Verwijderd op 29-09-2004 12:59 ]


  • Peter_B
  • Registratie: Maart 2001
  • Laatst online: 08:45
Weet je zeker dat het ip te bereiken is?
open eens een telnet naar het ip op poort 80, moet je wel ff op enter drukken. Dan krijg je een hele lap html code.
Dan weet je zeker dat het ip ook echt geldig is en dat het niet alleen nog in de DNS tabellen staat.

Discoveries are made by not following instructions.


Verwijderd

Topicstarter
Peter_B schreef op 29 september 2004 @ 13:08:
Weet je zeker dat het ip te bereiken is?
open eens een telnet naar het ip op poort 80, moet je wel ff op enter drukken. Dan krijg je een hele lap html code.
Dan weet je zeker dat het ip ook echt geldig is en dat het niet alleen nog in de DNS tabellen staat.
hmmzz
dus als ik in telnet 'open 213.239.154.35 80' (IP adres van tweakers.net) in tik dan moet er HTML-code uit komen? Ik krijg alleen maar een foutmelding: "Could not open connection to the host, on port 80: Connection failed"

[ Voor 3% gewijzigd door Verwijderd op 29-09-2004 13:28 ]


  • Peter_B
  • Registratie: Maart 2001
  • Laatst online: 08:45
Ik heb net je code even gecompilled en bij mij werkt het perfect, op www.looze.net. Dus ik ben bang dat het niet aan je code ligt, maar aan je PC?? :?

Heb je iets van een firewall ofzo.

Je kan wel gewoon surfen neem ik aan :) .

[ Voor 9% gewijzigd door Peter_B op 29-09-2004 13:35 ]

Discoveries are made by not following instructions.


Verwijderd

Topicstarter
Ja werkt het? Wat krijg je dan als output? "Connection succesfull!"? Als dat zo is dan werkt het inderdaad. Ik zit nu op school te werken dus ik weet niet of het iets met het netwerk of standaard instellingen van de PC te maken heeft. Enig idee hoe ik dat kan checken? Ik heb nul verstand van Firewalls en dat soort zaken.

surfen werkt iig wel ja :D

[ Voor 11% gewijzigd door Verwijderd op 29-09-2004 13:40 ]


  • Peter_B
  • Registratie: Maart 2001
  • Laatst online: 08:45
Ik krijg:
IP-Address: 82.192.73.137
Connection succesfull!

dus dat is ok. Is het misschien zo dat bij jou op school "onbekende" programma's geen netwerk verbinding mogen openen. Ik heb geen idee hoe je dat kan checken, probeer je programma eens met een andere pagina. Als het dan wel werkt is het misschien zo dat www.looze.net is geblockeerd bij jou op school.

Verder heb ik geen idee.

Discoveries are made by not following instructions.


Verwijderd

Topicstarter
OK, naja ik ben blij dat het tenminste niet aan m'n code ligt... bedankt voor je hulp!
Pagina: 1