前面我们分析过TCP的ACK
, RST
等, 本节来分析URG
.
注意 : TCP虽然是面向字节流的, 但是TCP传送的数据单元却是报文段.
消息被设置为紧急时会把TCP状态标记为URG
, 同时还会设置紧急指针.
在套接字选项中找不到关于URG
的描述, 那么该消息又怎样被标记为紧急呢? 别急, 消息标记为紧急数据这个在最开始实现套接字通信中有说到过. 紧急标志主要就是send
和recv
最后一个参数的选项.
flags值 | 描述 |
---|---|
MSG_OOB | 发送或接收外来数据(紧急数据) |
MSG_DONTROUTE | 绕过路由表查找 |
MSG_DONTWAIT | 仅操作非阻塞 |
MSG_PEEK | 窥看外来数据 |
MSG_WAITALL | 等待达到nbytes字节数后才返回 |
MSG_NOSIGNAL | 往读端关闭的管道或者socket中写数据不产生SIGPIPE信号 |
如果要发送和接收紧急数据只要设置recv
和send
的flags
参数值为MSG_OOB即可.
recv(sockfd, buf, sizeof(buf), MSG_OOB);
send(sockfd, buf, len, MSG_OOB);
为了发送和接收紧急消息, 那么对端又怎么区分普通消息和紧急消息呢 ? 紧急消息内核会向进程发送SIGURG信号. 既然会触发信号, 那么这样就容易区分了, 直接捕捉信号即可.
但是这里我并不打算使用捕捉信号来完成实验. 后面在socket就绪条件 [1]中有一点关于“socket上有未处理的错误 : select能处理的异常情况只有一种: socket上接收到带外数据 ” .
使用IO复用, 当接收到紧急消息时, 会触发错误(POLLERR, EPOLLERR). 这里就实验代码就采用select
来接收紧急数据.
服务端 : 完整代码 URG_service.c
主要部分代码如下 :
void doservice(int service){int client;
本文发布于:2024-02-04 22:26:06,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170717799160217.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |