socket读写
sszie_t write(int fd, const void *buf, size_t count);
return:成功,返回写入的字节数;失败-1。
在网络程序中,当我们向socket写时有两种可能:
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;
}
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()是正确的)。
int recvfrom(int sockfd, void *buf, int len, unsigned int flags, struct sockaddr * from, int *fromlen);
int sendto(int sockfd, const void *msg, int len, unsigned int flags, struct sockaddr *to, int tolen);
注:如果对信息的来源不感兴趣,可以将from和fromlen设置为NULL。
原文:http://www.cnblogs.com/embedded-linux/p/4986192.html