标签:字节流 erro -- ror a.out strlen 进制 错误信息 quit
1 #include "unp.h" 2 3 int main(int argc, char **argv) 4 { 5 int sockfd, n; 6 char recvline[MAXLINE + 1]; 7 struct sockaddr_in servaddr; 8 9 if (argc != 2) 10 { 11 err_quit("usage: a.out <IPaddress>"); 12 } 13 if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) 14 { 15 err_sys("socket error"); 16 } 17 18 bzero(&servaddr, sizeof(servaddr)); 19 servaddr.sin_family = AF_INET; 20 servaddr.sin_port = htons(13); 21 if (inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0) 22 { 23 err_quit("inet_pton error for %s", argv[1]); 24 } 25 if (connect(sockfd, (SA *)&servaddr, sizeof(servaddr)) < 0) 26 { 27 err_sys("connect error"); 28 } 29 30 while ((n = read(sockfd, recvline, MAXLINE)) > 0) 31 { 32 recvline[n] = 0; 33 if (fputs(recvline, stdout) == EOF) 34 { 35 err_sys("fputs error"); 36 } 37 } 38 if (n < 0) 39 { 40 err_sys("read error"); 41 } 42 }
对于每个函数调用,都必须检查是否返回错误。当发生错误时,就使用函数输出错误信息并终止程序运行。通过定义包裹函数来完成实际的函数调用,检查返回值,并在发生错误时终止程序。如:
int Socket(int family, int type, int protocol) { int n; if((n = socket(family, type, protocol)) < 0) err_sys("socket error"); return n; }
#include "unp.h" #include <time.h> int main(int argc, char* argv[]) { int listenfd, connfd; struct sockaddr_in servaddr; char buff[MAXLINE + 1]; time_t ticks; listenfd = Socket(AF_INET, SOCK_STREAM, 0); bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl(INADDR_ANY); servaddr.sin_port = htons(13); Bind(listenfd, (SA*)&servaddr, sizeof(servaddr)); Listen(listenfd, LISTENQ); while(1) { connfd = Accept(listenfd, NULL, NULL); ticks = time(NULL); snprintf(buff, sizeof(buff), "%.24s\r\n", ctime(&ticks)); Write(connfd, buff, strlen(buff)); Close(connfd); } }
标签:字节流 erro -- ror a.out strlen 进制 错误信息 quit
原文地址:https://www.cnblogs.com/hlk09/p/10356967.html