2012年4月3日火曜日

[C 语言] socket 基本函数

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 件のコメント:

コメントを投稿