Chinaunix首页 | 论坛 | 博客
  • 博客访问: 59395
  • 博文数量: 32
  • 博客积分: 1400
  • 博客等级: 上尉
  • 技术积分: 325
  • 用 户 组: 普通用户
  • 注册时间: 2009-10-28 21:50
文章分类

全部博文(32)

文章存档

2011年(1)

2010年(6)

2009年(25)

我的朋友

分类: LINUX

2009-12-25 19:38:13

  • 本章学习了客户/服务器模型编程的概念和两种连接进程的方法:管道和socket,分别实现了如何使用fdopen来转换fd为流,popen来使进程通过管道连接,实现了如何编写客户端和服务器。
  • 客户/服务器模型是计算机进程之间通信的一种模型,在主机中的进程之间用管道来进行通信,在不同主机中用socket。
  • Unix中,文件描述符数组是每一个进程与其他数据源,如文件,管道,其他进程通信的统一编程接口
  • 在Unix中有4种类型的数据源:磁盘文件,设备,管道,sockets。对于这四种类型都可以使用同一个I/O接口文件描述符fd,而使用fdopen可以将fd转换成FILE *,并分配了缓存空间,这样进程就可以使用标准I/0函数进行数据的传输
    对于磁盘文件和设备,使用open命令连接,用read和write传递连接。
    对于管道,进程用pipe命令进行创建,用fork与子进程共享管道,用read和write传递数据
    对于sockets,用socket、listen和connect连接,用read和write传输
  • FILE *fdopen(int fd, char *mode)
    转换文件描述符接口为FILE *,这样,就可以使用标准I/O,如fwrite等对进程数据进行传输。之后需要用fclose()
  • FILE *popen(char *command, char *mode)
    打开一个指向进程的带缓冲的连接
    与fopen比较,fopen是打开一个指向文件的连接
    popen系统调用即是建立起与另一个进程的连接,对于编写网络服务来说要小心使用,因为它直接传输字符串给shell,这是很危险,在书中P355有说明
  • socket是一个未连接的通信端点,也是一个潜在的文件描述符。客户进程通过把自己的socket和服务器端的socket相连来创建一个通信连接
  • 服务器端的建立:
    1、申请一个socket
    2、绑定地址到socket上,用bind
    3、监听socket上的连接,设置连接数组,用listen
    4、等待\接受呼叫,阻塞进程等待呼叫,用accept
    5、传输数据
    6、关闭连接,close
  • 客户端的建立:
    1、申请一个socket
    2、与服务器连接,connect
    3、传送数据和挂断
  • 本章的系统调用
    1、FILE *fdopen(int fd, char *mode)
    #include
    转换fd为文件流,则可用标准I/O函数进行读写
    需用fclose进行关闭
    2、FILE *popen(char *command,char *type)
    #include
    打开一个指向进程的连接
    要用pclose关闭
    3、int socket(int domain,int type,int protocol)
    #include
    #include
    创建一个通信的端点,即分配一个socket
    4、int bind()
    #include
    #include

    分配地址给socket
    5、int listen()
    #include
    #include

    监听其他socket的连接请求
    6、int accept()
    #include
    #include

    接受其他socket的连接请求
    7、int connect()
    #include
    #include

    连接到socket

    8、int gethostname(char *name,size_t len)
    #include
    获得主机名称
    9、struct hostent *gethostbyname(const char *name)
    #include
    获得主机记录struct hostent

    10、uint16_t htons(uint16_t hostshort)
    #include
    转换主机字节格式为网络字节格式
    struct sockaddr_in 定义在netinet/in.h
    struct sockaddr

  • 两个数据结构
    1、#include
       struct hostent    主机信息记录
    2、#include
       struct sockaddr_in   internet域的socket地址记录
      
  • 几个库函数
    #include
    void bzero(void *s,size_t n)
    将s的前n个字节置0
    void bcopy(const void *src,void *dest,size_t n)
    复制n个字节


阅读(473) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~