Probleme beim Connect auf Socket
-
Ich habe hier folgenden ziemlich simplen Code, mit dem ich eine Verbindung auf einen Serversocket herstelle, der sich im gleichen Subnetz befindet:
m_sock=socket(AF_INET, SOCK_STREAM, 0); if (connect(m_sock, (struct sockaddr *)&m_addr, sizeof (m_addr)) < 0) { err=WSAGetLastError()); closesocket(m_sock); return false; }
Manchmal schlägt mir hier das connect() mit einem System-Error 10060 fehl. In so einem Fall führen anschließend alle wiederholten Versuche mit immer dem gleichen Fehler fehl - und das scheinbar bis in alle Ewigkeit.
Ich kann dann eigentlich nur noch meine komplette Applikation abschießen und neu starten - dann kann sie sich sofort mit dem Serversocket verbinden. Starte ich andererseits den Server neu, so ändert das an dem Fehler gar nichts, ich muss in jedem Fall den kompletten Client neu starten.
Woran kann das möglicherweise liegen?
-
Ich mache das so:
WSADATA W; ... WSAStartup (0x101, &W); S = socket(AF_INET, SOCK_STREAM,0); if ( S == INVALID_SOCKET){ if ( prt != NULL) fprintf( prt, "\n *** socket error"); return TRUE; } A.sin_family = AF_INET; A.sin_port = htons( port); A.sin_addr.s_addr = inet_addr( ip); connect(S,(struct sockaddr *) &A,sizeof(A)); ...
Du hast den return value von socket() nicht getestet. Was macht der ?
-
Du hast den return value von socket() nicht getestet. Was macht der ?
Du meinst wohl WSAGetLastError().
-
@Wupper
Na, das wird dann vermutlich daran liegen dass es beim Aufbau der Connection zu einem Timeout kommt.
Was das für Ursachen haben kann sollte klar sein...
* Adresse ist falsch
* Adresse passt schon aber der andere PC läuft einfach net
* Kein Netzwerk verfügbar
* Firewall blockt dich
...
-
Bad Protokol!
socket(AF_INET, SOCK_STREAM, 0/*IPPROTO_RAW*/);
Du kannst nicht connect() mit raw socket. Es geht nur mit linux, wo wegen SOCK_STREAM raw socket ist (?) gemappt into IPPROTO_TCP.
linux manual/socket.2 schrieb:
The protocol specifies a particular protocol to be used with the socket. Normally only a single protocol exists to support a particular socket type within a given protocol family, in which case protocol can be specified as 0. However, it is possible that many protocols may exist, in which case a particular protocol must be specified in this manner.
msdn schrieb:
Vista and later: If a value of 0 is specified, the caller does not wish to specify a protocol and the service provider will choose the protocol to use.
Die korrekte Implementation:
socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
-
saperounlogged schrieb:
Du kannst nicht connect() mit raw socket. Es geht nur mit linux
Das geht mit Windows auch; nur kannst Du unter Windows den Absender nicht fälschen!
-
Alles hier nachzulesen ->
http://msdn.microsoft.com/en-us/library/windows/desktop/ms740548(v=vs.85).aspx