Linux-socket编程之非阻塞tcp程序示例和UDP程序示例

Linux-socket编程之非阻塞tcp程序示例和UDP程序示例

2023年7月15日发(作者:)

Linux-socket编程之⾮阻塞tcp程序⽰例和UDP程序⽰例⽬录1、TCP通讯tcp是可靠通讯,需要先建⽴连接,再发送数据。connect阻塞模式下,⼀般是默认75s,但是因为有线程切换等原因,实际时间会更长。#include #include #include #include #include #include #include #include #include#include #include #include #define PEER_IP "192.168.2.104"#define PEER_PORT 502int main(){ int ret = 0; int sock_fd; int flags=0; struct sockaddr_in addr; sock_fd = socket(AF_INET, SOCK_STREAM, 0); fcntl(sock_fd, F_SETFL, flags|O_NONBLOCK); _family = AF_INET; _port = htons(PEER_PORT); _addr.s_addr = inet_addr(PEER_IP); int res = connect(sock_fd, (struct sockaddr *)&addr, sizeof(struct sockaddr_in)); if (0 == res) { printf("socket connect succeed immediately.n"); ret = 0; } else { if (errno == EINPROGRESS) { res = connect(sock_fd, (struct sockaddr *)&addr, sizeof(struct sockaddr_in)); if(0 == res) { printf("socket connect succeed the second time.n"); ret = 0; } else { printf("connect to host %s:%d failed.n", PEER_IP, PEER_PORT); ret = errno; } } } } if (0 == ret) { send(sock_fd, "hello", sizeof("hello"), 0); } else { printf("connect to host %s:%d failed.n", PEER_IP, PEER_PORT); } close(sock_fd); return ret;}这⾥注意⼀下:就是客户端再connect的时候第⼀次connect总是会返回-1,errno是115,往往第⼆次连接就可以成功了。但是对于服务端来说,第⼀次连接已经成功返回了。这⾥可能跟设置socket是⾮阻塞的有关系。解决⽅法:1)先设置socket为阻塞,待connect连接成功后改成⾮阻塞2)connect返回115时,需要判断socket是否可写,如果时可写的话则连接成功,通过select 或者poll判断可写3)第⼀次connect返回EINPROGRESS可再次connect,如果没问题就证明成功

Linux下常见的socket错误码:EACCES, EPERM:⽤户试图在套接字⼴播标志没有设置的情况下连接⼴播地址或由于防⽕墙策略导致连接失败。EADDRINUSE 98:Address already in use(本地地址处于使⽤状态)EAFNOSUPPORT 97:Address family not supported by protocol(参数serv_add中的地址⾮合法地址)EAGAIN:没有⾜够空闲的本地端⼝。EALREADY 114:Operation already in progress(套接字为⾮阻塞套接字,并且原来的连接请求还未完成)EBADF 77:File descriptor in bad state(⾮法的⽂件描述符)ECONNREFUSED 111:Connection refused(远程地址并没有处于监听状态)EFAULT:指向套接字结构体的地址⾮法。EINPROGRESS 115:Operation now in progress(套接字为⾮阻塞套接字,且连接请求没有⽴即完成)EINTR:系统调⽤的执⾏由于捕获中断⽽中⽌。EISCONN 106:Transport endpoint is already connected(已经连接到该套接字)ENETUNREACH 101:Network is unreachable(⽹络不可到达)ENOTSOCK 88:Socket operation on non-socket(⽂件描述符不与套接字相关)ETIMEDOUT 110:Connection timed out(连接超时)

2、UDP通讯UDP是不可靠通讯,⾯向⾮连接的。

发布者:admin,转转请注明出处:http://www.yc00.com/xiaochengxu/1689408757a243335.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信