码迷,mamicode.com
首页 > 其他好文 > 详细

socket数据收发

时间:2015-11-22 17:17:45      阅读:156      评论:0      收藏:0      [点我收藏+]

标签:

socket读写

  • write

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

return:成功,返回写入的字节数;失败-1。

在网络程序中,当我们向socket写时有两种可能:

  1. write的返回值大于0,表示写了部分或者全部的数据。
  2. 返回值小于0,此时出现了错误。我们要根据错误类型来处理。如果错误为EINTR标识在写的时候出现了中断错误。如果为EPIPE表示网络连接出现了问题(对方已经关闭了连接)。

int my_write(int fd, void *buffer, int len){

int bytes_left;

int written_bytes;

char *ptr;

ptr = buffer;

bytes_left = len;

while(bytes_left > 0){

written_bytes = write(fd, ptr, bytes_left);

if(writte_bytes <= 0){

if(errno == EINTR)

writen_bytes = 0;

else

return -1;

}

bytes_left -= writen_bytes;

ptr += written_bytes;

}

return 0;

}

  • read

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

return:成功,返回读取到的字节数;失败-1。

返回值为0,表示已经读到文件的结束;返回值小于0 表示出现了错误.如果错误为EINTR说明读是由中断引起的,如果是ECONNREST表示网络连接出了问题。

int my_read(int fd,void *buffer,int length){

int bytes_left;

int bytes_read;

char *ptr;

bytes_left=length;

while(bytes_left>0){

bytes_read=read(fd,ptr,bytes_left);

if(bytes_read<0){

if(errno==EINTR)

bytes_read=0;

else

return(-1);

}

else if(bytes_read==0)

break;

bytes_left-=bytes_read;

ptr+=bytes_read;

}

return(length-bytes_left);

}

注释:感觉上面的read()有问题,若读完连接现有数据后,还不到想读取数据的个数,则再read()连接会阻塞,不会立即返回0(若为非阻塞read(),上述read()是正确的)。

  • recvfrom

int recvfrom(int sockfd, void *buf, int len, unsigned int flags, struct sockaddr * from, int *fromlen);

  • sendto

int sendto(int sockfd, const void *msg, int len, unsigned int flags, struct sockaddr *to, int tolen);

注:如果对信息的来源不感兴趣,可以将from和fromlen设置为NULL。

socket数据收发

标签:

原文地址:http://www.cnblogs.com/embedded-linux/p/4986192.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!