TCP保持机制没有';我不能在MacOS上工作

TCP保持机制没有';我不能在MacOS上工作,macos,tcp,upload,stack,chromium,Macos,Tcp,Upload,Stack,Chromium,我在mac上有一个http客户端,可以将文件上传到服务器 使用chromium网络堆栈,启用tcp套接字保留默认值,超时45秒 但当我在正常上传阶段将Wifi切换到4G时,使用tcpdump捕获tcp数据包 没有显示保留的数据包 我想知道为什么会发生这种情况,以及如何使其有效 macos上的tcp客户端代码: #include <iostream> #include <unistd.h> #include <sys/socket.h> #include <

我在mac上有一个http客户端,可以将文件上传到服务器

使用chromium网络堆栈,启用tcp套接字保留默认值,超时45秒

但当我在正常上传阶段将Wifi切换到4G时,使用tcpdump捕获tcp数据包

没有显示保留的数据包

我想知道为什么会发生这种情况,以及如何使其有效

macos上的tcp客户端代码:

#include <iostream>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <netinet/tcp.h>
#include <netdb.h>

using namespace std;

int main(int args, char** argv){
    int fd = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if(fd<0) return 0;

    cout << "tcp fd created: " << fd << endl;
    int on = 1;
    if (setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, &on, sizeof(on))) {
        cout << "Failed to set SO_KEEPALIVE on fd: " << fd;
        return 0;
    }

    int delay = 10;
    if (setsockopt(fd, IPPROTO_TCP, TCP_KEEPALIVE, &delay, sizeof(delay))) {
        cout << "Failed to set TCP_KEEPALIVE on fd: " << fd;
        return 0;
    }

    struct sockaddr_in peer_addr_;
    auto server = gethostbyname(argv[1]);
    bzero((char*)&peer_addr_, sizeof(struct sockaddr_in));
    peer_addr_.sin_family = AF_INET;
    peer_addr_.sin_port = htons(7777);
    bcopy((char*)server->h_addr, (char*)&peer_addr_.sin_addr.s_addr, server->h_length);

    int rv = connect(fd, (struct sockaddr*)&peer_addr_, sizeof(struct sockaddr));
    if(rv < 0) return 0;
    while(true){
        cout << "client online ..." << endl;
        sleep(3);
    }
    return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
int main(int参数,字符**argv){
int fd=::套接字(AF_INET、SOCK_STREAM、IPPROTO_TCP);

如果(fdI在未关闭wifi的情况下进行了测试,它工作正常,仅在没有wifi或切换到另一个网络时失败。您在哪里测量TCP保持活动的数据包?因为只有在连接空闲时才应由客户端发送这些数据包,您需要在客户端进行检查。如果您仅在服务器端进行检查,则可能存在一些中间盒。)在这两者之间丢弃这些无有效负载的数据。@SteffenUllrich我在客户端使用wireshark和tcpdump进行了测量,当我恢复网络时,最后一个keepalive数据包将被发送并重新接收。请让我理解:您关闭了一个接口(WiFi),但仍然希望看到流量(TCP保持活动状态)在这个界面上?@SteffenUllrich不完全是,我想要的是网络交换机,比如4G交换机到wifi,或者wifi A到wifi B