坚持学习100天:套接字控制

46 篇文章 0 订阅
44 篇文章 0 订阅
这篇博客介绍了C++中关于套接字I/O控制的函数,包括ioctlsocket和WSAIoctl,以及如何设置和获取套接字选项。讲解了FIONBIO和FIONREAD等命令的作用,并提到了套接字选项的级别,如SOL_SOCKET、IPPROTO_IP等。此外,还简单提及了UDP套接字编程的基本流程。
摘要由CSDN通过智能技术生成

前言

Hello,我是修齊。
学习C++的第一百零二十八天,用心学习。
在这里记录一些学习的东西和学习的心情,内容主要是一些自己学习整理的小笔记。

一、I/O控制命令

1.套接字的I/O控制主要用于设置套接字的工作模式(阻塞模式还是非阻塞模式)。
2.Winsock提供函数ioctlsocket和WSAIOctl来发送I/O控制命令。
3.ioctlsocket声明:

int ioctlsocket(SOCKET s,long cmd,u_long*
argp);

4.s为要设置I/O模式的套接字的描述符,cmd表示发给套接字的I/O控制命令。
5.cmd通常取值:

.FIONBIO:设置或清除阻塞模式的命令。当argp作为输入参数为0,套接字设置为阻塞模式;当argp作为输入参数为非0,套接字设置为非阻塞模式。
(函数WSAAsynSelect会将套接字自动设置为非阻塞模式,若对某个套接字调用了WSAAsynSelect函数,再想用ioctlsocket函数把套接字重新设置为阻塞模式,ioctlsocket会返回WSAEINVAL错误,应该重新调用WSAAsynSelect函数,并把其参数IEvent设置为0..FIONREAD:确定套接字s自动读入数据量的命令,若s是流套接字(SOCET_STREAM)类型,则argp得到函数recv调用一次时可读入的数据量,通常和套接字中排队的数据总量相同。若s是数报套接字(SOCK_DGRAM),则argp返回套接字排队的第一个数据报的大小。
.FIOASYNC:设置或清除异步I/O的命令。

6.WSAIoctl是Winsock2中的I/O控制命令函数,声明:

int WSAIoctl(SOCKET s,DWORD dwIoControlCode,LPVOID
lpvInBuffer,
DWORD cbInBuffer,LPVOID lpvOutBuffer,DWORD cbOutBuffer,
LPDWORD lpcbBytesReturned,LPWSAOVERLAPPED lpOverlapped,
LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine);

7.·s:[in]套接字描述符(句柄)。
8.·dwIoControlCode:[in]存放用于操作的控制码,如:SIO_RCVALL(接收全部数据包的选项)。
9.·IpvBuffer:[in]指向输入缓冲区地址。
10.··cbInBuffer:[in]输入缓冲区的字节大小。
11.·IpvOutBuffer:[out]指向输出缓冲区的地址。
12.·cbOutBuffer:[in]输出缓冲区的字节大小。
13.·IpvbBytesReturned:[out]指向存放实际输出数据的字节大小的变量地址。
14.·IpOverlapped:[in]指向WSAOVERLAPPED结构体的地址。
15.·IpCompletionRoutine:[in]指向一个例程函数,函数在操作结束后调用。

二、套接字选项

1.除了发送I/O控制命令影响套接字的行为外,还可设置套接字的选项来对套接字控制。
2.套接字属性:(获取或设置属性)设置套接字的接收和发送缓冲区大小、指定是否允许套接字绑定到一个已经使用的地址、判断套接字是否支持广播、控制带外数据的处理、获取和设置超时参数。
3.选项有针对特定协议的、有适用所有类型的套接字,因此有选项级别(level)概念。
4.常见级别:

·SOL_SOCKET:级别与套接字使用的具体协议无关,只作用于套接字本身。
`SOL_LRLMP:级别的选项作用于IrDA协议。
`IPPROTO_IP:级别的选项作用于IPv4协议。
·IPPROTO_IP6:级别作用于IPv6协议,有一些选项和IPPROTO_IP对应。
·IPPROTO_RM	:级别选项作用于可靠的多播传输。
·IPPROTO_TCP:级别选项适用于流式套接字。
·IPPROTO_UDP:级别选项适用于数据报套接字。

5.Winsock提供API函数getsockopt来获取套接字的选项,声明:

int getsockopt(SOCKET s,int level,int optname,char*optval,
int*
optlen);

6.参数s是套接字描述符。
7.level表示选项的级别。如取值:SOL_SOCKET,IPPROTO_IP,IPPROTO_TCP,IPPROTO_UDP
8.optname表示获取的选项名称。
9.optval[out]指向存放接收到的选项内容的缓冲区。
10.char*表示传入的是optval的地址。
11.optval[in,out]指向optval所指缓冲区的大小。
12.Winsock提供API函数setsockopt来获取套接字的选项,声明:

int setsockopt(SOCKET s,int level,int optname,const char*optval,
int
optlen);

三、UDP套接字编程

1.UDP套接字就是数据报套接字,一种无连接的Socket。
2.UDP套接字程序中,客户不与服务器建立连接,直接使用sendto函数给服务器发送数据报即可。同样,服务器不接受来自客户的连接,只管调用recvfrom函数,等待来自某个客户的数据到达。
3.UDP套接字编程相关函数:套接字创建socket()、地址绑定bind(),消息传输函数sendto()和recvfrom()。

4.就这样吧。今天2022年5月20日,祝大家快乐!!!

上述内容如有侵权,联系即删。
感谢阅读-感谢支持

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值