转载请注明出处:csdn火木达人
建立好了socket连接之后,我们就可以把得到的fd当作文件描述符来使用,一下三种方式可用于socket数据收发
1.connect() + write() + read() : 适用于TCP
头文件:
#include <sys/types.h>
#include <sys/uio.h>
#include <unistd.h>
ssize_t write(int d,const void *buf,size_t nbytes);
调用成功返回成功写入的字节数,调用失败则返回-1。
参数1为对象的句柄;
参数2是写入的内容;
参数3是前者的大小。
ssize_t read(int d,void *buf,size_t nbytes);
正常调用返回成功读入的字节数,当读到句柄对象的底部时返回0,调用失败返回-1。
参数1为对象句柄;
参数2是读入容器的地址;
参数3是前者的大小。
2.sendto() + recvfrom() : 适用于TCP、UDP,多数用于UDP
头文件:
#include <sys/types.h>
#include <sys/socket.h>
ssize_t sendto(int s,const void *msg,size_t len,int flags,const struct sockaddr *to,socklen_t tolen);
调用成功返回成功写入的字节数,调用失败则返回-1。
参数1是套接字句柄;
参数2是需要发送的数据;
参数3是前者的大小;
参数4是特殊传输标识,其值多为0;
参数5是发送目的地的sockaddr结构主机地址的指针值;
参数6是前者的长度。
ssize_t recvfrom(int s,void *buf,size_t len,int flags,struct sockaddr *from,socklen_t *fromlen);
正常调用返回成功读入的字节数,调用失败返回-1。
参数1是套接字句柄;
参数2是成功接收到远程传输过来后的数据时放入的变量地址;
参数3是前者的大小;
参数4是特殊传输标识,其值多为0;
参数5是接收到的数据的发送端的sockaddr结构主机地址的指针值;
参数6是前者长度的地址值。
3.connect() + send() + recv() : 适用于TCP、UDP,多数用于TCP
头文件:
#include <sys/types.h>
#include <sys/socket.h>
ssize_t send(int s, const void *msg, size_t len, int flags);
调用成功返回成功写入的字节数,调用失败则返回-1。
参数1是套接字句柄;
参数2是需要发送的数据;
参数3是前者的大小;
参数4是特殊传输标识,其值多为0。
ssize_t recv(int s, void *buf, size_t len, int flags);
正常调用返回成功读入的字节数,调用失败返回-1。
参数1是套接字句柄;
参数2是成功接收到远程传输过来后的数据时放入的变量地址;
参数3是前者的大小;
参数4是特殊传输标识,其值多为0。
send和recv的第四个参数也可以是以下的组合
MSG_DONTROUTE:不查找路由表
MSG_OOB:接受或发送带外数据
MSG_PEEK:查看数据,并不从系统缓冲区移走数据
MSG_WAITALL : 等待任何数据
假如flags为0,则和read,write相同的操作