Header-Dateien 4.7 - 5.0

Hedgehog

Active Member
Moin Moin !

Ich habe folgendes Problem:
Ich habe ein kleines Server- und ein kleines Clientprogramm geschrieben. Auf FreeBSD5.0 lässt sich das ganze auch ohne Probleme kompilieren. Wenn ich allerdings versuche, die Quelltexte auf 'ner FreeBSD4.7er Büchse zu kompilieren, erhalte ich folgende Meldungen (Ausschnitt):

cc server.c -o server
In file included from /usr/include/sys/_types.h:33,
from /usr/include/sys/socket.h:41,
from server.c:5:
/usr/include/machine/_types.h:45: redefinition of `__int8_t'
/usr/include/machine/ansi.h:130: `__int8_t' previously declared here
/usr/include/machine/_types.h:46: redefinition of `__uint8_t'
/usr/include/machine/ansi.h:131: `__uint8_t' previously declared here
/usr/include/machine/_types.h:47: redefinition of `__int16_t'
/usr/include/machine/ansi.h:132: `__int16_t' previously declared here
/usr/include/machine/_types.h:48: redefinition of `__uint16_t'
/usr/include/machine/ansi.h:133: `__uint16_t' previously declared here

usw.

Muss ich jetzt wirklich allen Ernstes alle Header-Dateien manuell von der 5.0er auf die 4.7er kopieren, oder wie mach ich das am besten ?

Mit freundlichen Grüßen

Hedgehog

PS.: Ich möchte auf den Server vorerst noch kein FreeBSD5.0 aufspielen, das ganze sollte auch irgendwie anders zu lösen sein
 
Nein, du musst kein 5.0 installieren, sondern die entsprechenden Header fuer 4.7 "includen". Es hat sich naemlich einiges geaendert zwischen -STABLE und -CURRENT
 
Naja, ich weiss ja nicht...
Ich bekomme nicht irgendwelche Meldungen, dass ich die falschen Header-Dateien einbinde sondern eher, dass innerhalb der Headerdateien irgendwas nicht stimmt. Ausserdem habe ich das Einbinden der Headerdateien aus einem Tutorial von 2002 übernommen, soll heissen, dass das keine STABLE- oder CURRENT-bezogenen Programme sind.

Bringt es was, wenn ich versuche, auf dem 4.7er Rechner per sysinstall->Distributions->src->include einfach die Header-Dateien von der 5.0er-Version (drüber-)installiere oder versaue ich mir damit die ganze Kiste ?

Wer weiß Rat ??? ;)
 
Auf keinen FALL! Damit geht sonst alles den Bach runter.

Wenn dein Programm nicht zu umfangreich ist, dann schicke es mir doch mal. Oder gib mal bitte alle #includes aus dem server.c hier an.
 
OK, hier sind die Header (für client.c und server.c identisch):

/* Einbinden der Header-Dateien */
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <unistd.h>

Mal sehen, was de damit anfangen kannst...
 
Schade, ich hätte gedacht es gibt ein Dependency-Problem
der Header Files. Vielleicht habe ich aber auch nur nicht das
richtige erraten ;)

Ich könnte ja mal versuchen, den Code auf meinem 4.8er
System zu übersetzen...
 
Ich geb euch mal den Quelltext, mal sehen was ihr damit anfangen könnt...


/* Einbinden der Header-Dateien */
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <unistd.h>

int main( void )
{
/* Socket anfordern */
int sockfd = socket (AF_INET, SOCK_STREAM, 0);
if( sockfd == -1 ) {
perror( "socket()" );
}

/* Eigenen Port festlegen */
struct sockaddr_in my_addr;
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(5000);
my_addr.sin_addr.s_addr = htonl(INADDR_ANY);

if( bind( sockfd, (struct sockaddr *)&my_addr, sizeof( struct sockaddr) ) == -1 ) {
perror( "bind()" );
}

/* Zugewiesenen Port ermitteln */
socklen_t len;
getsockname( sockfd, (struct sockaddr *) &my_addr, &len );
printf( "Port: %d\n", ntohs(my_addr.sin_port) );

/* Auf eingehende Verbindung warten */
if( listen( sockfd, 5 ) == -1 ) {
perror( "listen()" );
}

/* Eingehende Verbindung annehmen */
socklen_t sin_size = sizeof( struct sockaddr_in );
struct sockaddr_in remote_host;
int sock2 = accept (sockfd, (struct sockaddr *) &remote_host, &sin_size );
if( sock2 == -1 ) {
perror( "accept()" );
}

/* Daten empfangen */
char buf[1024];
if( recv( sockfd, buf, 1024, 0 ) == -1 ) {
perror( "recv()" );
}

/* Antwort senden */
char *msg = "Daten empfangen! Server Ende.\n\n";
int len2 = strlen( msg );
if( send( sockfd, msg, len, 0 ) == -1 ) {
perror( "send()" );
}

close( sockfd );

return 0;
}


Ob das Programm wirklich das macht, was es soll, weiss ich nicht, ich hab's ja bislang nicht richtig testen können... ;)
 
