当前位置: 首页 > 服务器&&网络编程 > 正文

Linux 网络编程 HL IO

Linux 网络编程

在说IO之前先说下几个超时处理方式。

套接字超时处理

@调用alarm 在超时后产生SIGALRM 信号,一个系统自带的定时器,但是信号在不同系统下的不同处理方式可能会干扰到现有alarm 进程的调用。

@使用select 实现一个简单的定时器,前边也说过

@设置SO_RCVTIMEO 和 SO_SNDTIMEO 套接字选项

alarm 系统调用

#include <unistd.h>

unsigned int alarm(unsigned int seconds);

这个函数可以设置一个定时器,在将来的某个时刻,这个定时器会超时,当定时期超时产生信号,如果忽略,或不扑捉此信号,则默认终止这个进程。

总结:返回的是剩下的时间,设置0清除上一个被设置的定时器。

一个示例,:

2016-03-17 19:01:08 的屏幕截图

不过有一些问题,需要特殊说明一下:

1.我们再设置一个定时器之前一定要检查之前有没有定时器被设置

2.注意我们修改了相应信号的除里函数,使用完后一定要恢复原配

3.小心在alarm( ) 和 pause( ) 之间由一个问题,如果alarm 在 pause 之前直接返回,就有麻烦了,这个进程会再其它信号处理程序返回之前,一直挂起我们的进程。

总的来说这个alarm 问题还是挺多的,需要注意的东西很多,不过后边会研究专门的定时器实现。

几种IO函数

recv && send

#include <sys/types.h>
#include <sys/socket.h>

ssize_t send(int sockfd, const void *buf, size_t len, int flags);

ssize_t recv(int sockfd, void *buf, size_t len, int flags);

参数:

@sockfd 这个函数是面向套接字的

@buf  缓冲区

@len 数据长度

@flags  标志位或者0

2016-03-17 19:36:38 的屏幕截图

以上是这个标志的参数表,其余和write 和 read 无异

readv && writev

ssize_t readv(int fd, const struct iovec *iov, int iovcnt);

ssize_t writev(int fd, const struct iovec *iov, int iovcnt);

参数中有一个数据结构

struct iovec {
void *iov_base;              /* Starting address */
size_t iov_len;                /* Number of bytes to transfer */
};

这两个函数和write/read 的区别是,允许单个系统调用读入或写来自多个缓冲区。从参数都可以看出这个是一个通用的API,它不仅仅只支持套接字,它是面向所有BUF的。

recvmsg && sendmsg

这个函数就比较全能了

ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags);

ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags);

其实这几个函数功能都是类似的只不过根据参数的有非常多的组合罢了。

这个函数可以指定从哪一个地址读取信息。

这个结构体信息:

2016-03-17 19:50:52 的屏幕截图

@msg_name : 一个网际地址信息

@msg_namelen:  网际地址信息大小

@msg_iov  :   多个缓冲区数组

@msg_iovlen:  缓冲区的个数

@msg_control  : 辅助数据

@msg_controllen: 辅助数据长度

@msg_flags  :  标识,上边有

 

这里说下外带数据:

struct cmsghdr {

socklen_t  cmsg_len;

int   cmsg_level;

int  cmsg_type;

};

需要用直接强制转换加malloc 就可以用了。

sendto && recvfrom

ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,const struct sockaddr *dest_addr, socklen_t addrlen);

ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen);

这个函数比较简单了,可以直接指定接收,发送的地址。

本文固定链接: http://zmrlinux.com/2016/03/17/linux-%e7%bd%91%e7%bb%9c%e7%bc%96%e7%a8%8b-hl-io/ | Kernel & Me

该日志由 root 于2016年03月17日发表在 服务器&&网络编程 分类下, 你可以发表评论,并在保留原文地址及作者的情况下引用到你的网站或博客。
原创文章转载请注明: Linux 网络编程 HL IO | Kernel & Me