网络开发的一些总结

来源:互联网 发布:财务指标计算软件 编辑:程序博客网 时间:2024/06/06 05:04

(1) I/O 模型的选择,

epoll就一定好吗?  那是肯定的。

epoll最有用的就是ET模式,适合于那种有大量连接,但是有数据的连接比较少的情况,
如果你有10000个连接,但是很不幸,这10000个连接全部都有数据,你还是得遍历一把进行处理,( 这里对ET模式下怎么处理数据就不讨论了)。

这个和select, poll有什么区别。

epoll还有比select, poll先进得地方, 就在于将fd得列表维护在内核中, 而select, poll是调用一次,传递一次, 这点epoll领先是没得说得。

最主要还是epoll系统调用的实现方式采用事件方式,比poll, select的轮询方式强的多

(2) 使用非堵塞

做为网络服务器, 堵塞I/O一般情况下不予考虑

(3) 减少I/O操作和无谓的系统调用

比如利用writev一次性写入多个数据, 减少write调用的次数.

或者使用零拷贝的sendfile,tee等

(4) tcp是双工的

这点不要忽略掉, 数据转发程序就在于数据的转发速度, 这里我采用读和写分开线程的处理方式

(5) 进程还是线程

这个无关紧要,一个粒度和数据访问, 稳定性的问题。减少之间的相互影响,尽量没有关联, 比如减少对相关互斥数据的访问等等。

(6) 尽量在设计上做到不需要锁
比如使用环形缓存, 环形消息队列等


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/pmunix/archive/2008/07/18/2672975.aspx

 

writev() function

     /* prototype: ssize_t writev(int fd, const struct iovec *iov, int cnt); */
                                                                                                
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/uio.h>
                                                                                                
int main(void)
{
        char buf0[] = "xuzhengyang", buf1[] = "yinshulei/n";
        struct iovec iov[2];
                                                                                                
        iov[0].iov_base = buf0;
        iov[0].iov_len = strlen(iov[0].iov_base);
        iov[1].iov_base = buf1;
        iov[1].iov_len = strlen(iov[1].iov_base);
                                                                                                
        if (writev(STDOUT_FILENO, iov, 2) == -1) {
                perror("writev");
                exit(1);
        }
                                                                                                
        exit(0);
}

Sendfile函数说明
 
#include <sys/sendfile.h>
ssize_t sendfile(int out_fd, int in_fd, off_t *offset, size_t count);
 
sendfile()是作用于数据拷贝在两个文件描述符之间的操作函数.这个拷贝操作是内核中操作的,所以称为"零拷贝".sendfile函数比起read和write函数高效得多,因为read和write是要把数据拷贝到用户应用层操作.
 
参数说明:
out_fd 是已经打开了,用于写操作(write)的文件描述符;
in_fd 是已经打开了,用于读操作(read)的文件描述符;
offset 偏移量;表示sendfile函数从in_fd中的哪一偏移量开始读取数据.如果是零表示从文件的开始读,否则从相应的便宜量读取.如果是循环读取的时候,下一次offset值应为sendfile函数返回值加上本次的offset的值.
count是在两个描述符之间拷贝的字节数(bytes)
 
返回值:
如果成功的拷贝,返回写操作到out_fd的字节数,错误返回-1,并相应的设置error信息.
 
EAGAIN 无阻塞I/O设置O_NONBLOCK时,写操作(write)阻塞了.
EBADF 输出或者输入的文件描述符没有打开.
EFAULT 错误的地址.
EINVAL 描述符不可用或者锁定了,或者用mmap()函数操作的in_fd不可用.
EIO 当读取(read)in_fd时发生未知错误.
ENOMEM 读(read)in_fd时内存不足.


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/Crazyguang/archive/2008/05/09/2423708.aspx

原创粉丝点击