LINUX高性能网络通信堵住笔记之UDP数据读写

2.UDP数据读写
2.1ssize_t recvfrom(int sockfd,const void buf,size_t len,int flags,struct socketaddr src_addr,socklen_t addrlen);
2.2 ssize_t sendto (int sockfd,const void
buf,size_t len,int flags,const struct sockaddr* dest_addr,socklen_t addrlen);
注:recvfrom/sendto 系统调用也可以用于面向连接(STREAM)的socket的数据读写,只需要把最后两个参数设置为NULL
3.通用数据读写

ssize_t recvmsg(int sockfd,struct msghdr msg,int flags)
ssize_t sendmsg(int sockfd,struct msghdr
msg,int flags);

struct msghdr{
void msg_name; //socket地址
socklen_t msg_namelen; // socket地址长度
struct iovec
msg_iov; //分散的内存块
int msg_iovlen; //分散内存块的数量
void* msg_control; //指向辅助数据的起始位置
socklen_t msg_cintrollen; //辅助数据的大小
int msg_flags; //复制函数中的flags参数,并且在调用过程中更新
}

struct iovec{
void *iov_base; //内存起始地址
size_t iov_len; //这块内存的长度
}

4.带外标记

带外数据何时到来?
传输层协议使用带外数据(out-of-band,OOB)来发送一些重要的数据,如果通信一方有重要的数据需要通知对方时,协议能够将这些数据快速地发送到对方。为了发送这些数据,协议一般不使用与普通数据相同的通道,而是使用另外的通道。linux系统的套接字机制支持低层协议发送和接受带外数据。但是TCP协议没有真正意义上的带外数据。为了发送重要协议,TCP提供了一种称为紧急模式(urgent mode)的机制。TCP协议在数据段中设置URG位,表示进入紧急模式。接收方可以对紧急模式采取特殊的处理。很容易看出来,这种方式数据不容易被阻塞,并且可以通过在我们的服务器端程序里面捕捉SIGURG信号来及时接受数据。这正是我们所要求的效果。

int sockatmark(int sockfd)

返回1的时候,我们利用带有MSG_OOB标志的recv调用来接收带外数据

如果不是返回0

5.地址信息函数

一个连接socket的本端socket地址和远端的socket地址
int getsocketname(int sockfd,struct sockaddr address,socklen_t address_len)

int getpeername(int sockfd,struct sockaddr address,socklen_t address_len)

6.socket选项

fcntl系统调用是控制文件描述符属性通用POSIX方法

专门设置socket文件描述符属性的方法
int getsockopt(int sockfd,int level,int option_name,void option_value,socklen_t restrict option_len)
int setsockopt()

这一块暂时不写了

原文地址:http://blog.51cto.com/10725691/2067669

时间: 2024-10-31 05:01:12

LINUX高性能网络通信堵住笔记之UDP数据读写的相关文章

linux高性能网络编程读书笔记之socket数据读写

数据读写分为TCP数据读写,UDP数据读写,通用数据读写1.TCP数据读写定义:socket是连接用户空间和内核空间,TCP和UDP是内核第一层.解释:对于文件的read和write同样适用于socket例子:对于TCP流数据的系统调用1.1ssize_t recv(int sockfd,void buf,size_t len,int flags);1.2ssize_t send(int sockfd,const void buf,size_t len,int flags); 参数解释:1.3b

LINUX高性能服务器读书笔记之程序规范

背景:除了网络通信,服务器程序还有许多细节问题,.特点:细节都是模板式的,所以只需要讲明白就好,遵循一定的规范就好类别:1.1运行形式-->后台进程,又称为守卫进程.没有控制终端,也不会意外受到用户输入.它的父进程是:init进程(pid是1 的进程)1.2日志系统.一般至少输出到文件,还可以输出到专门的UDP服务器.一般在/var/log 都拥有自己的日志目录1.3运行身份:某个专门的非root身份.例子:mysqld,httpd,syslogd等后台程序,都分别拥有自己的账户mysql,ap

