【问题标题】:How to run a live server win winsock?winwinsock如何运行实时服务器?
【发布时间】:2017-01-16 13:39:41
【问题描述】:

所以我想在我的电脑上运行一个实时服务器来连接并从其他人那里获取信息。我以为我可以让其他人在未使用的端口上连接到我的 IP 地址。因此,例如,如果我假设的 IP 地址是 214.231.34.12 和端口 50000,我打开连接并将此信息提供给某人,他们可以连接到它并通过 TCP 向我发送信息。

我认为我可以使用此代码:

// TCPClient.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#define _WINSOCK_DEPRECATED_NO_WARNINGS
/*
Live Server on port 50000
*/
#include<io.h>
#include<stdio.h>
#include<winsock2.h>

#pragma comment(lib,"ws2_32.lib") //Winsock Library

int main(int argc, char *argv[])
{
    WSADATA wsa;
    SOCKET s, new_socket;
    struct sockaddr_in server, client;
    int c;
    char *message;

    printf("\nInitialising Winsock...");
    if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0)
    {
        printf("Failed. Error Code : %d", WSAGetLastError());
        return 1;
    }

    printf("Initialised.\n");

    //Create a socket
    if ((s = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
    {
        printf("Could not create socket : %d", WSAGetLastError());
    }

    printf("Socket created.\n");

    //Prepare the sockaddr_in structure
    server.sin_addr.s_addr = inet_addr("214.231.34.12");
    server.sin_family = AF_INET;
    server.sin_port = htons(50000);

    //Bind
    if (bind(s, (struct sockaddr *)&server, sizeof(server)) == SOCKET_ERROR)
    {
        printf("Bind failed with error code : %d", WSAGetLastError());
        exit(EXIT_FAILURE);
    }

    puts("Bind done");

    //Listen to incoming connections
    listen(s, 3);

    //Accept and incoming connection
    puts("Waiting for incoming connections...");

    c = sizeof(struct sockaddr_in);

    while ((new_socket = accept(s, (struct sockaddr *)&client, &c)) != INVALID_SOCKET)
    {
        puts("Connection accepted");

        //Reply to the client
        message = "Hello Client , I have received your connection. But I have to go now, bye\n";
        send(new_socket, message, strlen(message), 0);
    }

    if (new_socket == INVALID_SOCKET)
    {
        printf("accept failed with error code : %d", WSAGetLastError());
        return 1;
    }

    closesocket(s);
    WSACleanup();

    return 0;
}

但绑定连接失败。整个 TCP 和 winsocket 的东西对我来说是全新的,我不明白我应该如何以不同的方式处理这个问题。我知道这段代码还没有收到任何信息,这只是我目前尝试开始工作的连接。这不是设置它的正确方法吗?

bind() 失败并出现 Windows 套接字错误 10049

【问题讨论】:

  • 这是您的代码还是您从某个地方获取的?
  • 214.231.34.12 是您的 PC 或路由器的 IP,哪个做 NAT?如果您在带有 NAT 的路由器后面,则需要配置端口转发。另外,不要将您的套接字绑定到 IP,只需使用INADDR_ANY,如果涉及 NAT 或您的 IP 更改,这会更容易。另外,请先在本地测试您的程序。
  • 继续阅读有关套接字的书。你会达到http编程然后也许你可以这样做。不要在 http 和 tcp-udp/ip 之间混用。
  • bind 上失败。您从bind 打印出错误代码。编辑您的帖子以添加返回的错误代码可能会对我们有所帮助。
  • 如果你想学习套接字等。我鼓励你从头开始编写代码,或者至少阅读并理解你在那里看到的每个函数。您还应该学习一般的网络通信(IP 和 TCP 的工作原理)。在网络通信中,很多事情都可能出错。最好有助于了解您在做什么,这样您至少可以缩小自己的问题范围。对于我们来说,要求您分析所有事情然后为您提出解决方案,这太过分了。

标签: c++ tcp winsock


【解决方案1】:

在互联网上建立 TCP 连接有很多障碍:

  1. 互联网本身:连接不良/不稳定、动态 ips 等
  2. ISP:可能您的 ISP 阻止了某些端口或 ips
  3. 路由器:路由器防火墙、NAT穿越问题、upnp等
  4. 操作系统:Windows 防火墙、防病毒软件、端口被阻止/正在使用
  5. 您的应用程序:可能是代码错误

是一个全新的世界链接pcs over internet,概念是一样的,但是实现它......

【讨论】:

  • 谢谢,我会检查这些东西。我确实有一个静态 IP 和良好的连接,并且我在调制解调器/路由器上打开了端口 5000。但是是的,可能还有更多错误
  • 我建议:在您的网络中测试您的程序,在这种情况下,您的“服务器”IP 必须类似于 192.168.0.2。当它工作时,尝试路由器遍历,在这种情况下,您的服务器 ip 必须是 214.231.34.12(或类似的东西)但两台 PCS(服务器和客户端)必须在您的网络内。当它工作时,尝试完整的互联网连接(不同网络中的两台电脑)
【解决方案2】:

所以这可能是一个答案,但也许我必须按照 datenwolf 的建议使用另一个端口。

我发现无法绑定到我的 ISP 的 IP 地址。所以我已经转发了我想使用的端口,然后连接到我的计算机的 ipaddress,如下所述:

connecting to an IP address instead of localhost?

我试过了,所以我把代码中的ipaddress改为:

//Prepare the sockaddr_in structure
    server.sin_addr.s_addr = inet_addr("192.168.178.93");
    server.sin_family = AF_INET;
    server.sin_port = htons(50000);

然后当我使用 telnet 连接到 214.231.34.12 和端口 50000 时,连接正常!我只是想知道这是否是一个有效的结果?

【讨论】:

  • 等一下:您是否真的尝试绑定到不是您计算机的地址?您只能绑定到程序实际运行的机器的地址。您的 ISP 可能正在为您的路由器分配一个公共地址,但在您的网络中,您处于私有地址范围内,您当然只能绑定到该地址。如果是这种情况,那么您所做的端口转发是 only 有效的方法。在这种情况下,也建议不要显式绑定到某个地址,而只需绑定到 0.0.0.0 即“本机的所有地址”。
  • 是的,我不知道这是不可能的,但现在我非常感谢!我遵循的教程仅绑定到本地主机并连接到网站 IP 地址。但我对此相当陌生,所以我认为我必须将服务器绑定到与我希望客户端连接的相同的 IP 地址。但我错了;)哦,谢谢,是的,最好绑定到 0.0.0.0 !
猜你喜欢
  • 2022-11-10
  • 2023-01-08
  • 2020-07-29
  • 2020-11-29
  • 2019-07-03
  • 1970-01-01
  • 1970-01-01
  • 2017-08-11
  • 1970-01-01
相关资源
最近更新 更多