socket錯誤處理函式的封裝

2021-08-19 08:11:41 字數 2766 閱讀 7530

為使主程式具有可讀性,將socket相關的系統函式的錯誤處理封裝成乙個wrap.c

wrap.c

#include #include #include /* 列印錯誤原因並退出 */

void perr_exit(const char *s)

/* accept出錯封裝 */

int accept(int fd, struct sockaddr *sa, socklen_t *salenptr)

return n;

}/* 繫結ip、埠號和socket,出錯則返回錯誤資訊 */

void bind(int fd, const struct sockaddr *sa, socklen_t salen)

/* 客戶機連線伺服器函式封裝,錯誤則列印出錯資訊 */

void connect(int fd, const struct sockaddr *sa, socklen_t salen)

/* listen函式出錯處理封裝 */

void listen(int fd, int backlog)

/* 建立套接字socket出錯處理封裝 */

int socket(int family, int type, int protocol)

/* read函式出錯處理封裝 */

ssize_t read(int fd, void *ptr, size_t nbytes)

return n;

}/* write函式出錯處理封裝 */

ssize_t write(int fd, const void *ptr, size_t nbytes)

return n;

}/* close關閉檔案出錯處理封裝 */

void close(int fd)

/* 至少讀滿n個字元再返回 */

ssize_t readn(int fd, void *vptr, size_t n)

else if (nread == 0)//訊號中斷 或 讀到空 則退出

break;

nleft -= nread;//記錄每次讀完,還剩的未讀的位元組數

ptr += nread; //為將下一次讀到的值補充到這次的末尾做準備

}return n - nleft; //返回已讀到的位元組數

}/* 寫滿n個字元才返回 */

ssize_t writen(int fd, const void *vptr, size_t n)

nleft -= nwritten; //寫完這次之後,剩下還要寫的位元組個數

ptr += nwritten; //寫完這次之後,從這次的末尾繼續寫

}return n;

}/*返回第一次呼叫時字串的乙個字元,呼叫一次返回下乙個字元,供下面的函式呼叫*/

/* fd為要讀的檔案 ptr為要返回的字元(為傳出引數) */

static ssize_t my_read(int fd, char *ptr)

else if (read_cnt == 0)//如果讀到的位元組數為0(即讀到的檔案為空)

return 0;

/* 否則有讀到內容 則將讀指標指向該字串的首部 */

read_ptr = read_buf;

}//返回當前指向的字元,之後指向下乙個字元,供下一呼叫時使用

*ptr = *read_ptr++;

read_cnt--;//剩下待返回的字串的長度減一

return 1;//呼叫成功返回1

}/* 一次讀一行 */

ssize_t readline(int fd, void *vptr, size_t maxlen)

else if (rc == 0)//如果讀完了就返回讀到的位元組數

else

return -1;

}*ptr = 0;

return n;

}

標頭檔案 wrap.h

#ifndef __wrap_h_

#define __wrap_h_

void perr_exit(const char *s);

int accept(int fd, struct sockaddr *sa, socklen_t *salenptr);

void bind(int fd, const struct sockaddr *sa, socklen_t salen);

void connect(int fd, const struct sockaddr *sa, socklen_t salen);

void listen(int fd, int backlog);

int socket(int family, int type, int protocol);

ssize_t read(int fd, void *ptr, size_t nbytes);

ssize_t write(int fd, const void *ptr, size_t nbytes);

void close(int fd);

ssize_t readn(int fd, void *vptr, size_t n);

ssize_t writen(int fd, const void *vptr, size_t n);

static ssize_t my_read(int fd, char *ptr);

ssize_t readline(int fd, void *vptr, size_t maxlen);

#endif

MySql錯誤處理 錯誤處理的例子

有幾種錯誤處理的宣告形式 如果任何錯誤 不是 not found 設定 l error 為 1 後繼續執行 declare continue handler for sqlexception set l error 1 如果發生任何錯誤 不是 not found 執行 rollback和產生一條錯誤...

MySql錯誤處理(三) 錯誤處理的例子

mysql錯誤處理 三 錯誤處理的例子 有幾種錯誤處理的宣告形式 如果任何錯誤 不是 not found 設定 l error 為 1 後繼續執行 declare continue handler for sqlexception set l error 1 如果發生任何錯誤 不是 not foun...

Linux C函式之錯誤處理函式

錯誤處理函式 3 ferror 檢查檔案流是否有錯誤發生 標頭檔案 stdio.h 函式定義 int ferror file stream 說明 ferror 用來檢查引數stream所指定的檔案流是否發生了錯誤情況,若有則返回非0值.perror 列印出錯誤原因資訊字串 標頭檔案 stdio.h ...