socket編程04: 錯誤處理和讀寫控制

原生的API中沒有進行錯誤處理以及讀寫控制,在此我們將其封裝:

#pragma once
#include <stdlib.h>
#include <errno.h>
#include <sys/socket.h>
#include <cstdio>
#include <error.h>
#include <zconf.h>

namespace wrap
{
void wrap_perr_exit(const char* str)
{
    perror(str);
    exit(1);
}

int wrap_accept(int fd, struct sockaddr *sockaddr_, socklen_t *socklen_)
{
    while (true)
    {
        int n = accept(fd, sockaddr_, socklen_);
        if(n < 0)
        {
            if( (errno == ECONNABORTED) || (errno == EINTR))
                continue;
            else
                perror("accept error");
        }
        else
            return n;
    }
}

void wrap_bind(int fd, const struct sockaddr *sockaddr_, socklen_t socklen_)
{
    if(bind(fd, sockaddr_, socklen_) < 0)
        perror("bind error");
}

void wrap_connect(int fd, const struct sockaddr *sockaddr_, socklen_t socklen_)
{
    if(connect(fd, sockaddr_, socklen_) < 0)
        perror("connect error");
}

void wrap_listen(int fd, int backlog)
{
    if(listen(fd, backlog) < 0)
        perror("listen error");
}

int wrap_socket(int family, int type, int protocol)
{
    int n = socket(family, type, protocol);
    if(n < 0)
        perror("socket error");
    return n;
}

ssize_t wrap_read(int fd, void *ptr, size_t n_bytes)
{
    while (true)
    {
        ssize_t n = read(fd, ptr, n_bytes);
        if(n == -1)
        {
            if(errno == EINTR)
                continue;
            else
                return -1;
        }
        else
            return n;
    }
}

ssize_t wrap_write(int fd, const void *ptr, size_t n_bytes)
{
    while(true)
    {
        ssize_t n = write(fd, ptr, n_bytes);
        if(n == -1)
        {
            if(errno == EINTR)
                continue;
            else
                return -1;
        }
        else
            return n;
    }
}

void wrap_close(int fd)
{
    int n = close(fd);
    if(n == -1)
        perror("close error");
}

ssize_t wrap_read_n(int fd, void *vptr, size_t n)
{
    size_t nleft = n;
    ssize_t nread;
    auto ptr = (char*) vptr;

    while(nleft > 0)
    {
        nread = read(fd, ptr, nleft);
        if(nread < 0)
        {
            if(errno == EINTR)
               nread = 0;
            else
                return -1;
        }
        else if(nread == 0)
            break;

        nleft -= nread;
        ptr += nread;
    }

    return n - nleft;
}

ssize_t wrap_write_n(int fd, const void *vptr, size_t n)
{
    size_t nleft = n;
    ssize_t nwritten;
    const char *ptr = (const char*) vptr;

    while(nleft > 0)
    {
        nwritten = write(fd, ptr, nleft);
        if(nwritten <= 0)
        {
            if(nwritten < 0 && errno == EINTR)
                nwritten = 0;
            else
                return -1;
        }
        nleft -= nwritten;
        ptr += nwritten;
    }
    return n;
}

}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末悠就,一起剝皮案震驚了整個濱河市千绪,隨后出現(xiàn)的幾起案子充易,更是在濱河造成了極大的恐慌梗脾,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件盹靴,死亡現(xiàn)場離奇詭異炸茧,居然都是意外死亡,警方通過查閱死者的電腦和手機稿静,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門梭冠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人改备,你說我怎么就攤上這事控漠。” “怎么了悬钳?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵盐捷,是天一觀的道長。 經(jīng)常有香客問我默勾,道長碉渡,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任母剥,我火速辦了婚禮滞诺,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘环疼。我一直安慰自己习霹,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布炫隶。 她就那樣靜靜地躺著序愚,像睡著了一般。 火紅的嫁衣襯著肌膚如雪等限。 梳的紋絲不亂的頭發(fā)上爸吮,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天,我揣著相機與錄音望门,去河邊找鬼形娇。 笑死,一個胖子當(dāng)著我的面吹牛筹误,可吹牛的內(nèi)容都是我干的桐早。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼哄酝!你這毒婦竟也來了友存?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤陶衅,失蹤者是張志新(化名)和其女友劉穎屡立,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體搀军,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡膨俐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了罩句。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片焚刺。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖门烂,靈堂內(nèi)的尸體忽然破棺而出乳愉,到底是詐尸還是另有隱情,我是刑警寧澤屯远,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布蔓姚,位于F島的核電站,受9級特大地震影響氓润,放射性物質(zhì)發(fā)生泄漏赂乐。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一咖气、第九天 我趴在偏房一處隱蔽的房頂上張望挨措。 院中可真熱鬧秃励,春花似錦是嗜、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽觉既。三九已至,卻和暖如春乳幸,著一層夾襖步出監(jiān)牢的瞬間瞪讼,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工粹断, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留符欠,地道東北人。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓瓶埋,卻偏偏與公主長得像希柿,于是被迫代替她去往敵國和親诊沪。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容

  • 1曾撤、通過CocoaPods安裝項目名稱項目信息 AFNetworking網(wǎng)絡(luò)請求組件 FMDB本地數(shù)據(jù)庫組件 SD...
    陽明先生_X自主閱讀 15,979評論 3 119
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,071評論 25 707
  • 啊端姚,孤莽浩蕩的北風(fēng)之神啊 請在這里,靜靜聆聽我的祈禱 : 愿你精致到老 眼里長著太陽 笑里全是坦蕩 風(fēng)里刮盡的全是...
    李夢生閱讀 134評論 0 3
  • 很多人都喜歡看日本動畫電影挤悉,小編也是其中之一的影迷渐裸。在2016年上映的電影《你的名字》之后,似乎日本動畫電影沉淀了...
    聲意小狐貍閱讀 464評論 1 0
  • 易程軒 生日:11月26日 身高:1米85 介紹:學(xué)霸尖啡、長得非常帥橄仆,暖男剩膘,有梨渦和虎牙衅斩,笑起來很好看。...
    胖甜閱讀 840評論 2 1