我正在聊天。
我可以使用127.0.0.1 ip地址在同一台计算机上启动服务器和客户端,并且可以正常通话,但是如果我尝试在客户端中使用自己的IP地址连接服务器,它将无法连接。如果其他人也尝试这样做,那就行不通了
我在路由器中这样转发端口:
external host: my ip internal host: my internal ip i got with ipconfig (192.168.1.4) internal port: 54444 external port: 54444
即使那样,我认为我仍然应该能够在没有portforward的情况下连接到我的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();
它在显示connecting()调用后显示“正在创建侦听套接字”后停止
有什么想法吗?
编辑:服务器代码非常混乱,因为我将它划分为一个类,以使其更易于使用+添加线程来处理多个连接,但是就像我说的那样,它确实在内部起作用
除了侦听和接受呼叫之外,服务器代码中唯一不同的是我添加的以下规则:
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));
答案 0 :(得分:0)
您所描述的声音像SYN
数据包被丢弃(SYN
...否SYN/ACK
或RST
)。您可以使用wireshark来查看实际的tcp连接(端口上的过滤器)发生了什么。
您可能想通过侦听localhost
并以这种方式连接来消除服务器作为错误源的原因。您可以使用netstat
验证它是否在正确的地址和端口上进行监听。
否则,如果您发布服务器代码,将会有所帮助。