Avatar billede walker Nybegynder
28. august 2003 - 13:11 Der er 5 kommentarer og
1 løsning

Socket connections?

Hej
kan nogen forklare mig hvordan jeg laver en socket server og connection i c++? Jeg kommer fra java, og er vandt til at bruge så simple klasser som Socket og ServerSocket...
Avatar billede arne_v Ekspert
28. august 2003 - 13:17 #1
Grundliggend evirker socket slige sådan i C man skal bare skrive meget
mere kode.

Her er et lille eksempel på noget kode:

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

#include <sys/socket.h>
#include <fcntl.h>
#include <netdb.h>
#include <errno.h>

void get(char *hostname,int port,char *path,int noblock)
{
  int sd,status,len,ix,tmp;
  char cmd[512],resp[51200];
  struct sockaddr local,remote;
  struct hostent *hostinfo;
  time_t t;
  /* 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 POST request\n");
      goto fin;
  }
  /* read response */
  ix=0;
  if(noblock) {
      status=fcntl(sd,F_SETFL,O_NONBLOCK);
      if(status<0) {
        printf("Error setting socket nonblocked: %s\n",strerror(errno));
        goto fin;
      }
      t=time(NULL);
      while (time(NULL)<(t+5)) {
        len=recv(sd,resp+ix,sizeof(resp)-ix-1,0);
        ix = ix + len;
        printf("no blocking read %d bytes\n",len);
        sleep(1);
      }
  } else {
      while ((len=recv(sd,resp+ix,sizeof(resp)-ix-1,0))>0) {
        ix = ix + len;
        printf("blocking read %d bytes\n",len);
      }
  }
  resp[ix]='\0';
  /*printf("%s",resp);*/
fin:
  close(sd);
  return;
}

Det henter en fil via HTTP og kan gøre det både blocking og non-blocking.
Avatar billede walker Nybegynder
28. august 2003 - 13:22 #2
yak! det var noget af en mundfuld... jeg kikker lige på det *S*
Avatar billede walker Nybegynder
28. august 2003 - 13:49 #3
Øh, har lige 2 spsm til koden indtil vidre:
Hvad gør funktionen memset?
og så forstår jeg ikke helt de parametre som bliver sendt ind i funktionen recv...?
Avatar billede arne_v Ekspert
28. august 2003 - 14:44 #4
memset sætter nogle bytes til en bestemt værdi (ofte og ogso i dette
tilfælde nul).
Avatar billede arne_v Ekspert
28. august 2003 - 14:45 #5
recv argumenter:
  socket
  buffer
  buffer size
  flags
Avatar billede jakobdo Ekspert
29. august 2003 - 15:06 #6
I stedet for recv og send kan også bruge read og write...
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