socket_connect_problem
-
Hallo!
Und zwar hab ich diesmal folgendes (ich glaub simples) Problem!
Hab einen einfachen Server unter Unix programmiert:#include <netdb.h> #include <netinet/in.h> #include <sys/types.h> #include <sys/socket.h> #include <stdio.h> int main (void) { int sock; socklen_t sin_size=sizeof(sockaddr_in); struct sockaddr_in svr; svr.sin_family=AF_INET; svr.sin_port=htonl(12345); svr.sin_addr.s_addr=INADDR_ANY; if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) { puts("Fehler beim Erstellen des Socket!\n"); return 1; } else puts ("Socket erstellt\n"); if (bind (sock, (struct sockaddr *) &svr, sizeof(svr)) !=0) { puts ("Fehler beim Binden des Socket!\n"); return 1; } else puts ("Socket an Port gebunden\n"); if ((listen(sock, 3)) == -1) { puts ("Fehler beim Warten des Socket!\n"); return 1; } else puts ("Socket wartet\n"); for (;;) { if (accept (sock, (struct sockaddr *) &svr, &sin_size) != 0) { puts ("Fehler beim Handeln der Clients!\n"); return 1; } else puts ("Verbindung ok"); //puts ("Verbindung von %s\n", inet_ntoa(sock.sin_addr)); } // close (sock); return 0; }
und einen einfachen Client unter Windows:
#include "stdafx.h" #include <io.h> #include <windows.h> #include <winsock.h> #include <stdio.h> #include <conio.h> //Prototypen int startWinsock(void); long getAddrFromString(char* hostnameOrIp, SOCKADDR_IN* addr); int main(int argc, char** argv) { long rc; SOCKET s; SOCKADDR_IN addr; char buf[256]; if(argc<2) { printf("Usage: sock <hostname oder ip des servers>\n"); return 1; } // IP struct hostent* host; BYTE ipAdressTeil[4]; char ipAdressBuffer[64]; char hostName[MAX_PATH]; int x; // Winsock starten rc=startWinsock(); if(rc!=0) { printf("Fehler: startWinsock, fehler code: %d\n",rc); return 1; } else { printf("Winsock gestartet!\n"); } if(SOCKET_ERROR != gethostname(hostName,sizeof(hostName))) { if (NULL != (host=gethostbyname(hostName))) { for (x=0; (host->h_addr_list[x]);x++) { ipAdressTeil[0] = host->h_addr_list[x][0]; ipAdressTeil[1] = host->h_addr_list[x][1]; ipAdressTeil[2] = host->h_addr_list[x][2]; ipAdressTeil[3] = host->h_addr_list[x][3]; sscanf(ipAdressBuffer,"%d.%d.%d.%d", &ipAdressTeil[0], &ipAdressTeil[1], &ipAdressTeil[2], &ipAdressTeil[3]); } } } else printf ("Socket Error"); // Socket erstellen s=socket(AF_INET,SOCK_STREAM,0); if(s==INVALID_SOCKET) { printf("Fehler: Der Socket konnte nicht erstellt werden, fehler code: %d\n",WSAGetLastError()); return 1; } else { printf("Socket erstellt!\n"); } // Verbinden memset(&addr,0,sizeof(SOCKADDR_IN)); // zuerst alles auf 0 setzten addr.sin_family=AF_INET; addr.sin_port=htons(12345); // wir verwenden mal port 12345 // addr.sin_addr.s_addr=inet_addr("192.168.0.3"); // zielrechner ist unser eigener rc=getAddrFromString(argv[1],&addr); if(rc==SOCKET_ERROR) { printf("IP für %s konnte nicht aufgeloest werden\n", argv[1]); return 1; } else { printf("IP aufgeloest!\n"); } rc=connect(s,(SOCKADDR*)&addr,sizeof(SOCKADDR)); if(rc==SOCKET_ERROR) { printf("Fehler: connect gescheitert, fehler code: %d\n",WSAGetLastError()); return 1; } else { printf("Ihre IP - Adresse: %d.%d.%d.%d ist verbunden mit Zielhost\n",ipAdressTeil[0], ipAdressTeil[1], ipAdressTeil[2], ipAdressTeil[3]); } HWND hWnd, unsigned int wMsg, long lEvent // Daten austauschen while(rc!=SOCKET_ERROR) { printf("\nZeichenfolge eingeben [max 256]: "); gets(buf); send(s,buf,strlen(buf),0); //rc=recv(s,buf,256,0); rc = WSAAsyncSelect(s, hWnd, wMsg, FD_READ|FD_WRITE); if(rc==0) { printf("Server hat die Verbindung getrennt..\n"); break; } if(rc==SOCKET_ERROR) { printf("Fehler: recv, fehler code: %d\n",WSAGetLastError()); break; } buf[rc]='\0'; printf("\nServer schreit: %s\n",wMsg); } closesocket(s); WSACleanup(); return 0; } int startWinsock(void) { WSADATA wsa; return WSAStartup(MAKEWORD(2,0),&wsa); } long getAddrFromString(char* hostnameOrIp, SOCKADDR_IN* addr) { long rc; unsigned long ip; HOSTENT* he; if (hostnameOrIp==NULL || addr==NULL) return SOCKET_ERROR; ip=inet_addr(hostnameOrIp); if (ip!=INADDR_NONE) { addr->sin_addr.s_addr=ip; return 0; } else { he=gethostbyname(hostnameOrIp); if (he==NULL) { return SOCKET_ERROR; } else { memcpy(&(addr->sin_addr),he->h_addr_list[0],4); } return 0; } }
Beim Aufruf meines Clients bekomm ich die Fehlermeldung, dass mein Client beim connect fehlgeschlagen ist (Fehlercode 10061).
Ich geb die IP - Adresse über die Konsolenandwendung ein (vorheriger ping an die Serveradresse hat funktioniert); doch scheitert mein Verbindungsaufbau.
Kann mir da jemand weiterhelfen?
-
ich hatte schonmal das Phänomen dass ein connect nur über den Namen funktionierte.. gethostbyname() konnte keine IP's auflösen, sodass ein
connect nur über den NameServer oder die system32\driver\etc\hosts möglich war..mfg
-
hab den Client jetzt ohne IP - auflösen:
#include <windows.h> #include <winsock.h> #include <stdio.h> void WSAInit(void) { WORD wVersionReg = MAKEWORD(1, 1); WSADATA wsaData; if (int err = WSAStartup(wVersionReg, &wsaData) != 0) { puts("Fehler: Initialisieren - WinSock.dll!"); } } int main(void) { SOCKET sock = INVALID_SOCKET; struct sockaddr_in svr; svr.sin_family = AF_INET; svr.sin_addr.s_addr = inet_addr("192.168.0.2"); svr.sin_port = htons(12345); WSAInit(); if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) { puts("Fehler beim Erstellen des Socket!\n"); return 1; } if ( connect (sock, (struct sockaddr *) &svr, sizeof(svr)) == SOCKET_ERROR) { puts("Es kam keine Verbindung zustande!\n"); return 1; } closesocket(sock); WSACleanup(); return 0; }
Hab einen Server unter Windows geschrieben; da funktionierts suppi!
Nur unter Linux will das nicht funktionieren! was mach ich falsch?