首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何让我的服务器应用程序使用我的IP地址而不是本地主机

如何让我的服务器应用程序使用我的IP地址而不是本地主机
EN

Stack Overflow用户
提问于 2010-11-23 11:48:44
回答 2查看 2.7K关注 0票数 0

这可能是微不足道的,但我需要帮助让我的服务器监听我的ISP地址,而不是客户机-服务器messager程序中的本地主机。我的服务器和客户端如下所示。

服务器

代码语言:javascript
复制
/*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;
}

客户端

代码语言:javascript
复制
/*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;
}

我知道如何(我认为)如何指定客户机,以便通过在client.cpp中更改服务器来使其连接到我的IP地址XXX.XX.XXX.XX,但是我不确定如何让服务器监听这件事。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-11-23 12:06:04

看看这里:

C++ strange socket data

这一行:

代码语言:javascript
复制
addrinfo.sin_addr.s_addr = INADDR_ANY;

指定任何地址。请看这里:

  • http://en.wikipedia.org/wiki/Getaddrinfo

对于getaddrinfo,如果要使用特定的IP或主机名,而不是任何IP或主机名。

票数 1
EN

Stack Overflow用户

发布于 2010-11-23 12:09:23

getaddrinfo将服务器的身份作为第一个选项-这可以是您可以在dns中查找的名称或ip地址。

当您在“服务器”端指定null时,它意味着本地主机,而在客户端,您专门设置了本地主机。

The MSDN doc

你使用的函数将返回一个可能的addrinfo列表,你恰好绑定了第一个。

现在你在暗示你想要一个流。剩下的就交给解析器了,因此您将在ipv4和ipv6上获取本地主机的所有ips (环回、无线、以太网、wan)和任何端口上的内容。

您需要更具体地说明您的提示,或者可能跳过此函数,直接指定端口和地址。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4252593

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档