Also, wenn ich (wie von mir vorgeschlagen) die beiden Zeilen
für sys/types.h und sys/socket.h umkehre, bekomme ich keine
Fehler mehr aus den Includes. Der Rest ist im Code:
Code:
karo [34] ~/work % make serv
cc -O -pipe   serv.c  -o serv
serv.c: In function `main':
serv.c:21: syntax error before `struct'
serv.c:22: `my_addr' undeclared (first use in this function)
serv.c:22: (Each undeclared identifier is reported only once
serv.c:22: for each function it appears in.)
serv.c:31: syntax error before `len'
serv.c:32: `len' undeclared (first use in this function)
serv.c:41: syntax error before `sin_size'
serv.c:44: `sock2' undeclared (first use in this function)
serv.c:49: syntax error before `char'
serv.c:50: `buf' undeclared (first use in this function)
serv.c:55: syntax error before `char'
serv.c:57: `msg' undeclared (first use in this function)
*** Error code 1

Stop in /home/ripley/work.

Ah, ich sehe das Problem. Soll das C++ Code sein?
Als serv.C übersetzt er's (syntaktisch) einwandfrei:
Code:
karo [35] ~/work % make serv
c++  -O -pipe   serv.C  -o serv
 
Zuletzt bearbeitet:
Bei mir funktioniert das ganze trotzdem nicht, egal ob ich jetzt socket.h und types.h umdrehe oder nicht. Wenn ich das mit c++ -O usw. kompiliere kommt folgende Meldung:

c++ -O -pipe server.c -o server
In file included from /usr/include/sys/socket.h:41,
from server.c:6:
/usr/include/sys/_types.h:75: declaration does not declare anything
/usr/include/sys/_types.h:85: conflicting types for `typedef union __mbstate_t \__mbstate_t'
/usr/include/machine/ansi.h:147: previous declaration as `typedef union __mbsta\te_t __mbstate_t'

Die Fehler im Code (wenn ich mit cc kompiliere) beruhen größtenteils darauf, dass er die Variablen nicht als Strukturen deklarieren kann, weil diese Teil der scheinbar widersprüchlichen Header-Files sind. Und an dem einzelnen Rechner kann's auch nicht liegen, weil ich das auf zwei verschiedenen 4.7er-Maschinen ausprobiert hab (einmal FreeBSD4.7-Minimal-system und einmal X-User oder X-Kern-Developer, dass weiss ich grad nich mehr). :confused:

PS.: Und eigentlich soll das schon ganz normaler C-Code sein ;)
 
Original geschrieben von Hedgehog
PS.: Und eigentlich soll das schon ganz normaler C-Code sein ;) [/B]

Dann darfst du Variablen aber nur am Anfang einer Funktion
deklarieren. Oder du klammerst sie in einen {} Block ein,
dann gelten sie aber natürlich auch nur innerhalb des Blocks.

Was die Headerfiles angeht, das ist schon etwas eigenartig.
Ich habe hier auf dem Server wie gesagt ein 4.8-RELEASE am
laufen.
Kannst Du denn einen Kernel oder die Welt übersetzen?
Auf einem anderen Rechner habe ich hier auch noch ein
System drauf, das zwischen 4.6 und 4.7 steht. Ich kann den
ja mal anwerfen und es dort nochmal probieren.
Code:
/usr/include/sys/_types.h
Das Underline da gefällt mir auch nicht.
Das einzige Include mit _ das ich habe ist sys/_posix.h
Was steht denn an Zeile 41 in deinem sys/socket.h?
Welche CVS-Revision hast du?
$FreeBSD: src/sys/sys/socket.h,v 1.39.2.7 2001/07/03 11:02:01 ume Exp $
Zeile 40ff:
Code:
#include <machine/ansi.h>
#define _NO_NAMESPACE_POLLUTION
#include <machine/param.h>
#undef _NO_NAMESPACE_POLLUTION
Das ist direkt der erste Code nach dem #define
_SYS_SOCKET_H_
zum Schutz gegen mehrfaches includen.
 
Naja, ich weiss ja nicht, ob das jetzt Sinn macht, dass ich in den Header-Dateien herumfummle...
Auf den Systemen läuft ein eigener Kernel, soll heißen, dass sich da ohne Probleme alles kompilieren lässt...
 
PS.: Der Code sieht schon 'n bisschen schmutzig aus (so mit der Variablendeklaration mittendrin *fg*), is sonst meine Art, nichtsdestotrotz müsste das ganze ja trotzdem funktionieren.
Die Fehlermeldungen über Fehler im Quellcode sind erst mal nicht so wichtig. Vielmehr sollte ich erstmal klären, warum die Header-Files so Probleme bereiten...
 
PPS.: Ich meinte natürlich, dass das sonst NICHT meine Art ist, Variablen an allen möglichen Orten im Quelltext zu deklarieren. ;)
 
Du sollst ja auch nicht an den Headerfiles rumfummeln, aber
wenn da das Problem herkommt, wirst Du schon reingucken
müssen, um die Ursache festzunageln.
Wie gesagt, ein /usr/include/sys/_types.h habe ich nicht.
Was steht also in deinem sys/socket.h um Zeile 40 herum?
 
Vielen Dank für dein Hilfe, Ripley8 !! :)

Ich hab grad mal die Header-Dateien zweier 4.7er Rechner verglichen und festgestellt, dass ich in meinem Eifer wohl irgendwann mal die socket.h von der 5.0er-Büchse auf die 4.7er-Kiste kopiert habe (kann ja mal passieren *unschuldigflöt*)...
Wenn ich jetzt die socket.h und die types.h vertausche und alle Variablen am Anfang von main() deklariere, dann funktioniert es.

Vielen Dank noch mal für deine Hilfe, dafür kriegste auch ein Eis:
- EIS - ;)
 
Zurück
Oben