Avatar billede mathiash Nybegynder
30. juli 2005 - 23:09 Der er 15 kommentarer og
1 løsning

winsock visual c++

Hej!

Søger et eksempel på en kode
der bruger winsock.

Som henter en tekst fra en hjemmeside med GET.

Skal bruge det med win32 api.

På forhånd tak
Mathias Hansen
Avatar billede arne_v Ekspert
30. juli 2005 - 23:14 #1
sådan er eksempel har jeg på lager:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

#include <windows.h>
#include <errno.h>

void get(char *hostname,int port,char *path)
{
  int sd,status,len,ix,tmp;
  char cmd[512],resp[51200];
  struct sockaddr local,remote;
  struct hostent *hostinfo;
  /* create socket */
  sd=socket(AF_INET,SOCK_STREAM,0);
  if(sd<0) {
      printf("Error creating socket: %s\n",strerror(errno));
      goto fin;
  }
  /* bind socket */
  local.sa_family=AF_INET;
  memset(local.sa_data,0,sizeof(local.sa_data));
  status=bind(sd,&local,sizeof(local));
  if(status<0) {
      printf("Error binding socket: %s\n",strerror(errno));
      goto fin;
  }
  /* lookup host */
  hostinfo=gethostbyname(hostname);
  if(!hostinfo) {
      printf("Error looking up host: %s\n",hostname);
      goto fin;
  }
  /* connect to host */
  remote.sa_family=hostinfo->h_addrtype;
  memcpy(remote.sa_data+2,hostinfo->h_addr_list[0],hostinfo->h_length);
  *((short *)remote.sa_data)=port;
  tmp=remote.sa_data[0];
  remote.sa_data[0]=remote.sa_data[1];
  remote.sa_data[1]=tmp;
  status=connect(sd,&remote,sizeof(remote));
  if(status!=0) {
      printf("Error connecting to host: %s port: %d\n",hostname,port);
      goto fin;
  }
  /* send GET request */
  sprintf(cmd,"GET %s HTTP/1.1\r\nHost: %s\r\n\r\n",path,hostname);
  status=send(sd,cmd,strlen(cmd),0);
  if(status<0) {
      printf("Error sending GET request\n");
      goto fin;
  }
  /* read response */
  ix=0;
  while ((len=recv(sd,resp+ix,sizeof(resp)-ix-1,0))>0) {
      ix = ix + len;
  }
  resp[ix]='\0';
  printf("%s",resp);
fin:
  closesocket(sd);
  return;
}

int main(int argc,char *argv[])
{
  WSADATA WSAData;
  WSAStartup(0x0101,&WSAData);
  get("www.eksperten.dk",80,"/");
  WSACleanup();
  return 0;
}
Avatar billede mathiash Nybegynder
30. juli 2005 - 23:40 #2
Æv bæv

----------------
C:\Programmer\Microsoft Visual Studio\MyProjects\Login\Login.cpp(232) : error C2079: 'local' uses undefined struct 'sockaddr'
C:\Programmer\Microsoft Visual Studio\MyProjects\Login\Login.cpp(232) : error C2079: 'remote' uses undefined struct 'sockaddr'
C:\Programmer\Microsoft Visual Studio\MyProjects\Login\Login.cpp(235) : error C2065: 'socket' : undeclared identifier
C:\Programmer\Microsoft Visual Studio\MyProjects\Login\Login.cpp(235) : error C2065: 'AF_INET' : undeclared identifier
C:\Programmer\Microsoft Visual Studio\MyProjects\Login\Login.cpp(235) : error C2065: 'SOCK_STREAM' : undeclared identifier
C:\Programmer\Microsoft Visual Studio\MyProjects\Login\Login.cpp(241) : error C2228: left of '.sa_family' must have class/struct/union type
C:\Programmer\Microsoft Visual Studio\MyProjects\Login\Login.cpp(242) : error C2228: left of '.sa_data' must have class/struct/union type
C:\Programmer\Microsoft Visual Studio\MyProjects\Login\Login.cpp(242) : error C2228: left of '.sa_data' must have class/struct/union type
C:\Programmer\Microsoft Visual Studio\MyProjects\Login\Login.cpp(243) : error C2065: 'bind' : undeclared identifier
C:\Programmer\Microsoft Visual Studio\MyProjects\Login\Login.cpp(249) : error C2065: 'gethostbyname' : undeclared identifier
C:\Programmer\Microsoft Visual Studio\MyProjects\Login\Login.cpp(249) : error C2440: '=' : cannot convert from 'int' to 'struct get::hostent *'
        Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast
C:\Programmer\Microsoft Visual Studio\MyProjects\Login\Login.cpp(255) : error C2228: left of '.sa_family' must have class/struct/union type
C:\Programmer\Microsoft Visual Studio\MyProjects\Login\Login.cpp(255) : error C2027: use of undefined type 'hostent'
        C:\Programmer\Microsoft Visual Studio\MyProjects\Login\Login.cpp(233) : see declaration of 'hostent'
C:\Programmer\Microsoft Visual Studio\MyProjects\Login\Login.cpp(255) : error C2227: left of '->h_addrtype' must point to class/struct/union
C:\Programmer\Microsoft Visual Studio\MyProjects\Login\Login.cpp(256) : error C2228: left of '.sa_data' must have class/struct/union type
C:\Programmer\Microsoft Visual Studio\MyProjects\Login\Login.cpp(256) : error C2027: use of undefined type 'hostent'
        C:\Programmer\Microsoft Visual Studio\MyProjects\Login\Login.cpp(233) : see declaration of 'hostent'
