04. december 2000 - 12:24 Der er 16 kommentarer og
1 løsning

Socket i C/C++

Jeg har kigget en masse kildekode igennem og forsøgt at stjæle hvor jeg kunne - men lige lidt hjælper det!! Jeg beder om hjælp...Hvad
er der fx. i vejen med følgende eksempel ?

hvilke includes skal med? Jeg bruger VC++6 under WIN98...

#define LOGIN \"xxxxxx\"
    #define PASSWORD \"yyyyy\"
    #define HOST \"192.168.30.2\"
   
    struct  hostent *him;         
    struct  sockaddr_in servAddr; 
    int    tcp_socket;           
   
    char *signon  = LOGIN \"\\n\" PASSWORD \"\\n1\\n\";
    char *signoff = LOGIN \"\\n\" PASSWORD \"\\n1\\n\";;
    char *tosend;
    char *remoteHostName = HOST;  // server to connect to
   
    int messageLength = sizeof(LOGIN) + sizeof(PASSWORD) + 2;
    int socket;                      // socket descriptor
    int i, bytesRead;
    char* freeMem;

    freeMem = (char*) malloc(512); // room for server response

    if ((him = gethostbyname(\"192.168.30.2\")) == NULL)
        return;
 
    socket = socket(AF_INET, SOCK_STREAM, 0);

   
    servAddr.sin_family = him->h_addrtype;     
    inet_ntoa(servAddr.sin_addr);
    servAddr.sin_port = htons(159);
   
    if ((connect(socket, (LPSOCKADDR)(&servAddr), sizeof(servAddr))) < 0)
    {
        return;
    }
   
    // write login, password and sign on/off selection to socket
    i = 0;
    while (i < messageLength)
    {
        int writtenSoFar = write(socket, tosend+i, messageLength-i);
        if (writtenSoFar <= 0)
        {
            fprintf(stderr, \"slic: Error during write to server\\n\");
            close(socket);
            return;
        }
        i += writtenSoFar;
    }
   
    // Read in response from server
    bytesRead = 0;
   
    while ((i = read(socket, freeMem + bytesRead, 512)) > 0)
    {
      bytesRead += i;
    }


stofa001Dlg.cpp
C:\\msdn\\stofa001\\stofa001Dlg.cpp(204) : error C2064: term does not evaluate to a function
C:\\msdn\\stofa001\\stofa001Dlg.cpp(220) : error C2065: \'write\' : undeclared identifier
C:\\msdn\\stofa001\\stofa001Dlg.cpp(224) : error C2065: \'close\' : undeclared identifier
C:\\msdn\\stofa001\\stofa001Dlg.cpp(233) : error C2065: \'read\' : undeclared identifier
Error executing cl.exe.
Avatar billede moykal Nybegynder
04. december 2000 - 12:35 #1
Noget tyder jo på, at du hverken inkluderer socket headeren... og husk nu lib\'et også. Kig evt. på

http://www.fsf.org/software/commonc++/CommonC++.html

der er også et sted derude, hvor en fyr i enten C++ users Journal eller Dr. Dobbs. skrev en artikel om portabelt socket stuff. Det har jeg prøvet og det virker.

www.cuj.com
www.ddj.com
04. december 2000 - 12:57 #2
hvis du har noget
04. december 2000 - 12:59 #3
hvis du har noget der virker så bare kom med det! Jeg afviser dit svar for jeg synes det er lovlig abstrakt...på dine links fandt jeg da en del vedr. mit spørgsmål...men jeg har allerede en masse og derfor vil jeg gerne have noget konkret at forholde mig til!
04. december 2000 - 13:01 #4
Jeg har included socket.h - og i VC++6 skriver jeg read( og så popper parameter listen op som sædvanligt...hvorfor den så skriver undeclared identifier ved jeg ikke??!
Avatar billede moykal Nybegynder
04. december 2000 - 13:02 #5
Jeg er bange for, at det jeg har tilbage er kode jeg anvender ifm. arbejde, og det kan jeg ikke give. Men jeg er på ferie i denne uge, og skal da gerne se om jeg kan finde artiklen og evt. fakse den til dig.

Men var problemet med din egen kode ikke blot det, at du ikke inkludere winsock headeren?

moykal
Avatar billede moykal Nybegynder
04. december 2000 - 13:04 #6
Jeg har ikke noget present, men skal da gerne kigge senere... er det ikke receive man skal anvende?
Avatar billede moykal Nybegynder
04. december 2000 - 13:07 #7
Den hedder recv
04. december 2000 - 13:08 #8
winsock.h er \"desværre\" også med!!
Avatar billede moykal Nybegynder
04. december 2000 - 13:09 #9
og vi anvender send til at skrive til sockets...
04. december 2000 - 13:09 #10
bruger du så ikke CSocket / CAsyncSocket ??
Avatar billede stringbuffer Nybegynder
04. december 2000 - 15:12 #11
char *signon  = LOGIN \"\\n\" PASSWORD \"\\n1\\n\";
char *signoff = LOGIN \"\\n\" PASSWORD \"\\n1\\n\";;

hvad skulle meningen i de 2 linier være?
Det ligner umiddelbart en masse syntaksfejl
04. december 2000 - 15:17 #12
ok! under signoff skulle der ikke have stået 2 - og ikke 1 !! Men de skal da bruges til at sende til serveren LOGIN og PASSWORD er defineret ovenfor til at være xxxxx og yyyyy!!
kig i koden...
Avatar billede stringbuffer Nybegynder
04. december 2000 - 15:20 #13
OOps, overså dine #defines... sorry
07. december 2000 - 21:47 #14
Nu har jeg selv fundet en løsning! Det viste sig at være nemmest med CSocket og funktionerne Send & Receive....Det var også det jeg selv havde prøvet først - for der slap jeg for at resolve remotehost; det var bare med forkert PORT nummer -159 istedet for 259 DOUGH!!

moykal -> du får imidlertid lidt point! for du fik mig til at prøve med csocket igen!!
07. december 2000 - 21:50 #15
HOV! moykal -> du har ikke svaret på noget siden jeg afviste dit svar!! Nå 20 point kan du vel undvære ?? ellers svar obskurt på et hvilket som helst af mine spm. og du får de 20 point - OK?
Avatar billede moykal Nybegynder
08. december 2000 - 02:31 #16
Jeg er nok alligevel ikke helt værdig til at modtage points. Jeg har jo i grunden ikke givet dig noget konkret du kunne bruge til noget, så vi må hellere lade det blive ved det. Ellers tak. Glad for at du selv kom videre. Held og lykke med det. Og KOM SÅ VIDERE TIL .NET... så skal du ikke tænke på alt det low-level skidt. Det, der irriterer mig mest med sockets - uden at have den store praktiske erfaring med det - er, at det i grunden er lidt svært at lave generelle biblioteker (hvilket jeg prøvede - men fejlede - at refere til at en eller anden gut endeligt havde lavet), der blot anvendte socketlib og virkede. Min - noget tidligere erfaring fra Linux og UNIX har været, at der har været en masse hardcodede konstanter i bibliotekerne, såsom hvor mange samtidige listeners etc., at opgaven at generalisere var umulig, hvis det altså skulle gøres ordentligt. Men... fuck det... og hyg dig...
Avatar billede jbh Nybegynder
13. november 2001 - 13:49 #17
En anden ting:

Selv om du får det til at kompilere, så vil du ikke komme ret langt med koden pga. følgende:

if ((him = gethostbyname(\"192.168.30.2\")) == NULL)
        return;

gethostbyname tager ikke ip-numre og vil altid returnere NULL, jvf.:

\"The gethostbyname function cannot resolve IP address strings passed to it. Such a request is treated exactly as if an unknown host name were passed.\"
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