c++ - 无法使用我的 IP 地址从另一台计算机连接到我的 winsock 服务器
问题描述
我正在聊天。
我可以使用 127.0.0.1 IP 地址在同一台计算机上启动我的服务器和客户端,并且可以正常通话,但是如果我尝试在客户端中使用自己的 IP 地址连接到服务器,它就无法连接。如果其他人也尝试这样做,它就行不通
我在我的路由器中进行了端口转发,如下所示:
外部主机:我的 ip 内部主机:我通过 ipconfig (192.168.1.4) 获得的内部 IP 内部端口:54444 外部端口:54444
即使那样,我认为我仍然可以在没有端口转发的情况下连接到我的 IP 地址,因为服务器托管在 127.0.0.1/localhost 上,对吧?
这是我的客户代码:
WSADATA wsa;
if (!WSAStartup(MAKEWORD(2, 2), &wsa))
{
printf("started server\n");
SOCKET listen_sock = socket(AF_INET, SOCK_STREAM, 0);
if (listen_sock)
{
printf("created listen socket\n");
sockaddr_in addr;
addr.sin_family = AF_INET;
inet_pton(AF_INET, "92.83.235.216", &addr.sin_addr);
addr.sin_port = htons(54444);
if (!connect(listen_sock, reinterpret_cast<sockaddr*>(&addr), sizeof(addr)))
{
printf("connected to server\n");
char buffer[2048];
char input[2048];
for(;;)
{
printf("message: ");
scanf_s("%s", input);
if (send(listen_sock, input, strlen(input) + 1, 0))
{
printf("\nsent message \"%s\"", input);
}
memset(input, 0, sizeof(input));
printf("\n");
}
}
}
}
printf("%d\n", WSAGetLastError());
WSACleanup();
它在显示“正在创建侦听套接字”后停止,就在 connect() 调用
有任何想法吗?
编辑:服务器代码非常混乱,因为我将它变成了一个类以使其更易于使用+添加一个线程来处理多个连接,但就像我说的那样它确实在内部工作
除了监听和接受调用之外,服务器代码中唯一不同的是我添加的这些规则:
char opt_val = 1;
setsockopt(this->m_listen_sock, SOL_SOCKET, SO_REUSEADDR, &opt_val, sizeof(opt_val));
setsockopt(this->m_listen_sock, IPPROTO_TCP, TCP_NODELAY, &opt_val, sizeof(opt_val));
解决方案
您所描述的内容听起来像是您的SYN
数据包被丢弃(SYN
... no SYN/ACK
or RST
)。您可以使用wireshark查看实际的 tcp 连接(端口上的过滤器)发生了什么。
localhost
您可能希望通过监听和连接这种方式来消除服务器作为错误来源。您可以使用 验证它正在侦听正确的地址和端口netstat
。
否则,如果您发布服务器代码会有所帮助。
推荐阅读
- r - R Shiny - R Sweave Report 中未打印正确的输出
- webassembly - 发射 ES6 mjs 时的 Emscripten FS
- azure-devops - 待审批时,如何在管道摘要中看到“测试和覆盖率”?
- jms - 如何使用 JmsListener 接收 MQMessage
- atom-editor - Atom 在使用自定义语法时随机停止正确突出显示
- c++ - 是否有可能将模数重载到;仅收到前导数字时;在 C++ 中返回数字/100?
- reactjs - 在 maxlength 反应功能组件后移动到下一个输入
- intellij-idea - 从 Intellij 清除所有书签
- excel - 如何通过excel VBA中的列循环
- python - 如何扫描频道是否为 dmchannel 作为用户的响应