Warum nicht eine einfache socket auf localhost verbinden?
Ich bin nach einem tutorial, das lehrt mich, wie man win32 sockets(winsock2). Ich bin versucht, zu erstellen eine einfache socket-Verbindung zu "localhost" aber mein Programm ist zu Versagen, wenn ich versuche, eine Verbindung zum lokalen host(die Funktion connect()).
Brauche ich admin-Rechte, um die Verbindung zum localhost? Das ist vielleicht der Grund, warum es scheitert? Vielleicht theres ein problem mit meinem code? Ich habe versucht die ports 8888 & 8000 & Sie beide scheitern.
Auch wenn ich den port auf 80 & verbinden www.google.com ich kann mich verbinden ABER ich bekomme keine Antwort zurück. Ist das, weil ich noch nicht geschickt, eine HTTP-Anforderung oder-soll ich, um etwas zu bekommen-Antwort zurück?
Hier mein code (mit den includes entfernt):
//Constants & Globals //
typedef unsigned long IPNumber; //IP number typedef for IPv4
const int SOCK_VER = 2;
const int SERVER_PORT = 8888; //8888
SOCKET mSocket = INVALID_SOCKET;
SOCKADDR_IN sockAddr = {0};
WSADATA wsaData;
HOSTENT* hostent;
int _tmain(int argc, _TCHAR* argv[])
{
//Initialise winsock version 2.2
if (WSAStartup(MAKEWORD(SOCK_VER,2), &wsaData) != 0)
{
printf("Failed to initialise winsock\n");
WSACleanup();
system("PAUSE");
return 0;
}
if (LOBYTE(wsaData.wVersion) != SOCK_VER || HIBYTE(wsaData.wVersion) != 2)
{
printf("Failed to load the correct winsock version\n");
WSACleanup();
system("PAUSE");
return 0;
}
//Create socket
mSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (mSocket == INVALID_SOCKET)
{
printf("Failed to create TCP socket\n");
WSACleanup();
system("PAUSE");
return 0;
}
//Get IP Address of website by the domain name, we do this by contacting(??) the Domain Name Server
if ((hostent = gethostbyname("localhost")) == NULL) //"localhost" www.google.com
{
printf("Failed to resolve website name to an ip address\n");
WSACleanup();
system("PAUSE");
return 0;
}
sockAddr.sin_port = htons(SERVER_PORT);
sockAddr.sin_family = AF_INET;
sockAddr.sin_addr.S_un.S_addr = (*reinterpret_cast <IPNumber*> (hostent->h_addr_list[0]));
//sockAddr.sin_addr.s_addr=*((unsigned long*)hostent->h_addr); //Can also do this
//ERROR OCCURS ON NEXT LINE: Connect to server
if (connect(mSocket, (SOCKADDR*)(&sockAddr), sizeof(sockAddr)) != 0)
{
printf("Failed to connect to server\n");
WSACleanup();
system("PAUSE");
return 0;
}
printf("Got to here\r\n");
//Display message from server
char buffer[1000];
memset(buffer,0,999);
int inDataLength=recv(mSocket,buffer,1000,0);
printf("Response: %s\r\n", buffer);
//Shutdown our socket
shutdown(mSocket, SD_SEND);
//Close our socket entirely
closesocket(mSocket);
//Cleanup Winsock
WSACleanup();
system("pause");
return 0;
}
Nein, ich habe nichts zu hören, ich kindof dachte, dass der lokale host würde nur reagieren, lol
bitte informieren Sie uns, wenn localhost "nur reagiert", so wir es nennen können, Skynet, und rufen Sie den Terminator. Halten Sie Ihren computer entfernt von den Großen Roten Knopf.
Es reagieren wird, wenn Sie eine Verbindung zu einem port mit einem Dienst hören, und das verwendete Protokoll nicht verlangen, dass Sie reden zuerst. Zum Beispiel, wenn ich Schreibe in meinem linux-Rechner:
telnet localhost 22
(das ist der SSH-port) wird es Antworten SSH-2.0-OpenSSH_5.8p1 Debian-7ubuntu1
ohne Verzögerung.Es hat "nur reagieren". Mit einem "port unreachable" ICMP-Paket, sagen Sie, dass es keine socket lauscht auf diesem port. Die die sockets-Bibliothek umgewandelt, um einen Fehler return-code von
connect
.InformationsquelleAutor sazr | 2011-11-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Jemand überwacht werden soll, in den Hafen, die Sie herstellen. Schreiben Sie ein kleines server-Programm, das auf eingehende verbindungen warten. Wenn die Verbindung erfolgreich ist Sie natürlich verbunden sind, um google, sondern müssen Sie zum senden einer HTTP-Anfrage (von C? - das wäre schwierig).
Nicht so schwierig:
const char *msg = "GET / HTTP/1.0\r\n\r\n"; send(sock, msg, strlen(msg), 0);
. Wenn Sie möchten, um die Verwendung von HTTP 1.1 die minimale Anforderung wäre"GET / HTTP/1.1\r\nHost: www.google.com\r\n\r\n"
.InformationsquelleAutor Prabhu
Als Sie bereit sind, für die Verwendung des TCP-Protokolls, welches Verbindung basiert Sie benötigen eine Kommunikation Gegenstück wie eine Anwendung lauscht auf port 8888 zu reagieren, um Ihre Verbindungs-Aufbau-Anfrage (SYN-Paket im TCP-Bedingungen)
Könnten Sie mit den unix-Tools netcat (das ist auch availibla für andere OS') zu tun, ohne die Notwendigkeit von admin-rechten...
... das öffnet einen socket auf den port 8888 auf Ihrem lokalen Rechner
Jedoch auf unix-Systemen Sie sind nicht berechtigt, hören Sie auf so genannte well-known-ports ohne admin-Rechte.
Lesen Sie weitere Informationen über die TCP-Verbindung-Life-Cycle
InformationsquelleAutor xmoex
Um die Verbindung zu einem TCP-port auf localhost, jemand hat zu hören, der auf diesem port auf Ihrem Computer.
Abgesehen von schreiben Sie Ihre eigenen server-es gibt einen einfachen Weg, um einige Programme zu hören: Installieren Sie die "Einfache TCP/IP-Dienste" - Funktion auf Ihrem Rechner. Dies wird Ihnen ein "Zitat des Tages" - server auf port 17, a Daytime-server auf port 13, Chargen-server auf port 19 und ein echo-server auf port 7.
Um diese zu installieren, gehen Sie zu Ihrem "Programme und Funktionen" oder "Programme Hinzufügen/Entfernen" oder wie das heißt auf Windows, wählen Sie "Turn Windows-Funktionen aktivieren oder deaktivieren", und suchen und installieren Sie die "Einfache TCPIP Dienste" in der Liste.
InformationsquelleAutor Fozi