连接到 public ip 的 Winsock 编程

Winsock programming connecting to a public ip

我正在尝试从另一台计算机 publicly 连接到我的电脑,它 return 是来自连接功能的 10060 错误代码。

当我 bind 服务器与 inet_addr("127.0.0.1") 从本地机器 并使用它工作的客户端连接。

我已经尝试使用下面相同的客户端代码连接服务器的 public ip,return 10060 谁能帮忙?

服务器

#include<winsock2.h>

int main(){
    WSADATA ws;
    SOCKET s, newSocket;
    struct sockaddr_in server, client;
    int c;

    if(WSAStartup(MAKEWORD(2,2), &ws) != 0){
        puts("error wsastartup");
        printf("wsa error at %d", GetLastError());
    }

    if((s=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET){

        printf("socket error at %d", GetLastError());
    }

    server.sin_addr.s_addr = inet_addr("127.0.0.1");
    server.sin_port = htons(8888);
    server.sin_family = AF_INET;

    if(bind(s, (struct sockaddr*)&server, sizeof(server)) == SOCKET_ERROR){
        printf("socket error at %d", GetLastError());
    }else{
        puts("bind done");
    }

    listen(s, 3);
    puts("Waiting for incoming connections");

    c = sizeof(struct sockaddr_in);

    char *message = "hello client i got ur message";    

    while((newSocket = accept(s, (struct sockaddr*) &client, &c)) != INVALID_SOCKET){
        puts("connection accepted");
        send(newSocket, message, strlen(message), 0);
    }

    if(newSocket == INVALID_SOCKET){
        printf("accept failed iwth the code %d", GetLastError());
        return 1;
    }

    getchar();

    closesocket(s);
    WSACleanup();
    return 0;
}

这是客户

#include <winsock2.h>

int main(){

    WSADATA ws;
    SOCKET s;
    struct sockaddr_in server;
    char *message = "hello this is a message";

    if(WSAStartup(MAKEWORD(2,2 ), &ws) != 0){
        printf("wsa error at %d", GetLastError());
    }else{
        puts("wsa done");
    }

    if((s = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET){
        printf("invalid socket at %d", GetLastError());
    }

    server.sin_family = AF_INET;
    server.sin_addr.s_addr = inet_addr("127.0.0.1");
    server.sin_port = htons(8888);

    if(connect(s, (struct sockaddr*)&server, sizeof(server)) < 0){
        printf("connection err %d", GetLastError());
    }else{
        puts("connected");
    }
    return 0;
}

问题出在您的服务器上。您正在将其绑定到 127.0.0.1。这意味着您的服务器将仅绑定到环回接口,因此只有与服务器位于同一台计算机上的客户端 运行 才能使用同一接口连接到服务器。

如果您希望您的服务器接受来自 public 网络接口的客户端,您必须改为绑定到该接口的 IP:

server.sin_addr.s_addr = inet_addr("<IP belonging to the public interface>");

或者,您可以将您的服务器绑定到所有可用的网络接口:

server.sin_addr.s_addr = inet_addr("0.0.0.0");

或者:

server.sin_addr.s_addr = INADDR_ANY;

请注意,您只能绑定到属于 运行 服务器所在机器的 IP。如果客户端尝试连接的 public IP 属于 NAT/router,则必须将服务器绑定到连接到 NAT/router 的本地 LAN IP,然后设置端口forwarding on the NAT/router 将数据包从 NAT/router 的 public IP 上的开放端口转发到服务器 LAN IP 上的侦听端口。如果 NAT/router 支持 uPNP,您的服务器可以可编程设置端口转发。否则,NAT/router 的管理员必须手动设置转发。