2013-06-20 4 views
1

Je travaille avec WinSock et j'ai un problème: si je définis MY_IP comme étant "127.0.0.1" cela fonctionne mais je ne veux pas ça je veux pour définir MY_IP comme étant "109.95.202.122" mais cela ne fonctionne pas.Erreur avec les fonctions bind() et listen() (WinSock)

Je ne parviennent: Fail bind() et Listen Error

#pragma comment(lib, "Ws2_32.lib") 

#include <sdkddkver.h> 
#include <conio.h> 
#include <stdio.h> 

#include <WinSock2.h> 
#include <Windows.h> 
#include <iostream> 
#include <string> 
#include <process.h> 
#define MY_IP  "109.95.202.122" 
using namespace std; 
int main() 
{ 
    WSADATA wsaData; 

    int result = WSAStartup(MAKEWORD(2, 2), & wsaData); 
    if(result != NO_ERROR) 
     cout << "Initialization error." << endl; 
    SOCKET mainSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 
    if(mainSocket == INVALID_SOCKET) 
    { 
     printf("Error creating socket: %ld\n", WSAGetLastError()); 
     WSACleanup(); 
     return 1; 
    } 
    sockaddr_in service; 
    memset(& service, 0, sizeof(service)); 
    service.sin_family = AF_INET; 
    service.sin_addr.s_addr = inet_addr(MY_IP); 
    service.sin_port = htons(27015); 
    if(bind(mainSocket, (SOCKADDR*)&service, sizeof(service))== SOCKET_ERROR) 
    { 
     cout << "Fail bind()" << endl; 
     closesocket(mainSocket); 
    } 
    if(listen(mainSocket, 1) == SOCKET_ERROR) 
    { 
     cout << "Listen Error"; 
    } 
    cout << "Oczekiwanie na polaczenie" << endl; 
    SOCKET acceptSocket = SOCKET_ERROR; 
    while(acceptSocket == SOCKET_ERROR) 
    { 
     acceptSocket = accept(mainSocket, NULL, NULL); 
    } 
    if(acceptSocket != SOCKET_ERROR) 
    { 
     cout << "Connected ! :D" << endl;  
     for(;;) 
     { 
      char chWiadomosc[1000]; 
      recv(mainSocket, chWiadomosc, sizeof(chWiadomosc), NULL); 

     } 
    } 
} 

Répondre

1

si l'bind() ou listen() ne réussit pas, appelez WSAGetLastError() pour savoir pourquoi il a échoué.

Si un serveur se lie à 127.0.0.1, les clients ne pourront se connecter qu'à 127.0.0.1. Si les clients doivent se connecter à 109.95.202.122, le serveur doit se lier à l'adresse IP locale qui acceptera les clients ou spécifier INADDR_ANY pour lier toutes les adresses IP locales disponibles. Si 109.95.202.122 est un IP local du serveur alors tout va bien. Toutefois, si 109.95.202.122 est réellement l'adresse IP publique d'un routeur/NAT que le serveur exécute, le serveur doit se lier à l'adresse IP locale à laquelle le routeur/NAT est configuré pour transférer les requêtes inbounds. bind() peut uniquement se lier aux adresses IP locales qui appartiennent à la machine sur laquelle s'exécute bind().