1、端口:IANA(Internet Assigned Numbers Authority)维护着一个端口号分配状况的清单。

  • 众所周知的端口(0-1023):由IANA分配和控制,可能的话,相同的端口号尽可能分配给TCP,UDP和STCP的同一给定服务
  • 已登记的端口(1024-49151):这些端口不受IANA控制,
  • 动态、私用的端口(49152-65535):临时端口。

2、套接字:一个套接字对是一个定义该连接的两个端点的四元组。{本地IP,本地TCP端口号,外地IP,外地TCP端口号}

套接字对唯一标识一个网络上的每个TCP连接。

3、套接字地址结构

大多数套接字函数需要一个指定套接字地址结构的指针作为参数,每个协议族都定义了自己的套接字结构。套接字地址结构仅在给定主机上使用,虽然结构中的某些字段用在不同主机之间的通信,但是结构本身并不在主机之间传递。

  • sockaddr_in
    • IPv4地址和TCP或者UDP端口号在套接字地址结构中以网络字节序存储。
    • sin_falily:可以是无符号整数类型,在支持长度字段的实现中,通常是8位无符号整数,不支持长度字段中是16位无符号整数
    • sin_addr:in_addr_t必须至少是32位的无符号整数类型
    • sin_port:in_port_t必须至少是16位的无符号整数类型
    • 长度是16
  • sockaddr_in6:长度是28
  • sockaddr_storage相比于sockaddr优势:
    • 足够大,能够容纳系统支持的任何套接字结构
    • 如果系统支持的任何套接字地址结构有对齐的需要,那么sockaddr_storage能够满足最苛刻的对齐要求

4、值-结果参数

  • 从进程到内核传递套接字地址结构:bind,connect,sendto
  • 从内核到进程传递套接字地址结构:accept,recvfrom,getsockname,getpeername
  • 值:告诉内核该结构的大小,内核在写结构的时候,不至于越界。
  • 结果:告诉进程内核在该结构中实际存储了多少信息。(如果套接字地址结构是固定长度的,那么从内核返回的值总是那个固定长度,如IPv4的sockaddr_in长度是16,IPv6的sockaddr_in6长度是28;对于可变长度的套接字地址结构,返回值可能小于结构的最大长度)

5、字节函数

  • 字节序
    • 小端字节序:高序字节存储在高地址,低序字节存储在低地址。
    • 大端字节序:高序字节存储在低地址,低序字节存储在高地址
  • 主机字节序:某个给定系统所用的字节序。
  • 网络字节序:网络协议必须指定的一个网络字节序,网络协议使用大端字节序。

主机字节序和网络字节序之间的转换函数:

#include <netinet/in.h>
//主机-->网络字节序
uint16_t htons(uint16_t host16bitvalue);
uint32_t htons(uint32_t host32bitvalue);
//网络字节序-->主机
uint16_t ntohs(uint16_t net16bitvalue);
uint32_t ntohs(uint32_t net32bitvalue);
其中h代表host,n代表network,s代表short,l代表long

字节操纵函数:

/*第一组:起源于4.2BSD,几乎所有现今支持套接字函数的系统仍然提供*/
#include <strings.h>
void bzero(void *dest,size_t nbytes);
void bcopy(const void *src,void *dest,size_t nbytes);
int bcmp(const void *ptr1,const void *ptr2,size_t nbytes);

/***********************************************************************
 *  第二组:起源于ANSI C,支持ANSI C函数库的所有系统都提供
 **********************************************************************/
#include <string.h>
void* memset(void *dest,int c,size_t len);
void* memcpy(void *dest,const void *src,size_t nbytes);
int memcmp(const void *ptr1,const void *ptr2,size_t nbytes);

地址转换函数:

#include <arpa/inet.h>
//第一组
/*
    strptr:指向c字符串,是一个点分十进制的地址
    addrptr/inaddr:网络字节序二进制值
    inet_addr函数:如今已废弃,新代码应该使用inet_aton(该函数出错时,
                       返回INADDR_NONE,32位均为1,因此255.255.255.255
                     不能由该函数处理)
    inet_ntoa函数:参数传入的是结构而不是结构的指针;

*/
int inet_aton(const char *strptr, struct in_addr *addrptr);
int_addr_t inet_addr(const char *strptr);
char* inet_ntoa(struct in_addr inaddr);

//第二组
int inet_pton(int family,const char *strptr,void *addrptr);//成功返回1,字符串无效返回0,出错-1
const char* inet_ntop(int family,const void *addrptr,char *strptr,size_t len);

