recv和send的完整写法

来源:互联网 发布:java集合框架及其特点 编辑:程序博客网 时间:2024/05/11 19:37
struct evbuffer* input = evbuffer_new();//数据缓冲void read_data(){    char buffer[1024] = { '\0' };    int ret = recv(fd, buffer, 1024, 0);    //从接收缓冲取数据成功    if (ret > 0)    {        evbuffer_add(input, buffer, ret);        //不足1024,说明取完了        if (ret《 1024)        {            return;         }        //有足够的数据,还没有取完需要继续取        return read_data();    }    //发生错误    if (ret == -1)    {        //EAGAIN提示你的应用程序现在没有数据可读请稍后再试        //EINTR指操作被中断唤醒,需要重新读        if ((errno == EAGAIN) || (errno == EINTR))        {            return read_data();        }        //异常断开情况        else        {            close(fd);            event_free(ev);        }        return;    }    //接收到主动关闭请求    if (ret == 0)    {        close(fd);        event_free(ev);    }}
string response;//发送的数据void send_response(){    unsigned int pos = 0;    do     {        int ret = send(fd, response.data.c_str()+pos, response.data.length()-pos, 0);        //发生错误        if (-1 == ret)        {            if ((errno == EAGAIN) || (errno == EINTR))            {                ret = 0;                continue;            }            //EWOULDBLOCK用于非阻塞模式,不需要重新读或者写            else if (errno == EWOULDBLOCK)           {               break;           }           //异常断开            else            {                close(fd);                event_free(ev);                break;            }        }        //接收到主动关闭请求        if (0 == ret)        {            close(fd);            event_free(ev);            break;        }        pos += ret;    } while (pos《 response.data.length());          }

Markdown在代码块中使用”<”老是造成后面截断,所以这里使用了”《”来代替

1 0
原创粉丝点击