socket中的发送与接收函数

来源:互联网 发布:适合开发的linux系统 编辑:程序博客网 时间:2024/06/11 21:33
网络I/O操作:
(一)read()/write()
(二)recv()/send()
(三)readv()/writev()
(四)recvmsg()/sendmsg()
(五)recvfrom()/sendto()
---------------------------------------------


(1)推荐使用recvmsg()/sendmsg()函数,这两个函数是最通用的I/O函数,实际上可以把上面的其它函数都替换成这两个函数。
(2)各个函数声明如下:


       #include <unistd.h>


       ssize_t read(int fd, void *buf, size_t count);
       ssize_t write(int fd, const void *buf, size_t count);


       #include <sys/types.h>
       #include <sys/socket.h>


       ssize_t send(int sockfd, const void *buf, size_t len, int flags);
       ssize_t recv(int sockfd, void *buf, size_t len, int flags);


       ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
                      const struct sockaddr *dest_addr, socklen_t addrlen);
       ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
                        struct sockaddr *src_addr, socklen_t *addrlen);


       ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags);
       ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags);
-------------------------------------------
(3)read()/write():
1)read函数:
read函数是负责从fd中读取内容.当读成功时,read返回实际所读的字节数,如果返回的值是0表示已经读到文件的结束了,小于0表示出现了错误。如果错误为EINTR说明读是由中断引起的,如果是ECONNREST表示网络连接出了问题。
2)wirte函数:
write函数将buf中的nbytes字节内容写入文件描述符fd.成功时返回写的字节数。失败时返回-1,并设置errno变量。
两种返回结果:
1)write的返回值大于0,表示写了部分或者是全部的数据。
2)返回的值小于0,此时出现了错误。我们要根据错误类型来处理。如果错误为EINTR表示在写的时候出现了中断错误。如果为EPIPE表示网络连接出现了问题(对方已经关闭了连接)。


-----------------------------------------
(4)recv()/send():
1)send函数:
send 的参数含义如下:
 sockfd :代表你与远程程序连接的套接字描述符。
 msg :一个指针,指向你想发送的信息的地址。
 len :是你想发送信息的长度。
 flags :发送标记。一般都设为0(你可以查看send 的man pages 来获得其他的参数值并且明白各个参数所代表的含义)。


2)send返回值:
send()函数在调用后会返回它真正发送数据的长度,send()函数如果发生错误,则返回 –1。
注意:
send所发送的数据可能少于你给它的参数所指定的长度!因为如果你给send()的参数中包含的数据的长度远远大于send()所能一次发送的数据,则send()函数只发送它所能发送的最大数据长度,然后它相信你会把剩下的数据再次调用它来进行第二次发送。所以,记住如果send()函数的返回值小于len 的话,则你需要再次发送剩下的数据。幸运的是,如果包足够小(小于1K),那么send()一般都会一次发送光的。


3)recv函数:
 sockfd :是你要读取数据的套接字描述符。
 buf :是一个指针,指向你能存储数据的内存缓存区域。
 len :是缓存区的最大尺寸。
 flags :是recv() 函数的一个标志,一般都为0 (具体的其他数值和含义请参考recv()


4)recv返回值:
recv() 返回它所真正收到的数据的长度。(也就是存到buf 中数据的长度)。如果返回–1 则代表发生了错误(比如网络以外中断、对方关闭了套接字连接等),全局变量errno 里面存储了错误代码。


 ------------------------------------------
(5)readv()/writev()
(6)recvmsg()/sendmsg()
(7)recvfrom()/sendto()

0 0
原创粉丝点击