码迷,mamicode.com
首页 > 系统相关 > 详细

linux进程间的网络通信

时间:2015-12-08 01:56:35      阅读:195      评论:0      收藏:0      [点我收藏+]

标签:

一、进程是如何进行网络通信的?socket通信的过程?

  同一机器上的不同进程之间的通信方式有很多种,主要使用消息传递或共享内存。而跨网络的进程是几乎都是使用socket通信,例如web服务器,QQ。

    socket即是一种特殊的文件,操作系统提供了一些socket函数就是对其进行的操作(读/写IO、打开、关闭),进程间的通信就是靠读写各自的socket完成的。

    通信的过程

    server:

  1. 使用socket()系统调用创建一个指定类型和协议套接字
  2. 使用bind()系统调用给创建的socket命名,这个名字就是通常所说的服务器地址(ip地址+端口号),例如服务器的80端口
  3. 使用listen()系统调用,监听来自客户端的连接。
  4. 使用accept()系统调用,接受来自客户端的连接,这个调用一直处于阻塞状态,直到有客户端的连接。
  5. 向连接建立的socket里面读写数据(通信)

  注意:server最初会创建一个socktet,收到连接请求后(accept())之后会创建一个与原有的命名套接字不同的套接字。这个新的套接字只与这个特定的client通信,而命名套接字会保留下来继续处理来自client的连接。

    client:

  1. 使用socket()系统调用创建一个指定类型和协议的套接字。
  2. 使用connect()将1中创建的socket连接到服务器的地址。
  3. 使用系统调用发送和接受数据,最简单的是read( )和write()函数。

二、主要知识点和系统调用介绍

  1. int socket(int domain, int type, int protocol); 创建指定类型的socket,两个进程能够通信,必须使用相同域和类型的套接字

  •  domain:主要有AF_INET,AF_INIT6,分别表示IPv4、IPv6域
  •  type:SOCK_STREAM 表示有序、可靠、双向的面向连接的字节流 ;SOCK_DGRAM 表示长度固定的、无连接的不可靠的报文传递。
  • protocol:一般是0,系统会根据前面的域名和类型,选择合适的协议如TCP、UDP协议等。

    2.  int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

  • sockfd:创建scoket时返回的socket描述符。类似于文件描述符号。
  • addr:socket绑定的地址
  • addrlen:第二个参数是指针,第三个参数是长度

       地址格式:

     struct sockaddr_in {

    sa_family_t    sin_family; /* address family: AF_INET */
    in_port_t      sin_port;   /* port in network byte order */
    struct in_addr sin_addr;   /* internet address */
 };

        注意:通常服务器在启动的时候都会绑定一个众所周知的地址(如ip地址+端口号),用于提供服务,客户就可以通过它来接连服务器;而客户端就不用指定,有系统自动分配一个端口号和自身的ip地址组合。

                  这就是为什么通常服务器端在listen之前会调用bind(),而客户端就不会调用,而是在connect()时由系统随机生成一个。

   3.其它

  •   int listen(int sockfd, int backlog); //监听socket的描述符,backlog表示最到连接数
  •   int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen); //客户端连接服务器的地址
  •   int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen); //服务器接受连接
  •   read()/write()
  •   recv()/send()
  •   readv()/writev()
  •   recvmsg()/sendmsg()
  •   recvfrom()/sendto()

 

 

  

4.注意事项

3.socktet通信示例

参考:

linux进程间的网络通信

标签:

原文地址:http://www.cnblogs.com/wxquare/p/5027948.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!