<网络编程>套接字介绍的更多相关文章

  1. UNIX网络编程——套接字选项(SOL_SOCKET级别)

    #include <sys/socket.h> int setsockopt( int socket, int level, int option_name,const void *opt ...

  2. UNIX网络编程——套接字选项(心跳检测、绑定地址复用)

    /* 设置套接字选项周期性消息检测连通性 心跳包. 心博.主要用于长连接. * 参数:套接字, 1或0开启, 首次间隔时间, 两次间隔时间, 断开次数 */ void setKeepAlive( in ...

  3. 网络编程 套接字socket TCP UDP

    网络编程与套接字 网络编程 网络编程是什么: ​ 网络通常指的是计算机中的互联网,是由多台计算机通过网线或其他媒介相互链接组成的 ​ 编写基于网络的应用程序的过程序称之为网络编程. 网络编程最主要的工 ...

  4. Java网络编程--套接字Socket

    一.套接字Socket IP地址标志Internet上的计算机,端口号标志正在计算机上运行的进程(程序). 端口号被规定为一个16位的0--65535之间的整数,其中,0--1023被预先定义的服务通 ...

  5. UNIX网络编程——套接字选项

    http://www.educity.cn/linux/1241288.html 有时候我们需要控制套接字的行为(如修改缓冲区的大小),这个时候我们就要学习套接字选项. int getsockopt( ...

  6. UNIX网络编程——套接字选项(SO_REUSEADDR)

    1.一般来说,一个端口释放后会等待两分钟之后才能再被使用,SO_REUSEADDR是让端口释放后立即就可以被再次使用. SO_REUSEADDR用于对TCP套接字处于TIME_WAIT状态下的sock ...

  7. UNIX网络编程——套接字选项(SO_RCVBUF和SO_SNDBUF)

    有时候我们需要控制套接字的行为(如修改缓冲区的大小),这个时候我们就要学习套接字选项. int getsockopt(int sockfd,int level,int optname,void *op ...

  8. UNIX网络编程——套接字选项(setsockopt)

    setsockopt的一些用法: close socket(一般不会立即关闭而经历TIME_WAIT的过程)后想继续重用该socket: BOOL bReuseaddr=TRUE; setsockop ...

  9. 【python】网络编程-套接字常用函数

随机推荐

  1. elementUI vue table status的状态列颜色变化和操作列状态显示(停用, 启用)

    <div id="app" style="display: none"> ... <el-table-column prop="st ...

  2. CSS之IE浏览器的hasLayout,IE低版本的bug根源

    什么是hasLayout? hasLayout是IE特有的一个属性.很多的ie下的css bug都与其息息相关.在ie中,一个元素要么自己对自身的内容进行计算大小和组织,要么依赖于父元素来计算尺寸和组 ...

  3. 小tips:JS操作数组的slice()与splice()方法

    slice(start, end) slice()方法返回从参数指定位置开始到当前数组末尾的所有项.如果有两个参数,该方法返回起始和结束位置之间的项,但不包括结束位置的项. var colors = ...

  4. BZOJ2199: [Usaco2011 Jan]奶牛议会(2-SAT)

    Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 559  Solved: 360[Submit][Status][Discuss] Descriptio ...

  5. react 会员登录

    会员登录在我们的好多项目中都有用到,比如在后台管理系统,它的第一步就需要你进行登录,还有在我们常见的京东.淘宝.网易云音乐等一系列的软件上面都需要进行登录. 下面我们直接上代码 fetch(url,{ ...

  6. Pycharm基本设置和插件安装

    Pycharm调节主题和字体 调节主题:File - Setting - Editor - Color Scheme - 选择个人喜欢的风格 调节字体大小,感觉默认字体有点小,对我这样的老人家,至少要 ...

  7. (其他)window10上好用的软件

    1.everything:比我用电脑搜索快一些,(常用的搜索其实熟悉电脑的都会,不过想快一点) 如果你曾对效率工具有过研究,想必对 Everything 的名字不会陌生.这款仅有 1.3 MB 的小软 ...

  8. matlab练习程序(点集配准的SVD法)

    上一篇博客中我们使用了四元数法计算ICP. 本篇我们使用SVD计算ICP. 下面是<视觉slam十四讲>中的计算方法: 计算步骤如下: 我们看到,只要求出了两组点之间的旋转,平移是非常容易 ...

  9. Docker的安装与使用介绍

    docker是什么? Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源. Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后 ...

  10. React router动态加载组件-适配器模式的应用

    前言 本文讲述怎么实现动态加载组件,并借此阐述适配器模式. 一.普通路由例子 import Center from 'page/center'; import Data from 'page/data ...