Как мне заставить мое серверное приложение использовать мой IP-адрес вместо localhost - PullRequest
0 голосов
/ 23 ноября 2010

это, вероятно, тривиально, но мне нужна помощь в том, чтобы мой сервер прослушивал мой IP-адрес интернет-провайдера, а не локальный хост в моей программе обмена сообщениями клиент-сервер. Мой сервер и клиент выглядит следующим образом.

Сервер

/*Server */
#define _WIN32_WINNT 0x501
#include <iostream>
#include <windows.h>
#include <winsock2.h>
#include <ws2tcpip.h>
using namespace std;

const int winsock_version = 2;
#define PORT "3490"
#define MAX_NUM_CONNECTIONS 10

int main(void){

    WSADATA wsadata;

    if (WSAStartup(MAKEWORD(winsock_version,0),&wsadata) == 0){
        cout<<"-WSAStartup Initialized." << endl;

        struct addrinfo hints,*res;
        int sock_fd;

        memset(&hints,0,sizeof hints);
        hints.ai_family = AF_UNSPEC;
        hints.ai_socktype = SOCK_STREAM;
        hints.ai_flags = AI_PASSIVE;

        if (getaddrinfo(NULL,PORT,&hints,&res) != 0){
            cout<<"-Call to getaddress was unsucceful." << endl;
        }

        if( (sock_fd = socket(res->ai_family,res->ai_socktype,res->ai_protocol)) == -1){
            cout<<"-Unable to Create socket." << endl;
        }

        if ( (bind(sock_fd, res->ai_addr, res->ai_addrlen)) != -1 ){
            cout<<"-binding successful." << endl;
        }

        if ( (listen(sock_fd,MAX_NUM_CONNECTIONS)) != -1){
            cout<<"-Listening for incoming connections." << endl;
        }
        //-------------------------------------------------------------

        struct sockaddr_storage incming_info;
        socklen_t sin_size;
        sin_size = sizeof incming_info;

        int new_fd;

        new_fd = accept(sock_fd, (struct sockaddr*)&incming_info,&sin_size);
        if (new_fd == -1){
            cout<<"-Accepting error." << endl;
        }
        if(new_fd == INVALID_SOCKET){
            cout<<"-INVALID SOCKET ERROR." << endl;
        }
        char buffer[128];
        while(true){
            int ret_val;

            ret_val = recv(new_fd,buffer,sizeof(buffer),0);
            if(ret_val == -1){
                cout<<"Receiving Error." << endl;
                break;
            }else if(ret_val == 0){
                cout<<"Connection has been closed!." << endl;
                break;
            }else{
                cout<<"Server: " << buffer<< endl;
            }
        }
        cout<<"-Closing connection" << endl;
        closesocket(new_fd);

    }else{
        cout<<"-WSAStartup Initialization failed." << endl;
        if(WSACleanup()!=0){
            cout<<"-WSACleanup Successful." << endl;
        }else{
            cout<<"-WSACleanup Failed." << endl;
        }
    }
    return 0;
}

клиент

/*client*/
#define _WIN32_WINNT 0x501
#include <iostream>
#include <windows.h>
#include <winsock2.h>
#include <ws2tcpip.h>
using namespace std;

#define PORT "3490"
#define SERVER "localhost"
const int winsockVersion = 2;


int main(void){

    WSADATA wsadata;
    if ( (WSAStartup(MAKEWORD(2,0),&wsadata)) == 0){
        cout<<"-WSAStartup Initialized." << endl;

        struct addrinfo hints, *res;
        int sockfd;

        memset(&hints,0,sizeof hints);
        hints.ai_family = AF_UNSPEC;
        hints.ai_socktype = SOCK_STREAM;

        if (getaddrinfo(SERVER,PORT,&hints,&res) != 0){
            cout<<"-getaddrinfo unsuccessful." << endl;
        }

        if ( (sockfd = socket(res->ai_family,res->ai_socktype,res->ai_protocol)) == -1 ){
            cout<<"-Unable to create socket." << endl;
        }

        if ( (connect(sockfd,res->ai_addr,res->ai_addrlen)) != -1 ){
            cout<<"-Connection Established." << endl;
        }

        cout<<"-Client connecting to: " << res->ai_addr << endl;

        while(true){
            string text_buff;
            cout<<"Enter text: ";
            getline(cin,text_buff);
            if( (send(sockfd,text_buff.c_str(),text_buff.length()+1,0)) != -1 ){
                cout<<"-text_buff sent!." << endl;
            }

        }

    }else{
        cout<<"-WSAStartup Initialization failed." << endl;
        if(WSACleanup()!=0){
            cout<<"-WSACleanup Successful." << endl;
        }else{
            cout<<"-WSACleanup Failed." << endl;
        }
    }

    return 0;
}

Я знаю, как (я думаю) указать клиента, чтобы он подключился к моему IP-адресу XXX.XX.XXX.XX, изменив SERVER в client.cpp, но я не уверен, как получить сервер для прослушивания на этом?.

Ответы [ 2 ]

1 голос
/ 23 ноября 2010

Посмотрите здесь:

C ++ странные данные сокета

Эта строка:

addrinfo.sin_addr.s_addr = INADDR_ANY;

указывает любой адрес.Смотрите здесь:

для getaddrinfo, если вы хотите использовать определенный IP или имя хоста вместо любого.

0 голосов
/ 23 ноября 2010

getaddrinfo принимает в качестве первого варианта идентификатор сервера - это может быть имя, которое вы можете найти в DNS или IP-адрес.

когда вы указываете null на стороне «сервера», это подразумевает localhost, на клиенте вы специально устанавливаете локальный хост.

Документ MSDN

Функция, которую вы используете, собирается сообщать список возможных аддринфо, вы связываете первый.
В данный момент вы намекаете, что хотите поток. остальное зависит от распознавателя, поэтому вы получите информацию обо всех ips для localhost (loopback, wireless, ether, wan) и на любом порте ipv4 и ipv6.

Вы должны быть более точными в своих подсказках или, возможно, пропустить эту функцию и указать порт и адрес напрямую.

...