Avatar billede grydgaard Nybegynder
25. januar 2006 - 13:58 Der er 22 kommentarer og
1 løsning

netværks program i linux

hejsa.

jeg er en fyr som står og mangler et konsolprogram til linux som skal lave en pakke ud fra 2 parametre og sende den til en server. jeg har lavet dette program i dos men da jeg har skiftet min windows server ud med en linux server så skal jeg have lavet det igen men kan ikke programmere i linux. er det nogen det kan lave det for mig eller måske hjælpe mig med at lave det?

data pakken skal se sådan her ud:  |sms|parameret1|parameter2
dvs... det skal starte med | og mellem de første 2 skal der stå SMS og de 2 paramerer skal også sebereres af |.

ip'en som pakken skal sendes til er 10.0.0.250 og porten den skal bruge er 8000.

dette program er til en hjemmelavet sms-gateway. jeg håber at jeg kan få lidt hjælp eller et lille konsolprogram ;)

hilsen tommy
Avatar billede arne_v Ekspert
25. januar 2006 - 17:46 #1
hvis du har brugt det raa winsocket interface er det nemt at portere
fra windows til linux !

andre header filer

erstat closesocket kaldet med et close kald
Avatar billede arne_v Ekspert
25. januar 2006 - 17:51 #2
jeg kan godt finde det samme eksempel i windows og linux version
hvis du vil
Avatar billede grydgaard Nybegynder
26. januar 2006 - 13:41 #3
det ville være meget dejligt. skal også bare lige have fundet ud af hvordan jeg skal compile filerne... :S jeg har på fornemmelsen at php vil brokke sik temmelig meget hvis jeg ikke laver det til at gyldigt program ;)
Avatar billede arne_v Ekspert
27. januar 2006 - 04:40 #4
det er et stykke screen scraping kode
Avatar billede arne_v Ekspert
27. januar 2006 - 04:40 #5
#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],*p1,*p2,seg[1024];
  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;
  while ((len=recv(sd,resp+ix,sizeof(resp)-ix-1,0))>0) {
      ix = ix + len;
  }
  resp[ix]='\0';
  p1=strstr(resp,"TR&AElig;KNING");
  p2=strstr(p1,"P R &AElig; M I E R");
  strncpy(seg,p1,p2-p1);
  seg[p2-p1]='\0';
  printf("%s\n",seg);
fin:
  closesocket(sd);
  return;
}

int main(int argc,char *argv[])
{
  WSADATA WSAData;
  WSAStartup(0x0101,&WSAData);
  get("www.dr.dk",80,"/cgi-bin/fttx1.exe/291");
  WSACleanup();
  return 0;
}
Avatar billede arne_v Ekspert
27. januar 2006 - 04:41 #6
#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 sd,status,len,ix,tmp;
  char cmd[512],resp[51200],*p1,*p2,seg[1024];
  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;
  while ((len=recv(sd,resp+ix,sizeof(resp)-ix-1,0))>0) {
      ix = ix + len;
  }
  resp[ix]='\0';
  p1=strstr(resp,"TR&AElig;KNING");
  p2=strstr(p1,"P R &AElig; M I E R");
  strncpy(seg,p1,p2-p1);
  seg[p2-p1]='\0';
  printf("%s\n",seg);
fin:
  close(sd);
  return;
}

int main(int argc,char *argv[])
{
  get("www.dr.dk",80,"/cgi-bin/fttx1.exe/291");
  return 0;
}
Avatar billede arne_v Ekspert
27. januar 2006 - 04:42 #7
det er vist nemt at se at de ligner hinanden meget
Avatar billede grydgaard Nybegynder
27. januar 2006 - 19:38 #8
jeg vil lige kigge på den på mandag og se om jeg kan få det til at virke ;) jeg skal nok holde dig underrettet med hvordan det går :)
Avatar billede grydgaard Nybegynder
31. januar 2006 - 11:05 #9
arne_v >> jeg har kigget på de 2 sourcecodes og kan også godt se at du ligner hinanden meget. jeg vil godt indrømme at jeg ikke har programmeret så meget i andet end MFC og PIC18 milliøer så er ikke så skrap til dos programmering. det sidste kolsol program jeg lavede har stadig en masse overskydende kode men jeg har ikke taget mig sammen til at rense den endnu. kan du komme med en meget simpelt løsning på hvordan jeg skal tage de 2 parametere og sende dem til en server? :) og husk at smide det som et svar ;)
Avatar billede mysund Nybegynder
01. februar 2006 - 00:08 #10
Hej grydgaard.
Jeg har lavet et lille TCL script der kan det du vil.

#her starter scriptet
#ret selv ip port til.
set serverip 192.168.11.10
set serverport 8000

if {$argc != 2} {
  puts "error: wrong number of arguments."
  exit
  }

