PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Probleme mit Winsock!!



red_rapid_fire
20-12-2002, 13:07
Hi, ich habe mich ein wenig mit Winsock befasst, doch ich habe schon Probleme damit!! Hier ist der Code
#include <stdio.h>
#include <netdb.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/types.h>
void main()
{
_ _int Socket;
_ _int Connect;
_ _
_ _struct sockaddr_in
_ _{
_ __ _short int sin_family;
_ __ _unsigned short int sin_port;
_ __ _struct in_addr sin_addr;
_ _};
_ _struct sockaddr_in addr;
_ _Socket = socket(AF_INET, SOCK_STREAM, 0);
_ _addr.sin_addr = inet_addr("127.0.0.1");
_ _addr.sin_port = htons(80);
_ _addr.sin_family = AF_INET;
_ _
_ _if (Socket < 0)
_ _{
_ __ _printf("Socket erstellung Fehlgeschlagen\n");
_ _}
_ __ _if (connect(Socket, &addr, sizeof(addr)) == -1)
_ _{
_ __ _perror("connect() failed");
_ __ _return 2;
_ _}
}

Wenn ich ihn unter gcc compiliere bikomme ich einige nur Fehler zurück.

mfg rrf

xmarvel
20-12-2002, 13:13
wer ganz gut wenn du erzählst was du für Fehler erhälst ;)

tkortkamp
20-12-2002, 13:36
Deine Probleme liegen hauptsächlich an allgemeinen Fehlern:


#include <stdio.h>
#include <netdb.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <arpa/inet.h> /* Für inet_aton */

/* void main() entspricht nicht dem Standard! Außerdem benutzt
du return hier, aber trotzdem ist main vom Typ void, warum? */
int main(int argc, char **argv)
{
int Socket;

/* Dieses ganze struct sockaddr_in musst du hier nicht nochmal definieren
Da das ja schon in den Header-Dateien getan wird */
struct sockaddr_in addr;
Socket = socket(AF_INET, SOCK_STREAM, 0);
/* inet_addr wird nicht mehr genutzt!
Statt addr.sin_addr = inet_addr("127.0.0.1"); das hier schreiben: */
inet_aton("127.0.0.1", &addr.sin_addr);

addr.sin_port = htons(80);
addr.sin_family = AF_INET;

if (Socket < 0)
{
printf("Socket erstellung Fehlgeschlagen\n");
}
if (connect(Socket, &addr, sizeof(addr)) == -1)
{
perror("connect() failed");
return 2;
}
return 0; /*Weil main vom Typ int ist, musst du einen Wert zurückgeben. */
}

Wenn ich das jetzt mit gcc -Wall kompiliere bekomm ich keine Fehlermeldung:

c ya,
Tobias

red_rapid_fire
20-12-2002, 13:50
@thortkamp Das mit dem void main() -> int main() hatte ich schon geändert, hatte aus versehen nicht den Aktuellsten Code gepostet!! Und das Struct sockaddr_in schon in der Header Datei Definiert ist wuste ich gar nicht!! Nur wenn ich den neuen Code Compiliere kommt noch ein Fehler und nähmlich in der Zeile 35:
type 'const sockaddr' is not a base type for 'sockaddr_in' Was bedeutet das??


mfg rrf

edit: Kennt jemand noch gute Deutsche Tutorials für Winsock unter Unix/Linux??

red_rapid_fire
20-12-2002, 22:24
Ok, habe das Problem lösen können, doch jetzt hab ich schon wieder Probleme:(
und zwar mit accept()
Accept = accept(Socket, (struct sockaddr *)&remote_addr, &cli_size); Egal was ich mache ich bekomme vom Compiler immer ur die Meldung:
passing 'int *' as argument 3 of 'accept(int, sockaddr *, socklen_t *)' changes sigdness Was ist falsch??

mfg rrf

tkortkamp
20-12-2002, 22:34
Kennt jemand noch gute Deutsche Tutorials für Winsock unter Unix/Linux??
Suche mal im Forum nach Sockets Tutorials. Winsock gibt es nur unter Windows...

c ya,
Tobias

anda_skoa
21-12-2002, 10:35
Original geschrieben von red_rapid_fire
Was ist falsch??


Die Fehlermeldung besagt, dass du keinen int als dritten Parameter nehmen sollst, weil int eine vorzeichenbehaftete Darstellung (signed) und als dritter Parameter ein vorzeichenloser Typ (unsigned) erwartet wird.

Du kannst einfach cli_size als socklen_t deklarieren, das ist genau der Typ, den er erwartet.

Ciao,
_

Lin728
21-12-2002, 15:34
Winsock unter Unix?

Mfg

anda_skoa
21-12-2002, 15:38
Original geschrieben von ceisserer
Servus!!

Winsock unter Unix? Hab ich da was nicht mitbekommen??


Der OP hat ein ungünstiges Subject gewählt und es bisher noch nicht korrigiert.

Ciao,
_