<网络编程>套接字介绍
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);
<网络编程>套接字介绍的更多相关文章
- UNIX网络编程——套接字选项(SOL_SOCKET级别)
#include <sys/socket.h> int setsockopt( int socket, int level, int option_name,const void *opt ...
- UNIX网络编程——套接字选项(心跳检测、绑定地址复用)
/* 设置套接字选项周期性消息检测连通性 心跳包. 心博.主要用于长连接. * 参数:套接字, 1或0开启, 首次间隔时间, 两次间隔时间, 断开次数 */ void setKeepAlive( in ...
- 网络编程 套接字socket TCP UDP
网络编程与套接字 网络编程 网络编程是什么: 网络通常指的是计算机中的互联网,是由多台计算机通过网线或其他媒介相互链接组成的 编写基于网络的应用程序的过程序称之为网络编程. 网络编程最主要的工 ...
- Java网络编程--套接字Socket
一.套接字Socket IP地址标志Internet上的计算机,端口号标志正在计算机上运行的进程(程序). 端口号被规定为一个16位的0--65535之间的整数,其中,0--1023被预先定义的服务通 ...
- UNIX网络编程——套接字选项
http://www.educity.cn/linux/1241288.html 有时候我们需要控制套接字的行为(如修改缓冲区的大小),这个时候我们就要学习套接字选项. int getsockopt( ...
- UNIX网络编程——套接字选项(SO_REUSEADDR)
1.一般来说,一个端口释放后会等待两分钟之后才能再被使用,SO_REUSEADDR是让端口释放后立即就可以被再次使用. SO_REUSEADDR用于对TCP套接字处于TIME_WAIT状态下的sock ...
- UNIX网络编程——套接字选项(SO_RCVBUF和SO_SNDBUF)
有时候我们需要控制套接字的行为(如修改缓冲区的大小),这个时候我们就要学习套接字选项. int getsockopt(int sockfd,int level,int optname,void *op ...
- UNIX网络编程——套接字选项(setsockopt)
setsockopt的一些用法: close socket(一般不会立即关闭而经历TIME_WAIT的过程)后想继续重用该socket: BOOL bReuseaddr=TRUE; setsockop ...
- 【python】网络编程-套接字常用函数
随机推荐
- 从项目需求角度,使用纯CSS方案解决垂直居中
CSS是HTML元素的剪刀手,它极度的丰富了web页面的修饰.在众多CSS常见的样式需求中,有一奇葩式的存在[垂直居中],因为不管是从逻辑实现方面还是从正常需求量来讲,这都没理由让这个需求在实践过程中 ...
- Spring学习之旅(二)极速创建Spring框架java Web工程项目
编译工具:eclipse 1)创建Web工程:spring_web_helloworld 2)导入所需jar包: 3)创建实体类:同上篇博文 4)创建配置文件hellobean.xml.同上篇博文 不 ...
- eNSP 常用操作
1.eNSP关闭保存文件的提示信息 总是提示如下信息: Oct 12 2017 23:49:24-08:00 Huawei DS/4/DATASYNC_CFGCHANGE:OID 1.3.6.1.4. ...
- 四. Redis事务处理
Redis目前对事务的支持还是比较简单,Redis能保证一个Client发起的事务中的命令可以连续执行,而中间不会插入其他Client的命令:当一个Client在连接中发起一个multi命令的时候,这 ...
- Windows系统java下载与安装
Windows系统java下载与安装 一.前言 作者:深圳-风尘 联系方式:QQ群[585499566] 博客:https://www.cnblogs.com/1fengchen1/ 能读懂本文档人: ...
- 2017.9.16~17,热烈庆祝共创力罗老师《敏捷MINI体验式实战培训》在某大型企业成功举办!
2017.9.16~17日,深圳市共创力企业管理咨询有限公司为某上市企业提供了为期两天的内训服务.该次内训的主题为<敏捷MINI体验式实践培训>,为期两天.此次培训由共创力资深讲师Geor ...
- CSS之精灵图(雪碧图)与字体图标
本文内容: 精灵图 字体图标 首发日期:2018-05-01 精灵图: 在以前,每个图片资源都是独立的一张张图片,浏览器访问网站中的不同网页时是重复获取这一张张图片的,这代表需要访问很多次资源. 为了 ...
- 智能POS打印配置&常见问题FAQ 12-14 后期持续更新
1.安卓一体机会员注销钱会不会退回到支付宝 智能pos会员注销钱目前只能现金退还. 2.支付异常订单悬浮球在哪关闭 设置-->功能设置-->系统设置-->开启支付异常订单悬浮球 3. ...
- CSS杂谈(1)图
- java----JSTL学习笔记(转)
Java容器类包含List.ArrayList.Vector及map.HashTable.HashMap.Hashset ArrayList和HashMap是异步的,Vector和HashTable是 ...