set sock [socket $serverip $serverport]
puts $sock "|sms|[lindex $argv 0]|[lindex $argv 1]"
close $sock
#Her er scriptet allerede slut hvilket er lidt vemodigt, når man kan li' tcl.
#
Scriptet (sms.tcl) køres med:
tclsh ./sms.tcl argument1 argument2
Jeg har testet det af fra en SME 6.0.1 server (afsender) til en WinXP PC (modtager).

Håber du ka bruge det til noget.
Avatar billede mysund Nybegynder
01. februar 2006 - 00:15 #11
Hej Igen

Da du siger det er en linux server, går jeg udfra at du allerede har tcl installeret, ellers kan du finde det på: http://www.activestate.com/Products/ActiveTcl/
gå efter 8.4.12 versionen 8.5 er ikke klar endnu.
Avatar billede arne_v Ekspert
01. februar 2006 - 02:00 #12
sprintf(cmd,"GET %s HTTP/1.1\r\nHost: %s\r\n\r\n",path,hostname);

skal vel rettes til

sprintf(cmd,"|sms|%s|%s\r\n",param1,param2);
Avatar billede arne_v Ekspert
01. februar 2006 - 02:05 #13
utestet copy paste:

#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 sms(char *hostname,int port,char *param1,char *param2)
{
  int sd,status,len,ix,tmp;
  char cmd[512],resp[51200],*p1,*p2,seg[1024];
  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 SMS request */
  sprintf(cmd,"|sms|%s|%s\r\n",param1,param2);
  status=send(sd,cmd,strlen(cmd),0);
  if(status<0) {
      printf("Error sending SMS 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';
  p1=strstr(resp,"TR&AElig;KNING");
  p2=strstr(p1,"P R &AElig; M I E R");
  strncpy(seg,p1,p2-p1);
  seg[p2-p1]='\0';
  printf("%s\n",seg);
fin:
  close(sd);
  return;
}

int main(int argc,char *argv[])
{
  sms("sms.yourdomain.dk",8000,"aaa","bbb");
  return 0;
}
Avatar billede arne_v Ekspert
01. februar 2006 - 02:06 #14
der er ogsaa andre sprog end Tcl som er nemmere at bruge til den slags kode end C
Avatar billede arne_v Ekspert
01. februar 2006 - 02:07 #15
og et svar fra mig
Avatar billede grydgaard Nybegynder
03. februar 2006 - 09:27 #16
beklager at jeg først nu har kigget på de 2 svar... min computer gik kold og måtte have en fuld formatering... prøvede dog på at rede den i 2 dage hvilket mislykkedes. jeg har lige kigget på begge koder og tror at jeg vil holde mig til arne_v's kode da jeg ikke er nok inde i linux til at vide hvad TCL er.
jeg har også lige rettet arne_v's kode lidt til... ;) men jeg tror den virker nu :D nu mangler jeg kun at teste den... dette regner jeg med at få gjort her i weekenden. skal nemlig lige have læst op på hvordan man compiler i linux :S har kun prøvet det en gang før.
Avatar billede mysund Nybegynder
03. februar 2006 - 22:36 #17
Hvis du har 2 minutter, kan du jo afprøve tcl versionen, som jeg allerede har testet. Du har højst sansynlig tcl installeret, da det er standart på de fleste linux distros. Du kan osse prøve på windows, hvis du installerer tcl dér. Tcl eller Tcl/Tk er platformsuafhængigt, gratis og "c" agtigt. Hvis du vil have et tcl script med en server socket til at modtage og vise data der bliver afsendt, så kan jeg hurtigt strikke det sammen.
Avatar billede arne_v Ekspert
03. februar 2006 - 22:50 #18
gcc foobar.c -o foobar
./foobar
Avatar billede grydgaard Nybegynder
09. februar 2006 - 11:09 #19
jeg modeficerede arne_v's kode lidt så den passede til formålet og nu virker det :D ange tak arne_v ;)
Avatar billede grydgaard Nybegynder
09. februar 2006 - 11:09 #20
mange*
Avatar billede grydgaard Nybegynder
02. marts 2006 - 11:16 #21
arne_v: davs igen. behøver lige din hjælp til at modificere denne kode lidt.. jeg vil gerne have lavet programmet om så jeg bare kan fyre denne kommando af fra php på min linux server:

sms 12345678 "dette er en besked"

er det noget du kan klare? kan nemlig ikke rigtig få det til at virke når jeg selv reter i koden. jeg er ikke helt sikker på hvad der gør hvad i den c kode du gav mig :S
Avatar billede grydgaard Nybegynder
02. marts 2006 - 11:20 #22
arne_v jeg har lige et eksempel på hvordan jeg havde tænkt mig at lave den main som skal være i programmet...

int main(int argc,char *argv[])
{
    sms("10.0.0.250",8000,argv[1],argv[2]);
    return 0;
}
Avatar billede arne_v Ekspert
02. marts 2006 - 15:21 #23
hvilken protokol skal det program bruge ?
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