Linux 系统应用编程——网络编程(高级篇)

本文详细介绍了Linux系统中网络编程的超时检测,包括套接字接收超时与定时器超时检测,并探讨了广播和组播的原理及其实现方法,提供了发送和接收的示例代码。
摘要由CSDN通过智能技术生成

一、网络超时检测

        在网络通信过程中,经常会出现不可预知的各种情况。例如网络线路突发故障、通信一方异常结束等。一旦出现上述情况,很可能长时间都不会收到数据,而且无法判断是没有数据还是数据无法到达。如果使用的是TCP协议,可以检测出来;但如果使用UDP协议的话,需要在程序中进行相关检测。所以,为避免进程在没有数据时无限制的阻塞,使用网络超时检测很有必要。


1、套接字接收超时检测

        这里先介绍设置套接字选项的函数 setsockopt() 函数:

所需头文件 #include <sys/types.h>
#include <sys/socket.h>
函数原型 int setsockopt (int sockfd, int level, int optname,
                              const void *optval, socklen_t optlen );
函数参数 sockfd:套接字描述符
level:选项所属协议层
optval:保存选项值的缓冲区
optlen:选项值的长度
函数返回值 成功:0
出错:-1,并设置 errno

下面是套接字常用选项及其说明:

LEVEL:SOL_SOCKET

选项名称 说明 数据类型
SO_BROADCAST 允许发送广播数据 int
SO_DEBUG 允许调试 int
SO_DONTRUOTE 不查找路由 int
SO_ERROR 获得套接字错误 int
SO_KEEPALIVE 保持连接 int
SO_LINGER 延迟关闭连接 struct linger
SO_OOBINLINE 带外数据放入正常数据流 int
SO_RCVBUF 接收缓冲区大小 int
SO_SNDBUF 发送缓冲区大小 int
SO_RCVTIMEO 接收超时 struct timeval
SO_SNDTIMEO 发送超时 struct timeval
SO_REUSERADDR 允许重用本地地址和端口 int
SO_TYPE 获得套接字类型 int

下面利用SO_RCVTIMEO的选项实现套接字的接收超时检测:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define N 64
#define PORT 8888

int main()
{
	int sockfd;
	char buf[N];
	struct sockaddr_in seraddr;
	struct timeval t = {6, 0};

	if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
	{
		perror("socket error");
		exit(-1);
	}
	else
	{
		printf(&#
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值