当我在OSX和iOS上切断网络时,TCP连接处于活动状态
我编写了一个简单的TCP客户端使用套接字,并将心跳发送到TCP服务器进行连接检测。当我切断网络时,在OSX和iOS上接收超时时,心跳正常。我在Android上测试了同样的场景,我在切断网络后收到了一个发送错误。此处是示例代码段:当我在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
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
选项。谢谢。我会尝试的。