LINUX socket 在connect的时候发生 Operation now in progress 错误

17 篇文章 0 订阅
8 篇文章 0 订阅

决方法:

unsigned long ul = 1;
ioctl( sockfd, FIONBIO, &ul );  //设置为非阻塞模式 

放到connect()后面.

在使用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; } ``` 注意,以上代码仅作为示例,具体实现时需要根据实际情况进行修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值