一、基础知识。

1:套接字基础。

  1,是通信端点的抽象。

  2,在UNIX类系统中被当作是一种文件描述符。

  3,套接字通信域。

描述
AF_INET IPV4因特网域
AF_INET6 IPV6因特网域
AF_UNIX UNIX域
AF_UPSPEC 未指定

  4,套接字类型。

类型 描述
SOCK_DGRAM 固定长度的,无链接的,不可考的报文传递
SOCK_RAW IP协议的数据报接口
SOCK_SEQPACKET 固定长度的,有序的,可靠的,面向连接的报文传递。
SOCK_STREAM 有序的,可靠的,双向的,面向连接的字节流。

  5,协议。

协议 描述
IPPROTO_IP IPv4网际协议
IPPROTO_IPV6 IPv6网际协议
IPPROTO_ICMP 因特网控制报文协议(internet control message protocol)
IPPROTO_RAW 原始IP数据包协议
IPPROTO_TCP 传输控制协议
IPPROTO_UDP 用户数据报协议(user datagram protocol)

  6,创建一个原始套接字需要root权限。

2:套接字寻址和传输。

  1,在网络中,进程标识由:计算机网络地址(找到计算机) + 计算机的端口号(找到特定进程) 组成。

  2,大端和小端。

    1)大端字节序:最大字节地址上 保存 最低有效字节。

    2)小端字节序:最大字节地址上 保存 最高有效字节。

    3)大部分系统使用小端字节序。但TCP/IP使用大端字节序。

  3,域名系统( Domain name system,DNS)

  4,网络信息服务( Network information service, NIS )

  5,服务是由地址的端口号部分标示。每个服务由一个唯一的端口号支持。

  6,章16的代码在阅读结束后,进行尝试性理解和自编写。

  7,当异步IO中因为某种原因导致读/写阻塞,在阻塞条件不存在后,可以发送SIGIO信号来重新启用IO。步骤为:

    1)建立套接字所有权。这样信号可以被传递到对应的进程。

    2)通知套接字当IO操作不会阻塞时发送信号。

  8,带外数据

    1)含义:紧急数据。它有相对普通数据更高的优先级。

    2)部分通信协议支持此功能。(可选功能)

    3)当有新的紧急数据到来,旧有数据会被覆盖。

3:套接字选项。

  1,套接字机制提供了 两个套接字选项接口:设置选项接口,查询选项接口。

4:UNIX域套接字。

  1,IPC的一种:可以在同一计算机系统上运行的两个进程之间传递打开文件描述符。

    1)用于同一台计算机的进程通信。

    2)效率比因特网套接字高。因为它仅复制数据,无协议,无校验等复杂操作。

  2,一些实例(未阅读)。

    1)P508,借助UNIX域套接字轮询XSI消息队列。

    2)P512,将地址绑定到UNIX域套接字。

    3)P518,传送文件描述符:在两个进程之间传送打开文件描述符的技术非常有用。

  3,sockaddr_un结构体。

    1)可以将一个地址绑定到UNIX域套接字上。系统会使用该路径创建一个S_IFSOCK类型的文件。此文件无法打开。当关闭套接字时,必须显式的删除文件。

二、相关函数。

1:套接字。

 创建一个套接字
  int socket( int domain, int type, int protocol );
  // 1 参数protocol:通常为0。表示使用默认协议。
禁止一个套接字IO
  int shutdown( int sockfd, int how );
  // 1 参数how:SHUT_RD,SHUT_WR,SHUT_RDWR

2:寻址。

 处理器字节序 和 网络字节序 的转换。
  uint32_t htonl( uint32_t hostint32 );
  uint16_t htons( uint16_t hostint16 );
  uint32_t ntohl( uint32_t netint32 );
  uint16_t ntohl( uint16_t netint16 );
  // 1 h 主机,n 网络,l 长整数,s 短整数。
地址通用结构体。
  struct socketaddr
  {
    sa_family_t sa_family; // address family
    char sa_data[]; // variable-length address
    ...
  }
网络地址的 二进制地址 和 文本字符串 相互转换
  const char *inet_ntop( int domain, const void *restrict addr, char *restrict str, socklen_t size ); // 二进制地址 转换成 文本字符串
  int inet_pton( int domain, const char *restrict str, void *restrict addr ); // 文本字符串 转换成 二进制地址。
查询主机信息。
  struct hostent* gethostent( void );
  void sethostent( int stayopen );
  void endhostent( void );
  struct hostent
  {
    char *h_name; // name of host
    char **h_aliases; // pointer to alternate host name array
    int h_addrtype; // address type
    int h_length; // length in bytes of address
    char **h_addr_list; // pointer to array of network address
    ...
  }
获取网络名字 和 网络编号。
  struct netent* getnetbyaddr( uint32_t net, int type );
  struct netent* getnetbyname( const char *name );
  struct netent* getnetent( void );
  void setnetent( int stayopen );
  void endnetent( void );
  struct netent{
    char *n_name; // network
    char   **n_aliases; // alternate network name array pointer
    int n_addrtype; // address type
    uint32_t n_net // network number
    ...
  }
