C und probleme mit Socket

Navigator

OpenBSD Newbie
So für mein Programm was ich derzeit schreibe sammele ich Informationen und wollte diese dann an eine Webseite senden.

Also hab ich mir ein paar Tutorials zu socket angeschaut die auf Unix / Linux aufbauen aber ich komme im moment nicht weiter mit diesem Code den ich eigentlich 1 zu 1 abgeschrieben habe bekomme ich beim Compilern fehler wo ich nicht weiß wieso, laut dem Tutorial sollte es klappen.

# gcc -o t2 t2.c
t2.c: In function `main':
t2.c:13: error: syntax error before ';' token
t2.c:21: warning: assignment from incompatible pointer type
t2.c:24: error: dereferencing pointer to incomplete type
t2.c:24: error: dereferencing pointer to incomplete type
t2.c:27: error: invalid lvalue in unary `&'
t2.c:27: warning: passing arg 2 of `connect' from incompatible pointer type

der Code:

Code:
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>

#define PORT 80;
#define BUF_SIZE 1024;

int main()
{
  int sock;
  char buf[BUF_SIZE];
  struct sockaddr_in server;
  struct host *hp;
  
  sock = socket( AF_INET, SOCK_STREAM, 0);
  if (sock < 0) { printError("ERROR F001: can't get a socket\n"); exit(1); }
  
  server.sin_family = AF_INET;
  hp = gethostbyname("exp-soft.de");
  if (hp = NULL) { printError("ERROR F002: can't get the host\n"); close(sock); exit(1); }
  
  bcopy(hp->h_addr, &server.sin_addr, hp->h_length);
  server.sin_port = PORT;
  
  if (connect(sock,&server,sizeof(struct sockaddr_in)) < 0);
  {
    printf("ERROR F003: can't connect!\n");
  }
  
  close(sock);
  return(0);
}

kann mir da ggf einer Weiterhelfen und erklären wieso das so nicht funktioniert? oder ggf. auch nicht funktionieren kann? :confused:

:)
 
hi,

also

#define PORT 80;
#define BUF_SIZE 1024;

sollte wohl

#define PORT 80
#define BUF_SIZE 1024

also ohne die ";" am ende heissen.

ausserdem brauchst du

#include <stdlib.h> für die exit-funktion.
#include <strings.h> für die bcopy-funktion

gethostbyname() liefert einen pointer auf struct hostent (nicht: host) zurück,
und im aufruf von connect() musst du die sockaddr_in explizit auf sockaddr casten.

ach ja, solltest vielleicht "IPPROTO_TCP" für socket() nehmen.

und die printError()-funktion noch schreiben :) oder anstatt dessen "perror" nehmen.

ach ja, und "if (hp = NULL)" durch "if (hp == NULL)" austauschen !!!!

der endgültige code wäre dann:

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>

#define PORT 80
#define BUF_SIZE 1024

int main()
{
int sock;
char buf[BUF_SIZE];
struct sockaddr_in server;
struct hostent *hp;

sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sock < 0) { perror("ERROR F001: can't get a socket\n"); exit(1); }

server.sin_family = AF_INET;
hp = gethostbyname("exp-soft.de");
if (hp == NULL) { perror("ERROR F002: can't get the host\n"); close(sock); exit(1); }

bcopy(hp->h_addr, &server.sin_addr, hp->h_length);
server.sin_port = PORT;

if (connect(sock,(struct sockaddr*)&server,sizeof(struct sockaddr_in)) < 0);
{
printf("ERROR F003: can't connect!\n");
}

close(sock);
return(0);
}
 
Zuletzt bearbeitet von einem Moderator:
besten dank, ok nun baut er auch die verbindung usw.. auf..

kann mir ggf noch einer sagen ob es in C eine function gibt mit der ich eine integerzahl sagen wir int a = 157; in Char umwandeln kann das die variable char *tmp = "157" dannach hätte?

hatte schonmal bisel gegoogelt aber weder tmp = (char)a; noch

char *tmp1;
int a = 157;
itoa(a,tmp1,10);

führen zum erfolg.

Thx for help schonmal :)
 
muss das
Code:
  if (connect(sock,(struct sockaddr*)&server,sizeof(struct sockaddr_in)) < 0);
  {
    printf("ERROR F003: can't connect!\n");
  }
nicht eher
Code:
  if (connect(sock,(struct sockaddr*)&server,sizeof(struct sockaddr_in)) < 0)
  {
    printf("ERROR F003: can't connect!\n");
  }
heissen ???? (also ohne dem ; am ende der if?)
 
kann mir ggf noch einer sagen ob es in C eine function gibt mit der ich eine integerzahl sagen wir int a = 157; in Char umwandeln kann das die variable char *tmp = "157" dannach hätte?

Code:
char tmp[20];
int a = 157;
snprintf(tmp,sizeof(tmp),"%d",a);

für mehr informationen, siehe printf(3)

auf bald
oenone
 
Code:
char tmp[20];
int a = 157;
snprintf(tmp,sizeof(tmp),"%d",a);

für mehr informationen, siehe printf(3)

auf bald
oenone

ok nein ok ich brauch den wert defenetif in der variable..

weil:

Code:
char *buf1, *buf2;

buf1 = "Ganz viel Text"
          "und hier noch mehr"
          "und hier (157) zwischen soll die zahl hinkommen";
buf2 = "Hier auch wieder Text"

und am ende werden buf1 & buf2 zusammen gehangen und an einen webserver gesendet.

da werde ich printf nicht verwenden aber dann auch nochmal was anderes lese so oft snprintf wo ist da der unterschied zu printf :confused:

Gruß Navigator :)
 
ok das ist fein, danke dir gibt wohl sehr viele wege etwas in C zu verwirklichen :)

ich hoffe es ist nicht störend wenn ich noch eine frage los lasse :)


ich versuche nun meine beiden variabeln zusammen zu bringen das habe ich wie folgt versucht:

Code:
buf3 = buf, buf2;
// oder

buf3 = buf + buf2;  // <- ok das wirklich arg BASIC gedacht, aber naja dachte es könnte gehen.

strcat(buf,buf2);

edit: snprintf(buf3,sizeof(buf3),"%s%s",buf,buf2); // naja hatte leider auch kein erfolg.

erstes übergibt zwar buf aber ignoriert buf2
zweites funzt auch nicht da sagt mir GCC ich kann nicht mit binarys rechnen oder sowas in der art.
und letztes habe ich durch google mal bisel in erfahrung gebracht leider sagt mir aber der compiler ich solle anstatt strcat srtlcat nutzen was dann wiederum aber auch ein fehler ergibt.

ich meine gut ich bin wirklich noch blutiger anfänger in sachen C und warscheinlich denke ich noch zuviel im BASIC dialekt aber hab ich nun einfach einen denkfehler oder wieso ist es so schwer 2 zeichenketten zusammen zu bringen? :)

Gruß Navigator. :)

edit: so hatte es auch nochmal mit snprintf versucht da bricht das programm aber leider mit einem : Segmentation faulet ab. :-/
 
Zuletzt bearbeitet:
Abend

Lösung:
Code:
#include<stdio.h>

int main(int argc,char*argv[]){
/* Die Zeichenketten:*/
  char buf[256]="hello";
  char buf2[256]="world";
  char buf3[256];

/* Das Zusammensetzen:*/
  strcpy(buf3,buf);
  strcat(buf3," ");
  strcat(buf3,buf2);

/* Die ausgabe auf den stdin:*/
  printf("%s\n",buf3);
}
Compilieren und Ausführen unter FreeBSD:
Code:
$ gcc main.c -o app
$ ./app

ich meine gut ich bin wirklich noch blutiger anfänger in sachen C und warscheinlich denke ich noch zuviel im BASIC dialekt aber hab ich nun einfach einen denkfehler oder wieso ist es so schwer 2 zeichenketten zusammen zu bringen? :)

Ich empfehle dir zuerst mal die Basics von C anzueignen. Dabei kann ich dir das OpenBook C von A bis Z empfehlen (Als Lehrwerk wie auch Referenz), es ist ein über 1000 Seiten Buch über C und komlpett Kostenlos.
Wenn du doch an die Socket ran willst, gibts noch das OpenBook Linux-Unix-Programmierung, Kapitel 10 sollte weiter Helfen.

Gruss
bsdagent
 
Zuletzt bearbeitet:
Besten dank, allerdings das hatte ich auch schon raus, allerdings ist das nicht die Lösung zu meinem Problem den das klappt ja nur bei kleinen strings ich muss allerdings folgendes zusammen bekommen:

Code:
#include <stdio.h
#include <string.h>

int main()
{
 char *buf, *buf2, *buf3;

 buf =                "POST /insert.php HTTP/1.1\r\n"
			"Host: exp-soft.de\r\n"
			"Accept: text/html, */*\r\n"
			"Accept-Encoding: identity\r\n"
			"Accept-Language: de\r\n"
			"Connection: close\r\n"
			"User-Agent: "VERSION"\r\n"
			"Content-Type: application/x-www-form-urlencoded\r\n"
			"Content-Length: %i\r\n"
			"\r\n";
 buf2 =              "user=username&pass=passwort&zeile1=zeile1&zeile2=zeile2usw..."

 // funktion damit der inhalt von buf1, buf2 in buf3 steht.
 return 0;
}

Das Buch C von A - Z ist auch seit ich mit C angefangen habe meine ständige referenz.
allerdings bin ich weniger ein typ der durchs lesen lernt sondern viel mehr durchs ausprobieren und durch gezeigt bekommen durch praktischen beispielen.

im buch steht zwar auch ungefair genau das was du mir gezeigt hast allerdings nicht mit char variabeln die *VAR heissen.

*buf glaube ich zumindest kann recht große strings in ihr reinpacken, und mit buf[255] wäre der platz denke ich nicht ausreichend, oder irre ich da?

Gruß Navigator.
 
Du kannst doch einfach Platz dynamisch vom Heap reservieren. Und ob die Dinger buf oder var heißen ist doch vollkommen egal.
 
Morgen

im buch steht zwar auch ungefair genau das was du mir gezeigt hast allerdings nicht mit char variabeln die *VAR heissen.

Wie Kamikaze schon erwähnt, es ist egal wie die Variablen heissen, dass Zeichen * bedeutet nur, dass es sich um ein Zeiger handelt. Ein Zeiger kann eben Speicher dynamisch belegen:

Code:
#define STRING_SIZE 1024
char*buf=(char*)malloc(sizeof(char)*STRING_SIZE);

Wenn du besser mit Beispielen lernst, kauf dir ein C Buch das genau dafür ausgerichtet ist, denn so wird das nichts.

Gruss
bsdagent
 
ok das der name der Variable zum größten teil egal ist bis auf die paar reservierten namen das weiss ich, was ich nicht wusste ist das mit den Zeigern, was ich nun aber nicht verstehe wieso strcat nicht mit der dynamischen speicherbelegung klar kommt hingegen aber mit festen werten. ?

gibt es da einen bestimmten grund?

P.s: ich habe mindestens nun 2 C Bücher und 1 C++ buch :)
 
Morgen

Code:
Code:
#include<stdio.h>

int main(int argc,char*argv[]){
  char*text=(char*)malloc(sizeof(char)*256);
  strcpy(text,"hello");
  strcat(text," ");
  strcat(text,"world");
  printf("%s\n",text);
  return 0;
}

P.s: ich habe mindestens nun 2 C Bücher und 1 C++ buch :)

Das ist Grundlage in C, wenn du 2 C Bücher hast, dann währe eine wiederholung des Kapitels Zeiger und Dynamische Speicherbelegung absolut nötig.

Gruss
bsdagent
 
Morgen

Kannst damit mal versuchen, oder eines deiner C Bücher nehmen. Ich selbst hab das OpenBook C von A bis Z nie gelesen. Ich selbst verwende ausschliesslich die C Referenz (ISBN 3-8266-0732-5) oder um mal kurz nachschauen reicht meist auch in google "strcpy" oder "strcat". Und ja, ohne Theorie gehts generell wirklich net, genauso wie auch ohne Bsp. es mit sicherheit net gehen wird.

Gruss
bsdagent
 
Naja wie gesagt erstmal besten dank an alle die mir so nett geholfen haben ich werd dann mal die Kapitel durchlesen.

aber ich denke ich nehme das OpenBook denn das erste C buch ist für Amiga und das Zweite ist auch nicht gerade neu setzt auf Turbo-C auf und is von 1991

Ich werd dann mal mit dem lesen anfangen und hoffe es dann bisel zu verstehen wenn ich dann nochmal fragen habe melde ich mich dann in nem neuen Thread wieder, ich glaube wir sind hier schon ganzschön vom thema abgekommen im grunde gings ja um socktest :)

Gruß Navigator.
 
Hi

das erste C buch ist für Amiga und das Zweite ist auch nicht gerade neu setzt auf Turbo-C auf und is von 1991

C wurde soweit ich informiert bin nur eimal erweitert, nämlich von C89 auf C99. Somit müssten die Bücher eigentlich C89 konform sein, wobei die aussage auf "eigentlich" bleibt.

Gruss
bsdagent
 
Zuletzt bearbeitet:
Hi
C wurde soweit ich informiert bin nur eimal erweitert, nämlich von C89 auf C99. Somit müssten die Bücher eigentlich C89 konform sein, wobei die aussage auf "eigentlich" bleibt.

Gruss
bsdagent

Jup das hab ich auch schon gelesen das es Zwei standards gibt einmal den C89 und den C99 allerdings ist das buch auf den MS C-Turbo Compiler ausgerichtet...

ka obs zu dem Zeitpunkt auch schon so war aber ich gehe im moment davon aus das MS auch schon zu der Zeit versucht hat seinen eigenen Standard zu etablieren und das C ggf nicht ganz C89 Compatibel ist? ich weiss es nicht genau über VC++ weiss ich das es da auch eigenheiten geben soll und die IE interpretiert ja auch gerne alles anders als es der Standard vorgibt

Naja wenn ich mich entscheiden sollte noch ein neueres C Buch zu kaufen was recht viele Beispiele enthält und nicht 30 Seiten mit Theorie kommt und dann mal nen Beispiel..

Welches könnte man mir da allgemein empfehlen?

möglichst auch kein 1000 seiten Schinken da leg ich das buch nach der 10ten seite sicher wieder zur seite :D

Gruß Navigator.
 
Hi

M$ hat kein eigenen Standard (noch nie ein Dokument von M$ eigenen C Standard gehört bzw. gesehen), wenn schon haben sie den C89 bzw. C99 Standard ignoriert. Empfehlen kann ich keins, da es schon eine weile her ist als ich ein Lehrbuch für C benutzte. Doch vieleicht helfen dir ja die Rezensionen der jeweiligen Buch Online-Shops weiter, dort wird generell von lesern erwähnt, ob das C Buch zuviel Theorie oder fehlerhafte Bsp. etc. hat.

Gruss
bsdagent
 
Zurück
Oben