Pourquoi pas une simple prise de l'localhost connecter?

Je suis un tutoriel qui m'enseigne comment utiliser win32 sockets(winsock2). Je cherche à créer une simple prise qui se connecte à la "localhost", mais mon programme est un échec quand je tente de me connecter à l'hôte local(au niveau de la fonction connect()).

Ai-je besoin des privilèges d'administrateur pour se connecter à localhost? Peut-être que c'est pourquoi il ne parvient pas? Peut-être theres un problème avec mon code? J'ai essayé les ports 8888 & 8000 & ils ont tous deux échouent.

Aussi si je change le port 80 & se connecter à www.google.com je peux me connecter MAIS je n'ai pas de réponse en retour. Est-ce parce que je n'ai pas envoyé une requête HTTP ou suis-je destiné à obtenir une réponse de retour?

Voici mon code (avec la comprend supprimé):

//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;
}
  • Avez-vous quelque chose à l'écoute sur ce port sur votre machine? (Et oui, vous avez besoin d'envoyer une requête HTTP, si vous voulez un serveur web pour vous envoyer des trucs.)
  • non, je n'ai pas tout écouter, je kindof pensé que l'hôte local voudrais juste répondre lol
  • veuillez nous informer lors de localhost "juste répondu", de sorte que l'on peut nommer il Skynet appel et de la Terminaison. Gardez votre ordinateur loin de le Gros Bouton Rouge.
  • Il répondra si vous vous connectez à un port qui dispose d'un service d'écoute, et le protocole utilisé ne nécessite pas de vous parler en premier. Par exemple, si j'écris dans ma machine linux: telnet localhost 22 (qui est le port SSH), il va répondre SSH-2.0-OpenSSH_5.8p1 Debian-7ubuntu1 sans délai.
  • Il n'a "il suffit de répondre". Avec un "port unreachable" paquet ICMP, en vous disant qu'il n'y a pas de socket en écoute sur ce port. Qui la bibliothèque des sockets converti à une défaillance du code de retour de connect.
InformationsquelleAutor sazr | 2011-11-26