C:\Programmer\Microsoft Visual Studio\MyProjects\Login\Login.cpp(256) : error C2227: left of '->h_addr_list' must point to class/struct/union
C:\Programmer\Microsoft Visual Studio\MyProjects\Login\Login.cpp(256) : error C2027: use of undefined type 'hostent'
        C:\Programmer\Microsoft Visual Studio\MyProjects\Login\Login.cpp(233) : see declaration of 'hostent'
C:\Programmer\Microsoft Visual Studio\MyProjects\Login\Login.cpp(256) : error C2227: left of '->h_length' must point to class/struct/union
C:\Programmer\Microsoft Visual Studio\MyProjects\Login\Login.cpp(257) : error C2228: left of '.sa_data' must have class/struct/union type
C:\Programmer\Microsoft Visual Studio\MyProjects\Login\Login.cpp(258) : error C2228: left of '.sa_data' must have class/struct/union type
C:\Programmer\Microsoft Visual Studio\MyProjects\Login\Login.cpp(259) : error C2228: left of '.sa_data' must have class/struct/union type
C:\Programmer\Microsoft Visual Studio\MyProjects\Login\Login.cpp(259) : error C2228: left of '.sa_data' must have class/struct/union type
C:\Programmer\Microsoft Visual Studio\MyProjects\Login\Login.cpp(260) : error C2228: left of '.sa_data' must have class/struct/union type
C:\Programmer\Microsoft Visual Studio\MyProjects\Login\Login.cpp(261) : error C2065: 'connect' : undeclared identifier
C:\Programmer\Microsoft Visual Studio\MyProjects\Login\Login.cpp(268) : error C2065: 'send' : undeclared identifier
C:\Programmer\Microsoft Visual Studio\MyProjects\Login\Login.cpp(275) : error C2065: 'recv' : undeclared identifier
C:\Programmer\Microsoft Visual Studio\MyProjects\Login\Login.cpp(281) : error C2065: 'closesocket' : undeclared identifier

Det var godt nok en del?
Avatar billede arne_v Ekspert
30. juli 2005 - 23:43 #3
De burde blive erklæret i windows.h (en af de .h filer som windows.h inkluderer)
Avatar billede arne_v Ekspert
30. juli 2005 - 23:44 #4
Visual Studio 6 eller en Visual Studio .NET ?

Og du har en windows.h ikke ?
Avatar billede mathiash Nybegynder
30. juli 2005 - 23:48 #5
Visual Studio 6
Og er inkluderet
Avatar billede arne_v Ekspert
30. juli 2005 - 23:52 #6
Hvad sker der hvis du inkluderer Winsock2.h ?
Avatar billede mathiash Nybegynder
30. juli 2005 - 23:53 #7
Amn for fanden har brugt hele aftenen på dine eksempler du har postet
og så en lille include man!

Du laver lige et svar! :D
Avatar billede arne_v Ekspert
30. juli 2005 - 23:55 #8
ok
Avatar billede mathiash Nybegynder
30. juli 2005 - 23:55 #9
Lige en sidste ting.
Har 2 variabler:
brugernavn og kodeord og den skal hente
get("matisen.dk", 80, "/srv/login?b=_brugernavn_&p=_kodeord_");

Parse = how? :)
Avatar billede arne_v Ekspert
30. juli 2005 - 23:58 #10
du formaterer bare med gode gamle sprintf:

char path[1000];
sprintf(path,""/srv/login?b=%s&p=%s",_brugernavn_,_kodeord_);

kalder med path som argument til get

i get skal du ikke gøre noget specielt - lige ud af landevejen - hvis det var
POST og ikke GET skulle du modificere lidt
Avatar billede mathiash Nybegynder
31. juli 2005 - 00:01 #11
Det er GET så det er fint!

Tak arne!
Avatar billede mathiash Nybegynder
31. juli 2005 - 00:07 #12
Bruger din funktion i en anden funktion.
C:\Programmer\Microsoft Visual Studio\MyProjects\Login\Login.cpp(222) : error C2065: 'get' : undeclared identifier
C:\Programmer\Microsoft Visual Studio\MyProjects\Login\Login.cpp(237) : error C2373: 'get' : redefinition; different type modifiers

Det er da kun public variabler man skal declare før man bruger dem i en funktion?
Avatar billede mathiash Nybegynder
31. juli 2005 - 00:08 #13
Bruger:
char path[1000];
sprintf(path,"/srv/login?b=%s&p=%s", brugernavn, kodeord);
get("matisen.dk", 80, path);
Avatar billede arne_v Ekspert
31. juli 2005 - 00:09 #14
Du skal enten:

...
void get(char *hostname,int port,char *path) {
  ...
}
...
get(...);
...

eller:

...
void get(char *hostname,int port,char *path);
...
get(...);
...
void get(char *hostname,int port,char *path) {
  ...
}
...
Avatar billede arne_v Ekspert
31. juli 2005 - 00:10 #15
hvis ellers det er til at forstå med alle de ...

:-)
Avatar billede mathiash Nybegynder
31. juli 2005 - 00:12 #16
Arne, jeg ved simpelthen ikke hvad eksperten ville være uden dig.

Tak! :)
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