linux高性能服务器读书笔记之服务器模型

1.模型一:C/S(经典的) 起因:TCP/IP协议是没有客户和服务端的区别.但是资源(视频,新闻,软件)都是被数据提供者所垄断 逻辑:服务器启动后,首先创建一个或多个监听socket,并且调用bind函数将其绑定到需要(自定义)的端口,然后调用listen函数等待客户连接 特点:客户连接是随机事件,需要某种I/O模型来监听连接. 例子:服务器I/O复用技术之一的select系统调用 (当监听接收到连接 ,服务器用accept来接收,并且分配一个逻辑单元为它服务,(fork系统产生逻辑单元,逻辑

tcpdump dns包(linux高性能编程读书笔记2)

  tcpdump -i eth0 -nt -s 500 port domain host -t A www.baidu.com www.baidu.com is an alias for www.a.shifen.com. www.a.shifen.com has address 119.75.217.109 www.a.shifen.com has address 119.75.218.70   IP 192.168.5.115.47195 > 192.168.5.1.domain: 169

浅谈UDP(数据包长度,收包能力,丢包及进程结构选择)

UDP数据包长度 UDP数据包的理论长度 udp数据包的理论长度是多少,合适的udp数据包应该是多少呢?从TCP-IP详解卷一第11章的udp数据包的包头可以看出,udp的最大包长度是2^16-1的个字节.由于udp包头占8个字节,而在ip层进行封装后的ip包头占去20字节,所以这个是udp数据包的最大理论长度是2^16-1-8-20=65507. 然而这个只是udp数据包的最大理论长度.首先,我们知道,TCP/IP通常被认为是一个四层协议系统,包括链路层.网络层.运输层.应用层.UDP属于运输

Linux 网络编程——原始套接字实例:发送 UDP 数据包

以太网报文格式: 详细的说明,请看<MAC 头部报文分析>. IP 报文格式: 详细的说明,请看<IP 数据报格式详解>. UDP 报文格式: 详细的说明,请看<UDP 数据报格式详解>. 校验和函数: /******************************************************* 功能: 校验和函数 参数: buf: 需要校验数据的首地址 nword: 需要校验数据长度的一半 返回值: 校验和 ********************

linux网络编程学习笔记之二 -----错误异常处理和各种碎碎(更新中)

errno 在unix系统中对大部分系统调用非正常返回时,通常返回值为-1,并设置全局变量errno(errno.h),如socket(), bind(), accept(), listen().erron存放一个正整数来保存上次出错的错误值. 对线程而言,每个线程都有专用的errno变量,不必考虑同步问题. strerror converts to English (Note: use strerror_r for thread safety) perror is simplified str

Linux高性能服务器编程——I/O复用

 IO复用 I/O复用使得程序能同时监听多个文件描述符,通常网络程序在下列情况下需要使用I/O复用技术: 客户端程序要同时处理多个socket 客户端程序要同时处理用户输入和网络连接 TCP服务器要同时处理监听socket和连接socket,这是I/O复用使用最多的场合 服务器要同时处理TCP请求和UDP请求.比如本章将要讨论的会社服务器 服务器要同时监听多个端口,或者处理多种服务. I/O复用虽然能同时监听多个文件描述符,但它本身是阻塞的.并且当多个文件描述符同时就绪时,如果不采用额外措施

Linux内核架构读书笔记 - 2.5.2 数据结构

调度系统各个组建关系如下 激活调度器两种方法:进程睡眠或其他原因放弃CPU,周期性检测 上述两个组件统称为通用调度器或核心调度器. 调度器用于判断接下来运行那个进程,内核支持不同的调度策略( 完全公平调度 实时调度 无事可做的空闲调度进程) 调度器被调用时候 需要执行体系相关的进程上下文切换 每个进程属于某个调度器类,各个调度器负责管理所属进程,通用调度器不涉及进程管理,都由调度器来 下面分别讲述: task_struct 成员 sched.h 1 struct task_struct { 2