环境搭建

参考:http://blog.csdn.net/pdcxs007/article/details/43735975
参考:http://www.cnblogs.com/youxin/p/3931555.html

今天开始拜读《Unix网络编程》。找到的源代码在Linux下有各种问题,最后决定还是自己从头写比较好。
从第一个时间服务程序开始学习。今天先看一下主要的头文件的作用。
在common.h中(参照 unp.h 自己写的,包含常用头文件和一些常量定义,用着方便),有以下的头文件:
sys/types.h
此头文件是系统类型的定义,如:int8_t int16_t int32_t int64_t等等
sys/socket.h
这是socket的接口,在其中引入bits/socket.h,其中定义了各种常量。
netinet/in.h
定义了各种地址结构体和常量。
arpa/inet.h
定义了地址转换的函数。
其它的头文件是常用头文件。还有一些常数定义以及结构体的简称。以后会随时添加。
在error.c和error.h中,声明和定义了常用的错误输出。
目录结构为下图所示:



以下是源程序:
daytimecpcli.c:

[cpp]
#include "common.h"
#include "error.h"
int main(int argc, char **argv)
{
int sockfd, n;
char recvline[MAXLINE + 1];
struct sockaddr_in servaddr;

if (argc != 2)  
    err_quit("usage: ./daytimecpcli.c <IP address>");  
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)  
    err_sys("socket error");  

memset(&servaddr, 0, sizeof(servaddr));  
servaddr.sin_family = AF_INET;  
servaddr.sin_port   = htons(IPPORT_DAYTIME);  

if (inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0)  
    err_quit("inet_pton error for %s", argv[1]);  

if (connect(sockfd, (SA *) &servaddr, sizeof(servaddr)) < 0)  
    err_sys("connect error");  

while ((n = read(sockfd, recvline, MAXLINE)) > 0)  
{  
    recvline[n] = 0;  
    if (fputs(recvline, stdout) == EOF)  
        err_sys("fputs error");  
}  
if (n < 0)  
    err_sys("read error");  

exit(0);  

}

common.h:
#ifndef __COMMON_H
#define __COMMON_H

#include <sys/types.h>  
#include <sys/socket.h>  
#include <netinet/in.h>  
#include <arpa/inet.h>  

#include <string.h>  
#include <stdio.h>  
#include <stdlib.h>  
#include <unistd.h>  

#define MAXLINE 4096  
#define SA struct sockaddr  

#endif  

error.h:
#ifndef __MYERROR_H
#define __MYERROR_H

#include <stdio.h>  
#include <stdlib.h>  

void err_ret(const char *fmt, ...);  
void err_sys(const char *fmt, ...);  
void err_dump(const char *fmt, ...);  
void err_msg(const char *fmt, ...);  
void err_quit(const char *fmt, ...);  
 #endif  

error.c:
#include <errno.h> /* for definition of errno /
#include <stdarg.h> /
ANSI C header file */
#include "error.h"
#include "common.h"

static void err_doit(int, const char *, va_list);  

void err_ret(const char *fmt, ...)  
{  
va_list ap;  

va_start(ap, fmt);  
err_doit(1, fmt, ap);  
va_end(ap);  

return;  
}  

void err_sys(const char *fmt, ...)  
{  
 va_list ap;  

va_start(ap, fmt);  
err_doit(1, fmt, ap);  
va_end(ap);  

exit(1);  
}  

void err_dump(const char *fmt, ...)  
{  
va_list ap;  

va_start(ap, fmt);  
err_doit(1, fmt, ap);  
va_end(ap);  

abort();  
exit(1);  
 }  

 void err_quit(const char *fmt, ...)  
{  
va_list ap;  

va_start(ap, fmt);  
err_doit(0, fmt, ap);  
va_end(ap);  

exit(1);  
}  

void err_msg(const char *fmt, ...)  
{  
va_list ap;  

va_start(ap, fmt);  
err_doit(0, fmt, ap);  
va_end(ap);  

return;  
}  

static void err_doit(int errnoflag, const char *fmt, va_list ap)  
{  
int errno_save;  
char buf[MAXLINE];  

errno_save = errno;  
vsprintf(buf, fmt, ap);  
if (errnoflag)  
    sprintf(buf+strlen(buf), ": %s", strerror(errno_save));  
strcat(buf, "\n");  
fflush(stdout);  
fputs(buf, stderr);  
fflush(stderr);  

return;  
}  

我将error.c制作成了名为liberr.a的静态库,为以后连接方便做准备。所以,sock目录下的Makefile内容如下:

 all: liberr.a  

 liberr.a: liberr.o  
     ar rv liberr.a liberr.o  
 liberr.o: error.c error.h common.h  
 gcc error.c -c -o liberr.o  

 clean:  
 rm -rf *.o *.a  

intro目录下的Makefile内容如下:

 targets = daytimecpcli  
 cc = gcc  
 INCLUDES = -I"../sock/"  
 LIBS = -L"../sock/"  
 all: $(targets)  
 daytimecpcli: daytimecpcli.c ../sock/liberr.a  
 $(cc) -o daytimecpcli daytimecpcli.c $(LIBS) -lerr $(INCLUDES)  
 ../sock/liberr.a: ../sock/error.c ../sock/error.h ../sock/common.h  
 cd ../sock && make  
clean:  
     rm -rf $(targets) *.o  

在打开书上的程序daytimetcpsrv时,程序执行效果如下:


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,406评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,732评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,711评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,380评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,432评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,301评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,145评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,008评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,443评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,649评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,795评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,501评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,119评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,731评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,865评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,899评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,724评论 2 354

推荐阅读更多精彩内容

  • 本文作者 Jinkey(微信公众号 jinkey-love,官网 https://jinkey.ai)原文链接 h...
    JinkeyAI阅读 425,593评论 152 921
  • 系统环境 所需软件官方下载地址: 一、 安装开发包环境: 二、 关闭iptables和Selinux(生产...
    莫名其妙的一生阅读 1,300评论 0 4
  • 操作系统是Deepin 15 amd64 安装g++环境 sudo apt-get install g++ 运行g...
    KevinCool阅读 4,612评论 3 1
  • 凌晨四点半,下起了清明节的第一场雨,屋外的如同明镜的池塘被击的支离破碎,如果有可能,我会在家乡屋旁的池塘里种上几...
    顾长旭阅读 364评论 0 1
  • 读三重门 刚开始听到这部小说是批判应试教育的,我就来了兴趣,我对应试教育是起不了任何好感的,当然,这样说也稍微委婉...
    幻梦尘客阅读 382评论 0 0