协议名字和协议编号之间进行映射。
  struct protoent* getprotobyname( const char *name );
  struct protoent* getprotobynumber( int proto );
  struct protoent* getprotoent( void );
  void setprotoent( int stayopen );
  void endprotoent( void );
  struct protoent{
    char *p_name; // protocol name
    char **p_aliases; // pointer to altername protocol name array
    int p_proto; // protocol number
    ...
  }
函数getservent顺序扫描服务数据库。
  struct servent* getservbyname( const char *name, const char *proto );
  struct servent* getservbyport( int port, const char *proto );
  struct servent* getservent( void );
  void setservent( int stayopen );
  void endservent( void )
  struct servent{
    char s_name; // service name
    char **s_aliases; // pointer to alternate service name array
    int s_port; // port name
    char *s_proto; // name of protocol
    ...
  }
将主机名和服务名映射到一个地址。
  int getaddrinfo( const char *restrict host, const char *restrict service, const struct addrinfo *restrict hint, struct addrinfo **restrict res );
  void freeaddrinfo( struct addrinfo *ai );
  struct addrinfo{
    int ai_flags; // custemize behavior
    int ai_family; // address family
    int ai_socktype; // socket type
    int ai_protocol; // protocol
    socklen_t ai_addrlen; // length in bytes of address
    struct sockaddr *ai_addr; // address
    char *ai_canonname; // canonical name of host
    struct addrinfo *ai_next; // next in list
    ...
  }
将返回的错误码转换成错误信息
  consr char *gai_strerror( int error );
将地址转换成 主机名 和 服务名
  int getnameinfo( const struct sockaddr *restrict addr, socklen_t alen, char *restrict host, socklen_t hostlen, char *restrict service, socklen_t servlen, int flags );

3:套接字 和 地址关联。

 绑定 关联地址 和 套接字。
  int bind( int sockfd, const struct sockaddr *addr, socklen_t len len );
  // 1 地址必须有效,且格式匹配。
  // 2 端口一般不小于1024.root权限用户除外。
  // 3 一般不允许多重绑定。
查找 套接字对应的地址。
  int getsockname( int sockfd, struct sockaddr *restrict addr, socklen_t *restrict alenp );
找到和套接字连接的对等方地址。
  int getpeername( int sockfd, struct sockaddr *restrict addr, socklen_t *restrict alenp );
(请求服务端)建立连接。
  int connect( int sockfd, const struct sockaddr *addr, socklen_t len );
  // 1 参数addr:期望通信的服务器地址。
  // 2 应用程序必须能够处理connect函数返回的错误。
(接收信息端)接收连接请求。
  int listen( int sockfd, int backlog );
获得连接请求,并建立连接。
  int accept( int sockfd, struct sockaddr *restrict addr, socklen_t *restrict len );
  // 1 返回值:套接字描述符。

4:数据传输。

 发送数据。
  ssize_t send( int sockfd, const void *buf, size_t nbytes, int flags ); // 套接字必须已经连接。
  // 1 返回成功,仅代表发送成功。接收错误不反馈。
  ssize_t sendto( int sockfd, const void *buf, size_t nbytes, int flags, const struct sockaddr *destaddr, socklen_t destlen ); // 可以在无连接套接字上发送信息。
  ssize_t sendmsg( int sockfd, const struct msghdr *msg, int flags, ); // 可以指定多重缓冲区传输数据。
接收数据。
  ssize_t recv( int sockfd, void *buf, size_t nbytes, int flags ); //
  ssize_t recvfrom( int sockfd, void *restrict buf, size_t len, int flags, struct sockaddr *restrict addr, socklen *restrict addrlen ); // 得到数据发送者的原地址
  ssize_t recvmsg( int sockfd, struct msghdr *msg, int flags ); // 将接收数据送入多个缓冲区

5:套接字选项。

 设置套接字选项。
  int setsockopt( int sockfd, int level, int option, const void *val, socklen_t len );
  // 1 参数level:标识选项应用协议。
查看当前选项。
  int getsockopt( int sockfd, int level, int option, void *restrict val, socklen_t *restrict lenp );
  // 1 参数level:标识选项应用协议。

6:带外数据。

 TCP中,判断是否已经到达紧急数据标记位置。
  int sockarmark( int sockfd );
  // 1 返回值:1 在标记处,0 不在标记处,-1 出错

7:  UNIX域套接字。

 创建一对无命名的,相互连接的UNIX域套接字。(一般只用于UNIX域。)
  int socketpair( int domain, int type, int protocol, int sockfd[] ); // 打开的为全双工管道。
  // 1 返回值:0 成功,-1 出错。
sockaddr_un 结构体。
  struct sockaddr_un
  {
    sa_family_t sun_family; // AF_UNIX
    char sun_path[]; // pathname
  } // OS:linux and solaris。 Head file name is "sys/un.h";

