probleme mit ip eingabe...
-
hallo.
hab ein problem: undzwa...
ich versuch verzweifelt eine ip einzulesen. weil das blöd ist die immer im quellcode stehen zu haben. so das problem ist: ich hab gehört es würde mit get oder gets gehen. geht aber nicht. mit scanf auch nicht wirklich..
schaut euch mal bitte denn code an und sagt was da falsch ist. bzw. wie ich das machen könnte.
danke#include <windows.h> #include <winsock2.h> #include <stdio.h> int startWinsock(void); long getAddrFromString(char* hostnameOrIp, SOCKADDR_IN* addr); int main(int textvar, char** argv) { long rc; SOCKET s; SOCKADDR_IN addr; char buf[256]; char ip[15]; scanf("%c\n", ip); if(textvar<2) { printf("Usage: sock <hostname oder ip des servers>\n"); return 1; } rc=startWinsock(); if(rc!=0) { printf("Fehler: startWinsock, fehler code: %d\n",rc); return 1; } else { printf("Winsock gestartet!\n"); } 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"); } memset(&addr,0,sizeof(SOCKADDR_IN)); // alles auf 0 setzen addr.sin_family=AF_INET; addr.sin_port=htons(12345); //port 12345 addr.sin_addr.s_addr=inet_addr("ip"); // ip die eingegeben wurde rc=connect(s,(SOCKADDR*)&addr,sizeof(SOCKADDR)); if(rc==SOCKET_ERROR) { printf("Fehler: connect gescheitert, fehler code: %d\n", WSAGetLastError()); return 1; } else { printf("Verbunden mit %c..\n, ip"); } // Daten senden / empfangen while(rc!=SOCKET_ERROR) { printf("\nZeichenfolge eingeben [max 256]: "); gets(buf); send(s,buf,strlen(buf),0); rc=recv(s,buf,256,0); 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 antwortet: %s\n",buf); } long getAddrFromString(char* hostnameOrIp, SOCKADDR_IN* addr) { long rc; unsigned long ip; HOSTENT* he; /* Parameter prüfen */ if(hostnameOrIp==NULL || addr==NULL) return SOCKET_ERROR; /* eine IP in hostnameOrIp ? */ ip=inet_addr(hostnameOrIp); /* bei einem fehler liefert inet_addr den Rückgabewert INADDR_NONE */ if(ip!=INADDR_NONE) { addr->sin_addr.s_addr=ip; return 0; } else { /* Hostname in hostnameOrIp auflösen */ he=gethostbyname(hostnameOrIp); if(he==NULL) { return SOCKET_ERROR; } else { /*die 4 Bytes der IP von he nach addr kopieren */ memcpy(&(addr->sin_addr),he->h_addr_list[0],4); } } system("pause"); } closesocket(s); WSACleanup(); system("pause"); } int startWinsock(void) { WSADATA wsa; return WSAStartup(MAKEWORD(2,0),&wsa); }
hier nochmal als c file: [url] http://real-torrent-board.gotdns.org/client.c[/url]
danke.
bye
-
Schau Dir am besten noch mal an, was doe Zeichen im Formatstring von scanf bedeuten. Mit "%c" liest du nämlich nur ein einzelnes Zeichen ein und keine Zeichenkette; dafür musst Du "%s" benutzen. Warum Du ein "\n" im FOrmatstring hast, ist mir auch nicht so ganz klar...
Abgesehen davon solltest Du übrigens besser sscanf() als scanf benutzen. Wenn scanf() nämlich mehr Zeichen einliesst, als in das char-Array passen, schmiert das Programm ab.
-
oh danke. ich werds mal ausprobieren. ps denn fehler mit %c is mir gestern schon aufgefallen
dankee
-
addr.sin_addr.s_addr=inet_addr("ip"); // ip die eingegeben wurde
Müsste diese Zeile, wenn überhaupt nicht
addr.sin_addr.s_addr=inet_addr(ip); // ip die eingegeben wurde
heißen?
-
Nein:
unsigned long inet_addr ( const char FAR * cp );
MfG SideWinder