http://www.cnblogs.com/heiyue/archive/2011/08/03/2126622.html
--
1. write
ssize_t write(int fd, const void*buf, size_t nbytes);
1-1. 将 buf 中的 nbytes 字节内容写入文件描述符 fd
1-2. 返回值 > 0, 表示写了部分或者是全部的数据
1-3. 返回值 < 0, 此时出现了错误, 要根据错误类型来处理, EINTR 表示写的时候出现中断错误, EPIPE 表示网络连接出现问题 (对方已经关闭了连接)
int my_write(int fd, void *buffer, int length)
{
int bytes_left;
int written_bytes;
char *ptr;
ptr = buffer;
bytes_left = length;
while(bytes_left > 0) {
written_bytes = write(fd, ptr, bytes_left);
if(written_bytes <= 0) {
if(errno == EINTR)
written_bytes = 0;
else return(-1);
}
bytes_left -= written_bytes;
ptr += written_bytes;
}
return(0);
}
2. read
ssize_t read(int fd, void *buf, size_t nbyte)
2-1. 从 fd 中读取内容到 buf 中
2-2. 返回值 > 0, 返回实际所读的字节数,
2-3. 返回值 = 0, 表示已经读到文件的结束,
2-4. 返回值 < 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;
}
buffer = ptr;
return (length - bytes_left);
}
3. recv
int recv(int sockfd,void *buf,int len,int flags)
3-1. flags = 0 时, 与 read 相同
3-2. 其他???
4. send
int send(int sockfd,void *buf,int len,int flags)
4-1. flags = 0 时, 与 write 相同
4-2. 其他???
5. recvfrom (udp)
6. sendto (udp)
7. recvmsg
8. sendmsg
9. close
10. shutdown
================================================================================
x-1. 写结构体
struct my_struct my_struct_client;
my_write(fd, (void *)&my_struct_client, sizeof(struct my_struct);
x-2. 读结构体
char buffer[sizeof(struct my_struct)];
struct *my_struct_server;
my_read(fd, (void *)buffer, sizeof(struct my_struct));
my_struct_server = (struct my_struct *)buffer;
0 件のコメント:
コメントを投稿