PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : simple client Anwedung



ca_sc
14.11.08, 21:31
Hallo Leute,

ich habe da ein kleines Problem. Ich versuche es zunaechst so genau wie moeglich zu erklaeren:
Ich moechte in die Socket Programmierung in C einsteigen. Dazu habe ich ein Programm aus dem Buch "Linux Programmierung" (Seite 512 - 513). Das Problem an der Sache ist das ich es nicht auf meinem System

gecko@Condor:~/fh_brb/eclipse_workspace/Betriebssysteme_Rechnernetze/Echo_Client/mySrc> uname -a
Linux Condor 2.6.27gecko_zero-default #3 SMP Sat Oct 18 11:09:02 CEST 2008 i686 i686 i386 GNU/Linux

kompilieren kann. Es erscheint folgende Fehlermeldung:

**** Build of configuration Debug for project Echo_Client ****

make all
Building file: ../mySrc/echo_client.c
Invoking: GCC C Compiler
gcc -O0 -g3 -Wall -c -fmessage-length=0 -ansi -MMD -MP -MF"mySrc/echo_client.d" -MT"mySrc/echo_client.d" -o"mySrc/echo_client.o" "../mySrc/echo_client.c"
Finished building: ../mySrc/echo_client.c

Building target: Echo_Client
Invoking: GCC C Linker
gcc -o"Echo_Client" ./mySrc/echo_client.o -lnsl
/usr/lib/gcc/i586-suse-linux/4.3/../../../../i586-suse-linux/bin/ld: errno: TLS definition in /lib/libc.so.6 section .tbss mismatches non-TLS reference in ./mySrc/echo_client.o
/lib/libc.so.6: could not read symbols: Bad value
collect2: ld returned 1 exit status
make: *** [Echo_Client] Fehler 1

Ich habe das Problem auch schon eingekreist. Zu naechst der Quelltext zum Programm:

#include <netdb.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

#define RECHNERNAME "kronos.fh-brandenburg.de"
#define PORT 7

int main(int argc, char** argv, char **envp){

extern int errno;
struct hostent *hostInfo;
struct servent *serviceInfo;
struct protoent *pInfo;
struct sockaddr_in connectTo;
char buf[81];
int lauf;
int n;
int _socket;

memset(&connectTo, 0, sizeof(connectTo));

if((hostInfo = gethostbyname(RECHNERNAME)) == NULL){
fprintf(stderr, "IP-Adresse von %s konnte nicht ermittelt werden!\n", RECHNERNAME);
_exit(1);
}

printf("Offizieller Rechnername: %s ;\n IP:", hostInfo->h_name);
for(lauf = 0; lauf < hostInfo->h_length; lauf++){
if(lauf > 0){
printf(".");
}
printf("%i", (unsigned char)hostInfo->h_addr[lauf]);
}
printf("\n");

if((serviceInfo = getservbyport(PORT, "tcp")) == NULL){
fprintf(stderr, "Kann Port %i nicht finden!\n", PORT);
_exit(2);
}
printf("TCP-Port von %s: %i\n", serviceInfo->s_name, ntohs(serviceInfo->s_port));
if((pInfo = getprotobyname("tcp")) == NULL){
printf("Kann Protokolleintrag nicht finden!\n");
_exit(3);
}
if((_socket = socket(AF_INET, SOCK_STREAM, pInfo->p_proto)) == -1){
printf("Konnte Socket nicht belegen!\n");
_exit(4);
}

connectTo.sin_family = AF_INET;
memcpy(&connectTo.sin_addr, hostInfo->h_addr, hostInfo->h_length);
connectTo.sin_port = serviceInfo->s_port;
if(connect(_socket, (struct sockaddr *)&connectTo, sizeof(connectTo)) == -1){
fprintf(stderr, "Keine Verbindung: %s!\n", strerror(errno));
_exit(5);
}

printf("\n");

close(_socket);
_exit(0);
}

Das Problem muss irgendwas mit den
connect(_socket, (struct sockaddr *)&connectTo, sizeof(connectTo)) zu tun habe. Wenn ich es bis dahin auskommentiere, dann uebersetzt er es ohne Probleme. Mit dem connect() aufruf gibt es arge Probleme. Nun aber zu einer Semi Loesung. Wenn ich das Programm, auf unserem SUN Server an der FH mit folgendem Befehl

gcc echo_client.c -o echo_client -lnsl -lsocket
uebersetze, dann rennt es da ohne Probleme. Ich habe schon herraus bekommen das, dass -lsocket auf dem SUN notwenig ist laut manual page. Wenn ich diese Library unter meinem System einbinden moechte, dann gibt es folgenden Fehler:


**** Build of configuration Debug for project Echo_Client ****

make all
Building target: Echo_Client
Invoking: GCC C Linker
gcc -o"Echo_Client" ./mySrc/echo_client.o -lnsl -lsocket
/usr/lib/gcc/i586-suse-linux/4.3/../../../../i586-suse-linux/bin/ld: cannot find -lsocket
collect2: ld returned 1 exit status
make: *** [Echo_Client] Fehler 1
So, nun habe ich nach der Socket Library gesucht und imer wieder gefunden, das man diesen Parameter unter Linux beim gcc nicht angeben muss. Aber dann bekomm ich ja den obigen Fehler, also was mache ich falsch??
Laut diesem Buch sollte es doch auch unter Linux PC Systemen laufen, oder bin ich voellig falsch?

Viele Gruesse carsten

joki
14.11.08, 23:38
Hilft dir das evtl. weiter ??
http://cboard.cprogramming.com/showthread.php?p=740611

zyrusthc
14.11.08, 23:48
Und das ist wohl eher ein Thema für das Partnerforum http://www.mrunix.de

Greeez Oli

ca_sc
14.11.08, 23:53
Hilft dir das evtl. weiter ??
http://cboard.cprogramming.com/showthread.php?p=740611

Oh man, so einfach kann es sein! :cool:

Ich danke dir, auf diese Loesung waere ich so schnell nicht gekommen, dann kann ich endlich schlafen gehen.

Also, bis denne. :)