coming
天行健 君子以自强不息
记录我的成长
数据读写
TCP数据读写
socket编程接口提供了专门用于socket数据读写的函数,它们增加对数据读写的控制。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
ssize_t recv(int sockfd, void * buf, size_t len, int flags);
ssize_t send(int sockfd, const void * buf, size_t len, int flags);
|
UDP数据读写
1 2 3 4 5 6 7 8 9 10 11 12
|
ssize_t recvfrom(int sockfd, void * buf, size_t len, int flags, struct sockaddr * addr, socklen_t * addr_len);
ssize_t sendto(int sockfd, const void * buf, size_t len, int flags, const struct sockaddr * addr, socklen_t addr_len);
|
若将参数addr与addr_len置为NULL,则recvfrom/sendto也可用于面向连接的socket数据读写。
通用数据读写
socket编程接口提供一对通用的数据读写系统调用。既可用于TCP流数据,又可以用于UDP数据报。
1 2 3 4 5 6 7
|
ssize_t recvmsg(int sockfd, struct msghdr * msg, int flags);
ssize_t sendmsg(int sockfd, struct msghdr * msg, int flags);
|
其中,结构体msghdr的定义如下。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
struct msghdr{ void *msg_name; socklen_t msg_namelen; struct iovec *msg_iov; size_t msg_iovlen; void *msg_control; size_t msg_controllen; int msg_flags; };
|
其中,结构体iovec的定义如下。
1 2 3 4 5 6 7 8 9
|
struct iovec{ void *iov_base; size_t iov_len; };
|
接收带外标记
在recv函数的flags中设置MSG_OOB选项可以接收带外数据,但是实际应用中程序无法预期带外数据何时到来;因此,Linux提供sockatmark函数来判断sockfd是否处于带外标记,即下一个被读取的数据是否为带外数据;如果是,sockatmark函数返回1。
1 2 3 4
|
int sockatmark(int sockfd);
|
地址信息函数
想知道一个连接socket的本端socket地址与远端socket地址,Linux提供如下两个函数。
1 2 3 4 5 6 7 8 9 10
|
int getsockname(int sockfd, struct sockaddr * addr, socklen_t len);
int getpeername(int sockfd, struct sockaddr * addr, socklen_t len);
|
本文代表个人观点,内容仅供参考。若有不恰当之处,望不吝赐教!