PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : c++ und die sockets...



Takt
12-09-2003, 00:43
ich hab mich neulich mit der Socket programmierung unter C (posix) beschäftigt. Naja, da kam ich auch ganz gut mit zurecht, jedoch woltle ich mein Wissen von dort nun auch unter C++ benutzen. Unter anderem funktioniert dort nun folgendes nicht:

connection = connect(sockfd, (struct sockaddr_in *)&servaddr, sizeof(servaddr));

Die variable connection ist vom typ int und g++ sagt:

implicit declaration of function `int inet_addr(...)'

:o Wie kann ich das nun verwenden? Und dann wäre da noch:

Implicit declaration of function `int inet_addr(...)'

auch so ne komische sache, die unter C funtzt. Hier der Source ausschnitt:

servaddr.sin_addr.s_addr = inet_addr(destip);

Und zu guter letzt das hier:

type `const sockaddr' is not a base type for type `sockaddr_in'

hier wieder der Source:

connection = connect(sockfd, (struct sockaddr_in *)&servaddr, sizeof(servaddr));

Oder kennt jemand noch ein gutes Tutorial/Buch zum thema Socket Programmierung unter c++, möglichst auf Deutsch.

MfG. Taktloss

wraith
12-09-2003, 09:29
Original geschrieben von Takt

implicit declaration of function `int inet_addr(...)'

Das Problem liegt nicht bei C++,das Problem ist,daß das schon in C nicht korrekt war.
Dir fehlt der Header,wo die Funktionen deklarriert sind (welche das sind K.A).

Die gcc Entwickler haben es leider immer noch nicht verstanden,als Defaulteintstellungen die Warnings bis zum Anschlag aufzudrehen.
Dann wäre dir der Fehler nämlich schon beim kompilieren als C Code aufgefallen (probier' es mal: gcc -W -Wall -ansi -pedantic)

Takt
12-09-2003, 11:08
Headers? Sorry, aber sys/socket.h und netinet/in.h sind drin, falls du das meinst.
Aber ich werde deine Methode da gleich mal ausprobieren. Danke.
MfG. Takt

wraith
12-09-2003, 11:21
Original geschrieben von Takt
Headers? Sorry, aber sys/socket.h und netinet/in.h sind drin, falls du das meinst.

Du brauchst diese Header (in arpa/inet.h ist die Deklarration von inet_addr)


#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

Silver
12-09-2003, 11:22
#include <arpa/inet.h>

Takt
12-09-2003, 13:01
naja im c tut, war immer nur die rede von sys/socket.h und netinet/in.h
thx. @ all
MfG. Taktloss

Takt
12-09-2003, 13:15
So die includes habe ich nun um eure oben genannten erweitert.
Aber eine sache Funktioniert immernoch nicht:
68: type `const sockaddr' is not a base type for type `sockaddr_in'
code: connection = connect(sockfd, (struct sockaddr_in *)&servaddr, sizeof(servaddr));
connection ist eine int variable. Aber warum zum henker geht das nicht?
Ok, ich poste euch mal die ganze Funktion:

int scan(char *destip)
{
struct sockaddr_in servaddr;
int connection;
int sockfd;
int port;
int realstartport = 1;
int realendport = 65535;

port = realstartport;

sockfd = socket(AF_INET, SOCK_STREAM, 0);

if(sockfd < 0)
{
cout << "Socket could not be created!\nexiting now...\n";
return -1;
}

while(port < realendport)
{
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = inet_addr(destip);
servaddr.sin_port = htons(port);

connection = connect(sockfd, (struct sockaddr_in *)&servaddr, sizeof(servaddr));


if(connection == 0)
{
cout << destip << ":" << port << " : OPEN\n";
}

port++;
}

return 0;
}
Soll im übrigen n kleiner connect() scanner werden *g*
MfG. Takt

Takt
12-09-2003, 18:56
so das problem ist gelöst, fragt mich nciht wie, aber es geht :D