為使主程式具有可讀性,將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 ...