Avatar billede morteeart Nybegynder
24. oktober 2004 - 23:25 Der er 11 kommentarer og
1 løsning

simpelt socket connect

hej

Hvordan kan jeg lave et simpelt sockets connect ?
bare ligsom telnet.

formålet er at forbinde til en irc server.
Avatar billede arne_v Ekspert
24. oktober 2004 - 23:29 #1
Windows eller Linux ?
Avatar billede morteeart Nybegynder
24. oktober 2004 - 23:30 #2
windows
Avatar billede arne_v Ekspert
24. oktober 2004 - 23:34 #3
Eksempel:

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

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

void doit(char *hostname,int port)
{
  FILE *fp;
  int sd,status,len,first,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 request */
  sprintf(cmd,"%s\r\n","Kuk kuk");
  status=send(sd,cmd,strlen(cmd),0);
  if(status<0) {
      printf("Error sending request\n");
      goto fin;
  }
  /* read response */
  while ((len=recv(sd,resp,sizeof(resp),0))>0) {
      printf("%s",resp);
  }
fin:
  closesocket(sd);
  return;
}

int main(int argc,char *argv[])
{
  WSADATA WSAData;
  WSAStartup(0x0101,&WSAData);
  doit("xxx.domain.dk",12345);
  WSACleanup();
  return 0;
}
Avatar billede arne_v Ekspert
24. oktober 2004 - 23:34 #4
Connecter til xxx.domain.dk port 12345 og sender "kuk kuk\r\n" og printer svaret.

Det skal nok tilrettes lidt.

:-)
Avatar billede morteeart Nybegynder
24. oktober 2004 - 23:44 #5
mange tak.

jeg har prøvet at compile det, men får sådan en sjov fejl her, og jeg har ingen ide om hvad den betyder.

[Linker error] undefined reference to `socket@12'

og btw. så må du godt lægge et svar
Avatar billede arne_v Ekspert
24. oktober 2004 - 23:45 #6
Du skal linke mod ws2_32.lib eller ws2_32.a (afhængig af compiler).
Avatar billede arne_v Ekspert
24. oktober 2004 - 23:45 #7
svar
Avatar billede arne_v Ekspert
24. oktober 2004 - 23:45 #8
Hvad compiler bruger du ?
Avatar billede morteeart Nybegynder
24. oktober 2004 - 23:46 #9
dev-cpp
Avatar billede arne_v Ekspert
24. oktober 2004 - 23:48 #10
Project
Project Options
Parameters
Linker
Add

tror jeg
Avatar billede arne_v Ekspert
24. oktober 2004 - 23:50 #11
ikke Add

bare ind i Linke rboksen og skriv -lws2_32

(4.9.9.0)
Avatar billede morteeart Nybegynder
24. oktober 2004 - 23:56 #12
jah, nu virker tak :)

igen mange 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