Winsock TCP连接,发送正常但recv防火墙被阻止

时间:2015-11-26 20:52:05

标签: sockets tcp winsock2

我有一个应用程序,它使用TCP套接字在端口80上使用winsock发送GET请求。一些用户报告了一个没有收到响应的问题,查看网络日志并看到网络设备正在获取应用程序的数据并不是很明显防火墙阻止了它。

禁用了防火墙后,它工作正常,但我不明白为什么它被阻止了。连接是从用户计算机创建的,它连接正常并发送(假设我自动打开一个端口),那么收到数据后如何在同一个连接上丢失数据?我应该提供额外的winsock设置吗?或者根本没有办法阻止防火墙阻止已经活动的连接?

这是winsock代码的精简版

SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sock == INVALID_SOCKET)
    return -1;


struct sockaddr_in client;
memset(&client, 0, sizeof(client));
client.sin_family = AF_INET;
client.sin_port = htons(80);
client.sin_addr.s_addr = inet_addr(inet_ntoa(*addr_list[0]));

if (connect(sock, (struct sockaddr *)&client, sizeof(client)) < 0){
    closesocket(sock);
    return -1;
}

if (send(sock, buffer, buflength, 0) != buflength){
    closesocket(sock);
    return -1;
}

//get response
response = "";
int resp_leng = BUFFERSIZE;
while (resp_leng == BUFFERSIZE)
{
    resp_leng = recv(sock, (char*)&buffer, BUFFERSIZE, 0);
    if (resp_leng > 0)
        response += std::string(buffer).substr(0, resp_leng);
    else
        return -1;
}

closesocket(sock);

1 个答案:

答案 0 :(得分:1)

如果while返回小于recv(),则BUFFERSIZE循环退出。这是错误的 - 您必须始终假设recv()可以从1个字节返回任意数量的数据,包括提供的缓冲区大小。