首页 > 代码库 > 异步IO简介

异步IO简介

最近想学习一下libevent,就先翻译一下libevent的官方文档吧.

英文原文链接:http://www.wangafu.net/~nickm/libevent-book/01_intro.html

大部分编程初学者都是从阻塞IO开始的。何谓阻塞IO?,即你进行一个IO调用时,除非这个操作完成,或者超时网络协议栈放弃了,否则这个调用是不返回的.比如你对TCP连接调用“connect()”时,你的操作系统将发送一个SYN包给TCP连接的对端,除非收到对端发送的SYN ACK包或者是超时了,否则connect()将不会返回。

这里是一个简单的使用阻塞网络调用的客户端例子.客户端连接到www.google.com,发起一个HTTP请求,把响应打印到标准输出.

/* For sockaddr_in */#include <netinet/in.h>/* For socket functions */#include <sys/socket.h>/* For gethostbyname */#include <netdb.h>#include <unistd.h>#include <string.h>#include <stdio.h>int main(int c, char **v){    const char query[] =        "GET / HTTP/1.0\r\n"        "Host: www.google.com\r\n"        "\r\n";    const char hostname[] = "www.google.com";    struct sockaddr_in sin;    struct hostent *h;    const char *cp;    int fd;    ssize_t n_written, remaining;    char buf[1024];    /* Look up the IP address for the hostname.   Watch out; this isn‘t       threadsafe on most platforms. */    h = gethostbyname(hostname);    if (!h) {        fprintf(stderr, "Couldn‘t lookup %s: %s", hostname, hstrerror(h_errno));        return 1;    }    if (h->h_addrtype != AF_INET) {        fprintf(stderr, "No ipv6 support, sorry.");        return 1;    }    /* Allocate a new socket */    fd = socket(AF_INET, SOCK_STREAM, 0);    if (fd < 0) {        perror("socket");        return 1;    }    /* Connect to the remote host. */    sin.sin_family = AF_INET;    sin.sin_port = htons(80);    sin.sin_addr = *(struct in_addr*)h->h_addr;    if (connect(fd, (struct sockaddr*) &sin, sizeof(sin))) {        perror("connect");        close(fd);        return 1;    }    /* Write the query. */    /* XXX Can send succeed partially? */    cp = query;    remaining = strlen(query);    while (remaining) {      n_written = send(fd, cp, remaining, 0);      if (n_written <= 0) {        perror("send");        return 1;      }      remaining -= n_written;      cp += n_written;    }    /* Get an answer back. */    while (1) {        ssize_t result = recv(fd, buf, sizeof(buf), 0);        if (result == 0) {            break;        } else if (result < 0) {            perror("recv");            close(fd);            return 1;        }        fwrite(buf, 1, result, stdout);    }    close(fd);    return 0;}