Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/93.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当我在OSX和iOS上切断网络时,TCP连接处于活动状态_Ios_Macos_Sockets_Tcp - Fatal编程技术网

当我在OSX和iOS上切断网络时,TCP连接处于活动状态

当我在OSX和iOS上切断网络时,TCP连接处于活动状态,ios,macos,sockets,tcp,Ios,Macos,Sockets,Tcp,我编写了一个简单的TCP客户端使用套接字,并将心跳发送到TCP服务器进行连接检测。当我切断网络时,在OSX和iOS上接收超时时,心跳正常。我在Android上测试了同样的场景,我在切断网络后收到了一个发送错误。此处是示例代码段: typedef std::unique_ptr<std::thread> ThreadPtr; int server_socket; // thread for send something. ThreadPtr create_send_thread(con

我编写了一个简单的TCP客户端使用套接字,并将心跳发送到TCP服务器进行连接检测。当我切断网络时,在OSX和iOS上接收超时时,心跳正常。我在Android上测试了同样的场景,我在切断网络后收到了一个发送错误。此处是示例代码段:

typedef std::unique_ptr<std::thread> ThreadPtr;
int server_socket;
// thread for send something.
ThreadPtr create_send_thread(const std::string& content) {
    ThreadPtr thread(new std::thread([&]() {
        std::string msg;
        while (true) {
            int ret = send(server_socket, content.c_str(),
                           content.size(), 0);
            if (ret == -1) {
                perror("SEND failed!\n");
            }
            printf("SEND %s\n", msg.c_str());
            std::this_thread::sleep_for(
                std::chrono::milliseconds(1000));
        }
    }));
    return thread;
}
// thread for receive data.
ThreadPtr create_recv_thread() {
    ThreadPtr thread(new std::thread([]() {
        char recv_msg[1024];
        while (true) {
            bzero(recv_msg, 1024);
            long byte_num = recv(server_socket, recv_msg, 1024, 0);
            if (byte_num <= 0) {
                perror("RECV failed!");
            } else {
                std::string msg(recv_msg, byte_num);
                prinf("RECV %s", msg.c_str());
            }
        }
    }));
    return thread;
}
int main (int argc, const char * argv[]) {
    struct sockaddr_in server_addr;
    server_addr.sin_len = sizeof(struct sockaddr_in);
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(8000);
    server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
    bzero(&(server_addr.sin_zero),8);
    server_socket = socket(AF_INET, SOCK_STREAM, 0);
    if (server_socket == -1) {
        perror("socket error\n");
        return 1;
    }
    int ret = connect(server_socket,
                      (struct sockaddr *)&server_addr,
                      sizeof(struct sockaddr_in));
    if (ret == 0) {
        ThreadPtr pt0 = create_send_thread("heartbeats");
        ThreadPtr pt1 = create_recv_thread();
        pt0->join();
        pt1->join();      
    }
    return 0;
}
typedef std::unique_ptr ThreadPtr;
int-server_-socket;
//发送某物的线程。
线程ptr创建线程发送线程(const std::string和content){
线程PTR线程(新标准::线程([&](){
std::字符串msg;
while(true){
int ret=send(server_socket,content.c_str(),
content.size(),0);
如果(ret==-1){
perror(“发送失败!\n”);
}
printf(“发送%s\n”,msg.c_str());
std::此线程::睡眠(
std::chrono::毫秒(1000));
}
}));
返回线程;
}
//接收数据的线程。
ThreadPtr create_recv_thread(){
ThreadPtr线程(新标准::线程([])){
char recv_msg[1024];
while(true){
bzero(recv_msg,1024);
长字节\u num=recv(服务器\u套接字,recv\u消息,1024,0);
if(byte_num join();
pt1->join();
}
返回0;
}

是否有任何方法可以像Android一样,在OSX和iOS上立即检测网络中断而不使用接收超时?

这是非常特定于平台的。根据网络被切断的方式,操作系统可能无法立即通知活动对等方。你不能以跨平台的方式依赖此行为。依赖于ly.如果需要,启用TCP级别的保留,以帮助尽早而不是晚些时候检测丢失的连接。谢谢。我是网络程序的新手。我不知道如何启用TCP级别的保留,您能提供一些示例来实现吗?使用
setsockopt()
使用
SOL\u SOCKET
SO\u KEEPALIVE
选项和
IPPROTO\u TCP
TCP\u KEEPALIVE
选项。谢谢。我会尝试的。