这是我的读书笔记,工作完了回家读一点书,只是耐心不行,读不了很多……
第四章 基本TCP套接口编程
TCP服务器端:socket()-->bind()-->listen()-->accept()(waiting)-->read()-->write()...read()(receive EOF)-->colse()
TCP客户端:sockte()-->connect()(3shake hands)-->write()-->read()...close()
#include<sys/socket.h>
scoket() 成功是返回非常小的非负整数,socket descriptor ,short for sockfd。此时制定了协议族和套接口类型,未指定本地和远程协议
conntct() 服务器端口错误马上返回,无响应或路由不可达长时间后返回错误(有重传机制)
int bind(int scoketfd,const struct sockaddr *maaddr,socklen_t addrlen)捆绑ip和端口,在结构sockaddr_in中可以定义ip(sin_ip)和端口(sin_port), ip必须是主机的一个接口,也可以由内核自动分ip(通过设置宏INADDR_ANY),ipv6要定义in6addr_any来初始化为常值。记得用hntol确保网络字节序
listen(int socketfd ,int backlog)作用1转被动2确定最大连接个数,backlog通常设置默认参数,但允许命令行和环境办理更改
int accept(int socketfd ,struct socketaddr *cliaddr ,socket_len *addrlen);返回的是acceptfd,参数2,3返回对方的协议地址
-----------------------------------------------------------------------------
2008-10-28 22:29:54
fork()派生新进程,调用一次返回两次,函数在父进程中返回子进程的进程id,子进程中返回0
fork()应用,
一个进程为自己创建拷贝,一个拷贝处理一个操作时其他拷贝可以做别的--典型的网络服务器例子。
一个进程想执行其他程序,fork生成一个拷贝,用拷贝调用exec来代替自己执行新程序--shell函数
------------------------------------------------------------------------------------
2008-10-29 22:34:20
并发服务器
close(int socketfd)
getsocketname() getpeername()
第五章 TCP客户-服务器程序例子
函数调用流程图
找时间按照代码liux上跑一遍,看看有什么问题,省得眼高手低~
第六章 I/O复用:select 和 poll 函数
I/O复用定义:如果一个或多个I/O条件满足时,我们就被通知到
非阻塞I/O模型;阻塞I/O模型;信号驱动I/O模型
select()poll()是阻塞调用(丢人啊丢人~不是一般的丢人,是非常丢人)
--------------------------------------------------------------------------
2008-10-30 22:34:58
select()函数P143
#include<sys/select.h>
#include<sys/time.h>
int select(int maxfdp1, fd_set *readset, fd_set *writeset, fd_set *exceptset, const struct timeval *timeout);
参数介绍 struct timeval *timeout使用结构timeval来制定秒数和微秒数。此时有三种情况
永远等待,设为null;固定时间等待,在不超过timeval时间内有一个描述字准备好I/O时;轮询:检查描述字后立即返回,定时器结构全为0
使用数据类型fd_set和四个宏来控制描述字
第一个参数maxfdp1:被测试的描述符个数,通常设置为最大描述符加1,因为描述字从0开始,因此描述字0 -- maxfdp1-1均被测试(这就是为什么通常代码中在这里都写的select(fd+1,...)其实意思就是从0扫描到fd)
-----------------------------------------------------------------
2008-11-13 21:38:24
int shutdown(int sockfd,int howto);
shutdown用处,结束通信,和close的区别;
shutdown可以激发TCP四次握手断开连接
------------------------------------------------------------------------------
第八章 UDP编程
服务器端socket()->bind()->recvfrom()<-->sendto()
客户端socet()->sendto()<-->recvfrom()->close()
recvfrom 和 sendto函数
----------------------------------------------------
2008-11-17 23:18:32
第九章 基本名字和地址转换
#include <netdb.h>
struct hostent *gethostbyname(const char *hostname);
如果返回值不为空则返回值则返回hostent结构,其中包括规范名字FQDN,地址类型(IPv4/IPv6),别名和ip地址(指针的指针,用来兼容一个hostname有多个ip)
struct hostent *gethostbyaddr(const char *addr, size_t len , int family)
书上说参数addr不是char *类型,而是一个真正指向还有IPv4或IPv6地址结构in_addr或in6_add的指针,len是此结构的大小
在使用时的一个代码是
unsigned long int addr;
hp = gethostbyaddr ((char *) &addr, sizeof (addr), AF_INET);
int uname(struct utsname *name)返回当前主机名字(正是我明天要用的函数?)
int gethostname(char *name , size_t namelen) 哦,使用这个函数。有例有真相
struct servent *getservbyname(const char *servname,const char *protoname);
struct servent *getservbyport(int port ,const char *protname);
通过这两个函数来查找服务器提供的服务
ps:大概在0度条件下把这一章看完了……真他妈辛苦。趁着脚还热,赶紧进被窝睡觉鸟~
2008-11-17 23:52:18
ps:发现自己其实没看多长时间书,呵呵
---------------------------------------------------------------------------
2008-11-18 22:17:44
第十章 IPv4与IPv6的互操作性
在一段时间内要求兼容IPv4和IPv6,对于嵌入式设备来说是个挑战。看来只能寄希望与服务器的兼容了
IPv4以太网头部包含值0x0800 IPv6头部表示为0x86dd
----------------------------------------------------------
2008-11-19 21:49:34
第十一章 高级名字与地址转换
第十二章 守护进程和inetd超级服务器
讲Unix的一些东西,大体看下就OK了
第十三章 高级I/O函数
第二十一章 带外数据、
带外数据(out-of-band data)也称加速数据(expedited data)
TCP带外数据
采用紧急模式(urgent mode)
send(fd,"a",1,MSG_OOB);
select函数只能收到一个紧急模式发送信息
用处:在不影响正常通讯下条件下的客户-服务器心搏函数
----------------------------------------------------------
2008-11-21 22:44:41
第二十四章 线程
线程和进程比较优点创建快,容易共享信息
多个线程可以共享数据,进程指令,文件,信号,工作目录等,从而注意保护
#include<pthread.h>
int pthread_create(pthread_t *tid,const pthread_attr_t *attr, void *(*func)(void *),void *arg);
创建成功返回0,出错返回非0
一个进程中的每个线程都由一个线程ID(thread ID)标识,其数据类型是pthread_t ,如创建成功则通过tid指针返回
线程属性(attribute),通常设attr为空
创建进程时,让其执行一个函数,线程以调用该函数开始,然后显示终止(调用pthread_exit)或者隐式终止(让该函数返回)
该函数的参数是指针arg,如果需要多个参数,必须打包成一个结构,然后将其地址作为唯一参数传给起始参数。
int pthread_join(pthread_t tid ,void **status); 等待一个线程终止
pthread_t pthread_self(void); 取得自己的线程ID
int pthread_detach(pthread_t tid) 将制定线程变为脱离的 即终止时释放所有资源,不能等待他终止。
线程的安全和容易出现的问题
多个线程对同一变量进行操作的避免:互斥锁。
为防止轮询对CPU的浪费,可以采用条件变量加互斥锁来实现主循环进入睡眠直到有一个线程通知他某事已就绪
第四章 基本TCP套接口编程
TCP服务器端:socket()-->bind()-->listen()-->accept()(waiting)-->read()-->write()...read()(receive EOF)-->colse()
TCP客户端:sockte()-->connect()(3shake hands)-->write()-->read()...close()
#include<sys/socket.h>
scoket() 成功是返回非常小的非负整数,socket descriptor ,short for sockfd。此时制定了协议族和套接口类型,未指定本地和远程协议
conntct() 服务器端口错误马上返回,无响应或路由不可达长时间后返回错误(有重传机制)
int bind(int scoketfd,const struct sockaddr *maaddr,socklen_t addrlen)捆绑ip和端口,在结构sockaddr_in中可以定义ip(sin_ip)和端口(sin_port), ip必须是主机的一个接口,也可以由内核自动分ip(通过设置宏INADDR_ANY),ipv6要定义in6addr_any来初始化为常值。记得用hntol确保网络字节序
listen(int socketfd ,int backlog)作用1转被动2确定最大连接个数,backlog通常设置默认参数,但允许命令行和环境办理更改
int accept(int socketfd ,struct socketaddr *cliaddr ,socket_len *addrlen);返回的是acceptfd,参数2,3返回对方的协议地址
-----------------------------------------------------------------------------
2008-10-28 22:29:54
fork()派生新进程,调用一次返回两次,函数在父进程中返回子进程的进程id,子进程中返回0
fork()应用,
一个进程为自己创建拷贝,一个拷贝处理一个操作时其他拷贝可以做别的--典型的网络服务器例子。
一个进程想执行其他程序,fork生成一个拷贝,用拷贝调用exec来代替自己执行新程序--shell函数
------------------------------------------------------------------------------------
2008-10-29 22:34:20
并发服务器
close(int socketfd)
getsocketname() getpeername()
第五章 TCP客户-服务器程序例子
函数调用流程图
找时间按照代码liux上跑一遍,看看有什么问题,省得眼高手低~
第六章 I/O复用:select 和 poll 函数
I/O复用定义:如果一个或多个I/O条件满足时,我们就被通知到
非阻塞I/O模型;阻塞I/O模型;信号驱动I/O模型
select()poll()是阻塞调用(丢人啊丢人~不是一般的丢人,是非常丢人)
--------------------------------------------------------------------------
2008-10-30 22:34:58
select()函数P143
#include<sys/select.h>
#include<sys/time.h>
int select(int maxfdp1, fd_set *readset, fd_set *writeset, fd_set *exceptset, const struct timeval *timeout);
参数介绍 struct timeval *timeout使用结构timeval来制定秒数和微秒数。此时有三种情况
永远等待,设为null;固定时间等待,在不超过timeval时间内有一个描述字准备好I/O时;轮询:检查描述字后立即返回,定时器结构全为0
使用数据类型fd_set和四个宏来控制描述字
第一个参数maxfdp1:被测试的描述符个数,通常设置为最大描述符加1,因为描述字从0开始,因此描述字0 -- maxfdp1-1均被测试(这就是为什么通常代码中在这里都写的select(fd+1,...)其实意思就是从0扫描到fd)
-----------------------------------------------------------------
2008-11-13 21:38:24
int shutdown(int sockfd,int howto);
shutdown用处,结束通信,和close的区别;
shutdown可以激发TCP四次握手断开连接
------------------------------------------------------------------------------
第八章 UDP编程
服务器端socket()->bind()->recvfrom()<-->sendto()
客户端socet()->sendto()<-->recvfrom()->close()
recvfrom 和 sendto函数
----------------------------------------------------
2008-11-17 23:18:32
第九章 基本名字和地址转换
#include <netdb.h>
struct hostent *gethostbyname(const char *hostname);
如果返回值不为空则返回值则返回hostent结构,其中包括规范名字FQDN,地址类型(IPv4/IPv6),别名和ip地址(指针的指针,用来兼容一个hostname有多个ip)
struct hostent *gethostbyaddr(const char *addr, size_t len , int family)
书上说参数addr不是char *类型,而是一个真正指向还有IPv4或IPv6地址结构in_addr或in6_add的指针,len是此结构的大小
在使用时的一个代码是
unsigned long int addr;
hp = gethostbyaddr ((char *) &addr, sizeof (addr), AF_INET);
int uname(struct utsname *name)返回当前主机名字(正是我明天要用的函数?)
int gethostname(char *name , size_t namelen) 哦,使用这个函数。有例有真相
struct servent *getservbyname(const char *servname,const char *protoname);
struct servent *getservbyport(int port ,const char *protname);
通过这两个函数来查找服务器提供的服务
ps:大概在0度条件下把这一章看完了……真他妈辛苦。趁着脚还热,赶紧进被窝睡觉鸟~
2008-11-17 23:52:18
ps:发现自己其实没看多长时间书,呵呵
---------------------------------------------------------------------------
2008-11-18 22:17:44
第十章 IPv4与IPv6的互操作性
在一段时间内要求兼容IPv4和IPv6,对于嵌入式设备来说是个挑战。看来只能寄希望与服务器的兼容了
IPv4以太网头部包含值0x0800 IPv6头部表示为0x86dd
----------------------------------------------------------
2008-11-19 21:49:34
第十一章 高级名字与地址转换
第十二章 守护进程和inetd超级服务器
讲Unix的一些东西,大体看下就OK了
第十三章 高级I/O函数
第二十一章 带外数据、
带外数据(out-of-band data)也称加速数据(expedited data)
TCP带外数据
采用紧急模式(urgent mode)
send(fd,"a",1,MSG_OOB);
select函数只能收到一个紧急模式发送信息
用处:在不影响正常通讯下条件下的客户-服务器心搏函数
----------------------------------------------------------
2008-11-21 22:44:41
第二十四章 线程
线程和进程比较优点创建快,容易共享信息
多个线程可以共享数据,进程指令,文件,信号,工作目录等,从而注意保护
#include<pthread.h>
int pthread_create(pthread_t *tid,const pthread_attr_t *attr, void *(*func)(void *),void *arg);
创建成功返回0,出错返回非0
一个进程中的每个线程都由一个线程ID(thread ID)标识,其数据类型是pthread_t ,如创建成功则通过tid指针返回
线程属性(attribute),通常设attr为空
创建进程时,让其执行一个函数,线程以调用该函数开始,然后显示终止(调用pthread_exit)或者隐式终止(让该函数返回)
该函数的参数是指针arg,如果需要多个参数,必须打包成一个结构,然后将其地址作为唯一参数传给起始参数。
int pthread_join(pthread_t tid ,void **status); 等待一个线程终止
pthread_t pthread_self(void); 取得自己的线程ID
int pthread_detach(pthread_t tid) 将制定线程变为脱离的 即终止时释放所有资源,不能等待他终止。
线程的安全和容易出现的问题
多个线程对同一变量进行操作的避免:互斥锁。
为防止轮询对CPU的浪费,可以采用条件变量加互斥锁来实现主循环进入睡眠直到有一个线程通知他某事已就绪