Chinaunix首页 | 论坛 | 博客
  • 博客访问: 513001
  • 博文数量: 174
  • 博客积分: 8001
  • 博客等级: 中将
  • 技术积分: 1840
  • 用 户 组: 普通用户
  • 注册时间: 2009-03-04 19:30
文章分类

全部博文(174)

文章存档

2011年(1)

2010年(24)

2009年(149)

我的朋友

分类: 系统运维

2009-10-16 14:40:59


NOTES
accept的第三个参数必须预先填充结构体的大小,否则不能工作。
select 和 poll都是轮询内核,所以如果使他们在循环中空转,那么将会浪费CPU资源,应该合理设置 timeout。

网络知识


相关函数
结构体作为数据结构,是总结函数的index。

sockaddr结构:
struct in_addr
{
in_addr_t s_addr;
};
struct sockaddr_in
{
uint8_t sin_len;
sa_family sin_familly;
in_port_t sin_port;
struct in_addr sin_addr;
char sin_zero[8];
};

有时候需要字节排序函数,有时候则不需要。分析如下:
1. sockaddr填充的总是网络字节,所以当你要填充一个sockaddr结构的时候,你必须进行字节排序。
2. inet_转换函数是在点分十进制和网络字节中转换,所以调用了这一类函数,你就不需要调用字节排序函数
字节操作函数:
b系函数:bzero, bcopy, bcmp是strings.h头文件。
m系函数:memset, memcpy, memcmp是string.h头文件。
字节排序函数:
htons
htonl
ntohs
ntohl
inet转换函数:
inet_ntop
inet_pton

名字与地址转换
DNS域名服务系统中的条目,RR(resource record), A, 4A, MX, CNAME,FQDN(全限定域名)
解析函数向域名服务器发出请求,得到主机信息。
hostent结构:
gethostbyname
gethostbyaddr
servent结构:
getservbyname
getservbyport
能处理IPV6:
addrinfo结构:
getaddrinfo
getnameinfo
shutdown函数关闭某个套接口的读或者写或者两者。然后从I/O复用中去掉相应文件描述符。

TCP服务器框架

迭代服务器
并发服务器
标准的做法是从accept返回后,子进程需要close listenfd, 最后close connectfd; 而父进程需要close connectfd。
如果调用exec族函数,那么由于内存被替换,而不是拷贝,所以没有办法获得connectfd所使用的对端地址。和套接口相关的信息可以由以下函数获得:
getsockname
getpeername

I/O模型
由内核在内核缓冲区准备好数据,然后由内核缓冲区拷贝数据到应用程序缓冲区。
linux的I/O模型分为:
阻塞I/O
非阻塞I/O
I/O复用
信号驱动I/O
异步I/O
由于前四种都会在第二步的时候阻塞于recvfrom调用,所以称之为同步I/O。异步I/O是由内核负责把数据拷贝到应用程序缓冲区的。
我们主要使用select(pselect)和poll(ppoll)这两个函数来分别实现相应的功能。
这一部分内容比较重点,也比较难。特别是服务器端,不派生子进程,而是通过使用I/O复用来迭代处理多客户的模型。我们将用例子来说明这一部分的内容。
使用select函数:select, pselect, FD_CLR, FD_ISSET, FD_SET, FD_ZERO
在要监视的fd_set中对相关的位设置,调用select后如果返回的fd_set仍然包括该位(FD_ISSET),那么就是说该位代表的描述符可用。在每次使用之前都要重设fd_set。
pselect函数和select函数的不同点在于timeout结构和信号掩码。
大多数的操作系统支持的时间粒度是10ms。
只讨论第二点,关于sigset参数。常用的技术是在调用pselect的代码里设置对某一个信号的掩码,然后在调用pselect的参数里消去对这个信号的掩码,那么pselect负责对该信号的处理。
poll函数与select函数类似(除了处理流设备时能提供更多信息)。

阅读(1215) | 评论(0) | 转发(0) |
0

上一篇:shell doc

下一篇:mysql登陆问题

给主人留下些什么吧!~~