1. 程式人生 > >LINUX高性能網絡通信堵住筆記之UDP數據讀寫

LINUX高性能網絡通信堵住筆記之UDP數據讀寫

int ase level recv 阻塞 連接 我們 out 返回

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()

這一塊暫時不寫了

LINUX高性能網絡通信堵住筆記之UDP數據讀寫