Avatar billede elv Nybegynder
22. februar 2002 - 13:53 Der er 4 kommentarer og
1 løsning

Winsock Problem

Jeg er ved at lave en telnet-klon (bare for sjov :)), men banker hovedet ind i en mur lige nu. Jeg vil bare sende en GET request til min apache web-server, som kører på localhost, men ved recv-funktionen "hænger" programmet fast (blocker). Jeg har haft et netværksovervågningsprogram sat til der fanger alle netværkspackets, og den fanger ikke noget fra mit program, så jeg gætter på at det er i sendingen det går galt. Det underlige er, at funktionen send() faktisk returnerer det korrekte antal bytes (11) som er sendt. Derfor: Kig lige på det og hjæææælp :). Det er en windows-console-application, jeg har også prøvet som windows-application, men det er i selve funktionen initSocket() at det går galt. Jeg skriver pt. til localhost, men har også prøvet med f.eks. google.com, stadig uden held

Source på vej. Husk at inkludere wsock32.lib i projektet for at compile..
/***** Main.cpp - Den eneste fil i projektet *****/
#include "windows.h"
#include <iostream.h>

void debug(char *asd)
{
    cout << asd;
}

SOCKET s;
WSADATA wsda;  // Information fra WSAStartUpx
struct hostent *host;
char hostname[20], sendline[100], readline[1024];
int sendlinelen, readlinelen; // Længde af strengene
struct sockaddr_in address;;

int initSocket() // result-værdierne er kun til debugging
{
    int result;
//    strcpy(hostname, "www.google.com");
//    strcpy(hostname, "216.239.51.101"); // www.google.com
    strcpy(hostname, "127.0.0.1"); // localhost
    strcpy(sendline, "GET /1.html"); // Fil i roden af web-serveren
    sendlinelen = strlen(sendline);

    result = WSAStartup(MAKEWORD(1,1), &wsda); // Init WinSocket.

    s = socket(PF_INET,SOCK_DGRAM,0);
    if(s == SOCKET_ERROR)
    {
        result = WSAGetLastError();
        debug("fejl 1");
        return -1;
    }
    // Socket ok nu (forhåbentlig :))
    address.sin_family = AF_INET; // Internet protocol
    address.sin_port = htons(80); // HTTP-port 80
    address.sin_addr.s_addr = inet_addr(hostname); // 127.0.0.1
    if(address.sin_addr.s_addr == INADDR_NONE) // Hvis f.eks. localhost i stedet for 127.0.0.1. Kode taget fra eksempel.
    {
        host = NULL;
        debug("Finder hostname");
        host = gethostbyname(hostname); // Get the IP address of the server
        if(host == NULL)
        {
            debug("Error\nUnknown host.");
            return -3;
        }
        memcpy(&address.sin_addr, host->h_addr_list[0], host->h_length);
        debug("host ok!");
    }
    debug("Socket and adress ok, connecting");
    result = connect(s, (struct sockaddr *) &address, sizeof(address)); //Connect

    if (result== SOCKET_ERROR)
    {
        debug("Fejl i connect");
        return WSAGetLastError();
    }
    debug("Connect ok, sender data");
    result = send(s, sendline, sendlinelen, 0); // send returnerer antal sendte bytes
    if(result == SOCKET_ERROR)
    {
        return -2;
        debug("fejl 2");
    }
    debug("Sending ok, venter på data");
    // HER bliver jeg skuffet... den hænger i næste linie:
      readlinelen = recv(s, readline, sizeof(readline), 0);
    debug("Data modtaget!!!!!!");
    if(readlinelen == SOCKET_ERROR)
    {
        return -3;
        debug("fejl 3");
    }
    readline[readlinelen] = '\0'; // konverter til null-termineret string
   
    closesocket(s);
    WSACleanup();
    return 0;
}

int main(char *args)
{
    int i;
    debug("test the helloing world");
    i = initSocket();
    return i;
}

/************ Source slut ***********/

MVH Elv
Avatar billede mickni33 Nybegynder
22. februar 2002 - 22:24 #1
ved første øjekast tror jeg ikke recv() returnerer noget so helst, altså funktionen er en void. så din readlinelen har ikke nogen værdi.
Avatar billede mickni33 Nybegynder
22. februar 2002 - 22:28 #2
s = socket(PF_INET,SOCK_DGRAM,0);

prøv at lav den om til

s=socket(AF_INET,SOCK_STREAM,0);
Avatar billede elv Nybegynder
23. februar 2002 - 16:44 #3
Whoooooops, ja det var et forsøg jeg havde lavet for at se om det virkede, glemte lige at ændre den tilbage igen... (jeg gjorde også sådan tidligere). Det var altså en del af løsningen. Den anden del var at jeg glemte en line-feed i slutningen af min GET commando... den korrekte var:
strcpy(sendline, "GET /index.html\n");

det skal lige siges at PF_INET og AF_INET per definition er samme (2 har jeg vist læst et sted), så det ville ikke gøre forskel.
Anyway, nu virker det. Pointene er dine, hvis du vil have dem, jeg har ikke brug for dem :).

MVH Elv
Avatar billede mickni33 Nybegynder
24. februar 2002 - 14:07 #4
OK fedt at det virker det kan godt være lidt besværligt det der socket, men når man får hul er det jo bare samme stykke kode hvergang.
Avatar billede elv Nybegynder
24. februar 2002 - 21:56 #5
netop! :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester