Anmelden

Archiv verlassen und diese Seite im Standarddesign anzeigen : connect: Socket operation on non-socket



gEry
21-06-2005, 20:20
HI!

ich bekomme die oben stehende fehlermeldung bei dieser code zeile:


if(connect(my_socket, (struct sockaddr *)&dest_addr, sizeof(dest_addr)) == -1)

kennt jemand diesen fehler?

ich habe nachgeschaut... viel ist es das problem, dass etwas mit dem socket bei socket() net stimmt... zb ungültig oder so^^

na, kann mir da jemand helfen?

greEz

gEry

gEry
22-06-2005, 19:13
hat wirklich keiner hier eine idee...

cagara
22-06-2005, 19:37
Hmm also,
kann sein dass connect Asynchron arbeitet!

Wäre aber hilfreicher wenn du sagen könnntest welche Klasse das genau ist!

cagara
22-06-2005, 19:41
Bin jetzt auf folgendes gestoßen


WSAENOTSOCK
(10038)
Socket operation on non-socket.
An operation was attempted on something that is not a socket. Either the socket handle parameter did not reference a valid socket, or for select, a member of an fd_set was not valid.


Aber wie gesagt,
sag mir bitte um welche Klasse es sich genau handelt!

Dann kann ich vielleicht etwas in erfahrung bringen!

gEry
22-06-2005, 19:50
WSA? Ist das nicht für winsock? - ich benutze nur socjet, also linux... danke für deine hilfe... auf diese definition bin ich auhc schon gestossen...
folgende includes bruache ich:

#include <sys/socket.h>
#include <sys/types.h>
wenn ich das mache:

cout << my_socket <<endl;
dannn bekomme ich den wert 0, welcher ja für fehlerfrei spricht... jedoch bei connect kommt die fehlermeldung: on non-socket -.-

panzi
22-06-2005, 20:16
WSA? Ist das nicht für winsock? - ich benutze nur socjet, also linux... danke für deine hilfe... auf diese definition bin ich auhc schon gestossen...
folgende includes bruache ich:

#include <sys/socket.h>
#include <sys/types.h>
wenn ich das mache:

cout << my_socket <<endl;
dannn bekomme ich den wert 0, welcher ja für fehlerfrei spricht... jedoch bei connect kommt die fehlermeldung: on non-socket -.-
spricht nicht für fehlerfrei. 0 sollte stdin sein, also kein socket sondern ein filedescriptor für die ausgabe auf die shell.

panzi
22-06-2005, 21:07
zeig mal deinen socket() aufruf.

gEry
22-06-2005, 21:26
hier:

my_socket = socket(AF_INET, SOCK_STREAM, 0)

hmm also für was steht dann die 0, wenn nicht für 'true' :confused:

ich dachte, ich war sicher, dass 0 ist gut, true...

gruss

gEry

panzi
22-06-2005, 22:22
hier:

my_socket = socket(AF_INET, SOCK_STREAM, 0)

hmm also für was steht dann die 0, wenn nicht für 'true' :confused:

ich dachte, ich war sicher, dass 0 ist gut, true...

gruss

gEry
1. ist true als != 0 definiert und 2. bekommt man da ja einen filedescriptor zurück. aber 0 ist normalerweiße ja stdin (1 ist sdtout und 2 stderr). also schließt du stdin? denn dann könnte eben ein neuer fd echt auf 0 gesetzt werden.

locus vivendi
23-06-2005, 17:34
my_socket = socket(AF_INET, SOCK_STREAM, 0)
Das ist sowieso schon mal falsch. AF_INET gehört da nicht hin. Auch wenn AF_INET gelegentlich gleich PF_INET definiert ist(soweit ich weiss).

gEry
23-06-2005, 18:49
denn dann könnte eben ein neuer fd echt auf 0 gesetzt werden.

was meinst du damit? mit fd?



my_socket = socket(PF_INET, SOCK_STREAM, 0)

gibt genau den gleichen fehler raus!!

panzi
23-06-2005, 20:17
was meinst du damit? mit fd?
fd = filedescriptor = ähm, "Dateinummer"(?) Dateideskriptor, halt
Sockets sind genauso filedescriptors wie eine Datei, die mit open() geöffnet wurde, oder das was hinter stdin/stdout/stderr steht oder auch pipes.

gEry
23-06-2005, 20:56
ok... also ich finde keinen weg mehr... das ist von mir:
socket_client.h:

#include <sys/socket.h>
#include <sys/types.h>

class client
{
public:

struct sockaddr_in dest_addr; // contains data to connect to the server

int my_socket;

int main();
int create_socket(char * controller);
int connect_server(char * controller, char * desti_ip);
};

socket_client.cpp:

#include <fcntl.h>
#include <errno.h>
#include <stropts.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdio.h>
#include <iostream.h>
#include <string>

#include "socket_client.h"

#define MY_PORT 65023

main()
{
int i = 0;
int z;
client my_object;
char controller[100];
char desti_ip[15];

cout << "Client is starting, please wait..." << endl;
cout << "Please insert the server address:" << endl;

cin >> desti_ip;

while(i == 0)
{
my_object.create_socket(controller);
z = strcmp(controller, "successfull"); // 0 == true
if(z != 0) { cout << controller << endl; break; }

my_object.connect_server(controller, desti_ip);
z = strcmp(controller, "successfull");
if(z != 0) { cout << controller << endl; break; }

i++;
}

return 0;
}

int client::create_socket(char * controller)
{
if(my_socket = socket(AF_INET, SOCK_STREAM, 0) == -1)
{
strcpy(controller, "Socket error!");
return 0;
}
else
{
cout << "Client has created a socket..." << endl;
strcpy(controller, "successfull");
return 0;
}
}

int client::connect_server(char * controller, char * desti_ip)
{
// Infos for connecting to server
dest_addr.sin_family = AF_INET;
dest_addr.sin_port = htons(MY_PORT);
dest_addr.sin_addr.s_addr = inet_addr(desti_ip);

cout << "Client is trying to connect to: " << inet_ntoa(dest_addr.sin_addr) << "..." << endl;

if(connect(my_socket, (struct sockaddr *)&dest_addr, sizeof(dest_addr)) == -1)
{
strcpy(controller, "Connection error!");
perror("connect");
return 0;
}
else
{
cout << "Client is now connected to the server: " << inet_ntoa(dest_addr.sin_addr) << endl;
strcpy(controller, "successfull");
return 0;
}
}

mit dem output:

Client is starting, please wait...
Please insert the server address:
Client has created a socket...
Client is trying to connect to: 127.0.0.1...
connect: Socket operation on non-socket
Connection error!

das ist von nem kollegen:

/* client.c */
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#define BUF 1024
#define Port 65001

int main (int argc, char **argv) {
int create_socket;
char *buffer=malloc(BUF);
struct sockaddr_in address;
int size;

if( argc < 2 ){
printf("Usage: %s ServerAdresse\n", *argv);
exit(EXIT_FAILURE);
}

printf ("\e[2J");
if ((create_socket = socket (AF_INET, SOCK_STREAM, 0)) > 0)
printf ("Socket wurde angelegt\n");

address.sin_family = AF_INET;
address.sin_port = htons (Port);
inet_aton (argv[1], &address.sin_addr);

if (connect ( create_socket,
(struct sockaddr *) &address,
sizeof (address)) == 0)
printf ("Verbindung mit dem Server (%s) hergestellt\n",
inet_ntoa (address.sin_addr));
do {
size = recv(create_socket, buffer, BUF-1, 0);
if( size > 0)
buffer[size] = '\0';
printf ("Nachricht erhalten: %s\n", buffer);
printf("Befehl eingeben: ");
fgets (buffer, BUF, stdin);
send(create_socket,buffer,strlen(buffer),0);
printf("Nachricht gesendet\n");


} while (strcmp (buffer, "quit\n") != 0);
close (create_socket);
return EXIT_SUCCESS;
}
und das geht -.- kann da einer helfen :confused: :confused:

Joghurt
24-06-2005, 13:28
if(my_socket = socket(AF_INET, SOCK_STREAM, 0) == -1)So bekommt my_socket das Ergebnis des Vergleichs zugewiesen, 0 oder 1. Du hast die Klammern vergessen


if( (my_socket=socket(...))==-1)Wieder ein Grund, warum man besser leserlich schreiben sollte
my_socket=socket...
if (my_socket == -1)...

gEry
24-06-2005, 16:36
Hey joghurt!!

Vielen dank!! Das wars... lol hab ich mir an den Kopf gelangt, als ich das sah!! :D :D

gruss

gEry

p.s. besch du e schwizer? :D

Joghurt
24-06-2005, 22:07
p.s. besch du e schwizer? :DNö, wie kommst du auf diese Vermutung?

gEry
25-06-2005, 12:01
wegen Joghurt :p

panzi
25-06-2005, 23:30
AFAIK sollte gcc bei sowas ein Warning ausgeben, wenn man mit -Wall kompeliert. Dieses Flag ist sowieso zu empfählen.

Joghurt
26-06-2005, 22:50
wegen Joghurt :pJoghurt gibt es auch in vielen anderen Ländern...

gEry
27-06-2005, 19:19
panzi: AFAIK ?? was meinst du? das brauche ich gar net!?

Joghurt: meinst du? hmm... ich habe sie gerne :D

7.e.Q
28-06-2005, 13:29
panzi: AFAIK ?? was meinst du? das brauche ich gar net!?

Joghurt: meinst du? hmm... ich habe sie gerne :D

Auf die Gefahr hin, daß ich deine Frage falsch verstanden habe: AFAIK heißt "As far as I know", also "soweit ich weiß".

Und das Flag -Wall sollte man immer mit im Makefile oder dem Compiler Aufruf unterbringen. Spart einem 'ne Menge Fehlersuchen später.

gEry
30-06-2005, 19:26
hi!

axo, oki, danke... ich dachte halt an: AF_INET , gibts ja wirklich :P

noch ne frage:

wie heisst der Befehl, mit dem ich eine Eingabe einlesen kann (String mit Leerzeichen), jedoch aber nicht einfach das Letzte was auch den Screen geschrieben wurde einliest?

--> Also kein getline(cin, mystring); // liest immer einfach die letzte ausgabe auf dem screen ein -.-

gruss

gEry

gEry
30-06-2005, 20:42
Keiner eine Idee, oder Hilfe? :(