没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
试读
17页
socket接口设计者最先是将接口放在Unix操作系统里面的。如果了解Unix系统的输入和输出的话,就很容易了解socket了。网络的 socket数据传输是一种特殊的I/O,socket也是一种文件描述符。socket也具有一个类似于打开文件的函数调用socket(),该函数返 回一个整型的socket描述符,随后的连接建立、数据传输等操作都是通过该socket实现的。常用的socket类型有两种:流式socket (SOCK_STREAM)和数据报式socket(SOCK_DGRAM)。流式是一种面向连接的socket,针对于面向连接的TCP服务应用;数据报式socket是一种无连接的socket,对应于无连接的UDP服务应用
资源推荐
资源详情
资源评论
TCP SOCKET 用法总结 v1.0
一、 理解 socket
1、 什么是 socket
socket 接口是 TCP/IP 网络的 API,socket 接口定义了许多函数或例程,程序员可
以用它们来开发 TCP/IP 网络上的应用程序。要学 Internet 上的 TCP/IP 网络编程,必须
理解 socket 接口。
socket 接口设计者最先是将接口放在 Unix 操作系统里面的。如果了解 Unix 系统
的输入和输出的话,就很容易了解 socket 了。网络的 socket 数据传输是一种特殊的
I/O,socket 也是一种文件描述符。 socket 也具有一个类似于打开文件的函数调用
socket(),该函数返 回一个整型的 socket 描述符,随后的连接建立、数据传输等操作都
是通过该 socket 实现的。常用的 socket 类型有两种:流式 socket (SOCK_STREAM)
和数据报式 socket(SOCK_DGRAM)。流式是一种面向连接的 socket,针对于面向
连接的 TCP 服务应用;数据报式 socket 是一种无连接的 socket,对应于无连接的 UDP
服务应用。
2、 socket 的建立
为了建立 Socket,程序可以调用 socket 函数,该函数返回一个类似于文件描述符
的句柄。socket 函数原型为:
int socket(int domain, int type, int protocol);
domain 指明所使用的协议族,通常为 PF_INET/AF_INET,表示互联网协议族
( TCP/IP IPV4 协 议 族 ) ; type 参 数 指 定 socket 的 类 型 : SOCK_STREAM 或
SOCK_DGRAM,Socket 接口还定义了原始 Socket(SOCK_RAW),允许程序使用
底层协议;protocol 通常赋值"0"。 socket()调用返回一个整型 socket 描述符,你可以在
后面的调用使用它。
socket 描述符是一个指向内部数据结构的指针,它指向描述符表入口。调用 socket
函数时,将为一个 socket 数据结构分配存储空间,返回的是代表该结构空间的 int 型值,
称作描述符。
两个网络程序之间的一个网络连接包括五种信息:通信协议、本地协议地址、本
地主机端口、远端主机地址和远端协议端口。socket 数据结构中包含这五种信息。
3、 socket 的配置
通过 socket 调用返回一个 socket 描述符后,在使用 socket 进行网络传输以前,必
须配置该 socket。面向连接的 socket 客户端通过 调用 connect 函数在 socket 数据结构中
保存本地和远端信息。无连接 socket 的客户端和服务端以及面向连接 socket 的服务端
通过调用 bind 函数来配置本地信息。
二、 TCP SOCKET(以下简称 socket)有阻塞和非阻塞 2 种模式
1、 Linux 操作系统默认 socket 是阻塞的。
2、 socket 没有单独设置接收阻塞或发送阻塞的接口。因此,设置阻塞或非阻塞
是对于接收和发送同时生效的。
3、 有时一个 socket 可以先设成阻塞来用,再设成非阻塞来用,或相反。主要是
根据功能需求确定使用方法。
4、 fcntl( sockfd, F_SETFL, O_NONBLOCK);
// sockfd 是要改变状态的文件描述符.
// F_SETFL 表明要改变文件描述符的状态
// O_NONBLOCK 表示将文件描述符变为非阻塞的.
三、 setsockopt()函数
函数原型 int setsockopt(int sock, int level, int optname, const void *optval, socklen_t
optlen);
参数:××
sock:将要被设置或者获取选项的套接字。
level:选项所在的协议层。
1)SOL_SOCKET:通用套接字选项.(选择)
2)IPPROTO_IP:IP 选项.
3)IPPROTO_TCP:TCP 选项.
optname:需要访问的选项名,如下:
level optname
说明 数据类型
SOL_SOCK
ET
SO_BROADCA
ST
允许发送广播数据
int
SO_DEBUG
允许调试
int
SO_DONTROU
TE
不查找路由
int
SO_ERROR
获得套接字错误
int
SO_KEEPALIVE
保持连接
int
SO_LINGER
延迟关闭连接
int
SO_OOBINLIN
E
带外数据放入正常数据流
int
SO_RCVBUF
接收缓冲区大小
int
SO_SNDBUF
发送缓冲区大小
int
SO_RCVLOWA
T
接收缓冲区下限
int
SO_SNDLOWA
T
发送缓冲区下限
int
SO_RCVTIMEO
接收超时
struct timeval
SO_SNDTIMEO
发送超时
struct timeval
SO_REUSERAD
DR
允许重用本地地址和端口
int
SO_TYPE
获得套接字类型
int
SO_BSDCOMP
AT
与 BSD 系统兼容
int
IPPROTO_IP IP_HDRINCL
在数据包中包含 IP 首部
int
IP_OPTINOS
IP 首部选项
int
IP_TOS
服务类型
int
IP_TTL
生存时间
int
IPPRO_TCP TCP_MAXSEG
TCP 最大数据段的大小
int
TCP_NODELAY
不使用 Nagle 算法
int
optval:指向包含新选项值的缓冲。
optlen:现选项(optval 实际内容)的长度。
返回值:
成功执行时,返回 0。失败返回-1,errno 被设为以下的某个值××
EBADF:sock 不是有效的文件描述词
EFAULT:optval 指向的内存并非有效的进程空间
EINVAL:在调用 setsockopt()时,optlen 无效
ENOPROTOOPT:指定的协议层不能识别选项
ENOTSOCK:sock 描述的不是套接字
四、 Socket()函数
函数原型 int socket(int domain, int type, int protocol);
参数:
Domain:指定用何种地址类型,完整的定义在/usr/include/bits/socket.h 内
PF——UNIX/PF_LOCAL/AF_ UINIX 进程通讯协议
UNIX/AF_LOCAL
PF_INET/AF_INET IPV4 网络协议
PF_INET6/AF_INET6 IPV6 网络协议
PF_IPX/AF_IPX IPX-Novell 协议
PF_NETLINK/AF_NETLINK 核心用户接口装置
PF_X25/AF_X25 ITU-TX.25/ISO-8208 协议
PF_AX25/AF_AX25 业余无线 AX.25 协议
PF_ATMPVC/AF_ATMPVC 存取原始 ATM PVCs
PF_APPLETALK/AF_APPLETALK Appletalk(DDP)协议
PF_PACKET/AF_PACKET 初始封包接口
Type:
SOCK_STREAM 提供双向连续且可信赖的数据流,即 TCP。支持 OOB(out-of-
band)机制。在所有数据传输前必须使用 connect()来建立连线状态。
SOCK_DGRAM 使用不连续不可信连的数据包连接
SOCK_SEQPACKET 提供连续可信赖的数据包连接
SOCK_RAW 提供原始网络协议存取
SOCK_RDM 提供可信赖的数据包连接
SOCK_PACKET 提供网络驱动程序直接通信
Protocol 用来指定 socket 所使用的传输协议编号,通常此参考不用管它,设为 0 即
可。
返回值:
成功执行时,返回 0。失败返回-1,errno 被设为以下的某个值××
EPROTONOSUPPORT 参数 domain 指定的类型不支持参数 type 或 protocol 指定的协议
ENFILE 核心内存不足,无法建立新的 socket 结构
EACCESS 权限不足,无法建立参数 type 或 protocol 指定的协议
ENOBUFS/ENOMEM 内存不足
EINVAL 参数 domain/type/protocol 不合法
执行流程:
当 我 们 在 应 用 程 序 调 用 API 函 数 socket(AF_INET,
SOCK_STREAM,IPPROTO_TCP)时就会调用 socket 的系统调用进入统一的入口函数
sys_socketcall,如果是创建套接字,就会调用 sys_socket,sys_socket 然后就调用
sock_create,这个才是真正执行 socket 创建的函数。
Sock_create 函数调用 socket_alloc 创建 socket,主要分配两个主要数据,一个
是套接字 socket,另一个是 socket 对应的 inode。Socket 的结构为:
struct socket
{
socket_state state;
unsigned long flags;
struct proto_ops *ops;
//文件系统相关的接口 file,inode
struct inode *inode;
struct fasync_struct *fasync_list; /* Asynchronous wake up list */
struct file *file; /* File back pointer for gc */
//网络关联的数据接口在 sock 中
struct sock *sk;
wait_queue_head_t wait;
short type;
unsigned char passcred;
};
因此,socket 只是网络和文件系统关联的接口抽象,没有网络的相关信息,从 socket 的
数据结构容易看出,还有另一个网络抽象的重要的数据结构 sock。
接下来,调用 inet_create(对于 ip 网络协议)创建 sock(注意,sock 和 socket 不同)。
至此数据初始化完成了,然后就调用具体传输层协议的初始化函数。
整个创建过程主要函数调用层次关系如下:
sock_create() //创建 socket
{
alloc_sock() //创建初始的 socket
{
get_empty_inode() //获取一个 Inode-
socket_look_up() //填充具体 inode 的 socket 并初始化
}
inet_create() //完善 socket 结构体内容,如添加 sock 结构
{
alloc_sk() //创建 sock 结构
}
}
五、 Bind()函数
原型:int bind(int sockfd, struct sockaddr *my_addr, int addrlen);
剩余16页未读,继续阅读
资源评论
hlc7831
- 粉丝: 0
- 资源: 28
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- HandTrackingModule.py
- Python基于卷积神经网络的鸟类识别项目源代码,ipynb文件
- 批量将py编译为pyd文件.atbx
- Python项目-学生管理系统
- 图像处理基于matlab图像RGB三色合成分离【含Matlab源码第1发】
- verilog HDL硬件语法设计包括算术运算三人表决器Verilog的阻塞和非阻塞赋值源码例程quartus13.1工程合集
- 【文章话题分类论文】OpenAlex Topic Classification Whitepaper
- linux学习常用命令
- 功率拓扑快速参考指南-ti,TI官方出品
- 开源2023电赛国赛运动目标控制(E题)视觉部分
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功