linux通过4G模块connect时,errno=Operation now in progress
时间: 2024-03-10 08:50:54 浏览: 18
在使用4G模块连接网络时,可能会遇到errno为Operation now in progress的错误,这通常是由于connect函数返回前就被中断了,导致还未完成连接操作,而出现的错误。
解决这个问题的方法是使用非阻塞模式的connect函数,即在connect函数调用之前,先将socket设置成非阻塞模式(通过设置O_NONBLOCK标志位),然后调用connect函数,在返回-1并设置errno为EINPROGRESS时,使用select函数或epoll函数来等待连接操作完成。
下面是一个简单的示例代码:
```
#include <stdio.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <fcntl.h>
#include <errno.h>
#include <unistd.h>
int main() {
// 创建socket对象
int sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sock < 0) {
perror("socket error");
return -1;
}
// 设置为非阻塞模式
int flags = fcntl(sock, F_GETFL, 0);
fcntl(sock, F_SETFL, flags | O_NONBLOCK);
// 设置要连接的地址
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(80); // 连接80端口,即HTTP协议端口
addr.sin_addr.s_addr = inet_addr("220.181.38.148"); // 百度的IP地址
// 连接到公网地址
int ret = connect(sock, (struct sockaddr *)&addr, sizeof(addr));
if (ret < 0 && errno == EINPROGRESS) {
// 等待连接操作完成
fd_set fdset;
FD_ZERO(&fdset);
FD_SET(sock, &fdset);
struct timeval tv;
tv.tv_sec = 5; // 等待5秒
tv.tv_usec = 0;
ret = select(sock + 1, NULL, &fdset, NULL, &tv);
if (ret <= 0) {
printf("connect failed\n");
close(sock);
return -1;
}
} else if (ret < 0) {
printf("connect failed\n");
close(sock);
return -1;
}
// 连接成功
printf("connect to internet\n");
// 关闭socket对象
close(sock);
return 0;
}
```
注意,以上代码仅作为示例,具体实现时需要根据实际情况进行修改。