linux学习笔记之套接字的更多相关文章

  1. Linux学习笔记30——套接字

    一 什么是套接字 套接字是一种通信机制,凭借这种机制,客户/服务器系统的开发既可以在本地单机上进行,也可以跨网络进行. 二 套接字属性 套接字的特性由3个属性确定,它们是:域,类型和协议   1 套接 ...

  2. 网络协议学习笔记(五)套接字Socket

    概述 前面学习网络知识的时候写过一篇关于套接字的随笔见<JAVA SOCKET 详解>,现在本人正在系统的学习网络知识,现在除了温故知新之外,在详细的学习记录一下套接字的知识. Socke ...

  3. deepin linux学习笔记

    目录 deepin linux学习笔记 前言 linux常用命令 ls 显示文件夹内容 cd 切换当前目录 pwd 查看当前工作目录 mkdir 新建文件夹 rm 删除文件或文件夹 mv 移动文件 c ...

  4. Linux 学习笔记

    Linux学习笔记 请切换web视图查看,表格比较大,方法:视图>>web板式视图 博客园不能粘贴图片吗 http://wenku.baidu.com/view/bda1c3067fd53 ...

  5. linux学习笔记2-linux的常用命令

    第一篇博客:linux学习笔记1-ubuntu的安装与基本设置 之中,已经介绍了如何安装linux操作系统,以及一些基本的设置修改. 本篇博客主要介绍linux中的一些常用的终端命令 ======== ...

  6. linux学习笔记2 - linux常用命令

    转载请标注原链接:http://www.cnblogs.com/xczyd/p/5543731.html 第一篇博客:linux学习笔记1-ubuntu的安装与基本设置 之中,已经介绍了如何安装lin ...

  7. 20155303狄惟佳预备作业三Linux学习笔记

    20155303狄惟佳预备作业三Linux学习笔记 初次接触Ubuntu系统以及Linux内核,了解了其产生的历史,从感性来讲,深深吸引我的是其中蕴含的珍贵的开源精神,以及Stallman等人对&qu ...

  8. (转)Linux最常用指令及快捷键 Linux学习笔记

    Linux最常用指令及快捷键 Linux学习笔记 原文:http://blog.csdn.net/yanghongche/article/details/50827478 [摘自 鸟叔的私房菜]--转 ...

  9. Linux学习笔记(四) vi编辑器

    一.vi 编辑器 vi 编辑器 (Visual Interface) 是所有 Unix 及 Linux 系统下标准的编辑器,相当于 Windows 系统中的记事本 它有三种模式,分别是: Comman ...

随机推荐

  1. LinearLayout的一些注意事项

    1.orientation的默认值为horizontal,即从左向右排列.由于一般从上向下排列,所以必须指定orientation属性. 2.layout_gravity与gravity的区别: (1 ...

  2. css3的滤镜模糊的效果

    最近在做一个css3的滤镜模糊的效果,但是我发现,有些浏览器一点效果都没有,这是浏览器兼容性导致的,怕今后会忘记所以就先写下来,也希望可以帮到需要的小伙伴. 代码如下: div{//设置半透明滤镜效果 ...

  3. IE6 双倍距BUG

    IE6双倍距BUG的形成: 1.快元素 2.元素浮动 3.margin左右 解决方案:_display:inline;

  4. [原]用C#模拟实现扑克牌发牌、排序程序…

    (1)52张扑克牌,四种花色(红桃.黑桃.方块和梅花),随机发牌给四个人. (2)最后将四个人的扑克牌包括花色打印在控制台上. 其中:     花色和点数用枚举类型实现     每张扑克牌用结构实 ...

  5. HDU 题目分类收集

    并查集题型简单并查集1213 How Many Tables 1232 畅通工程 (杭电简单的并查集不是很多) 简单最小生成树1233 还是畅通工程 1863 畅通工程 1874 畅通工程再续 187 ...

  6. Hibernate配置属性

    Hibernate配置属性 属性名 用途 hibernate.dialect 一个Hibernate Dialect类名允许Hibernate针对特定的关系数据库生成优化的SQL. 取值 full.c ...

  7. (转)使用scp命令在linux操作系统之间传递文件

    一.关于scp scp是英文secure copy (remote file copy program)的简称,主要用于在两台主机之间通过网络拷贝文件.scp使用ssh协议进行数据传递,其认证方式和安 ...

  8. KeyTool

    http://ln-ydc.iteye.com/blog/1335213 http://lukejin.iteye.com/blog/605634

  9. SQL Server 2008空间数据应用系列三:SQL Server 2008空间数据类型

    原文:SQL Server 2008空间数据应用系列三:SQL Server 2008空间数据类型 友情提示,您阅读本篇博文的先决条件如下: 1.本文示例基于Microsoft SQL Server ...

  10. MIT-scheme安装

    下载地址: http://www.gnu.org/software/mit-scheme/ 下载windows版本,安装. The MIT-Scheme can be installed by jus ...