unix卷一去年暑假买的到现在才开始看无比惭愧,而且惭愧第一个程序就断断续续弄了几天,要好好写程序了,马上要找工作了,下面介绍下把本书第一个程序跑起来的过程:

搜各种博客

我用系统的是ubuntu 13.04

感谢风无语大神的blog:传送门 以后也要坚持记录自己遇到的各种问题以及解决他们的方法,当我们新接触一个领域时,往往在入门问题上耽误了好多时间,我按照风无语大神的方法一切准备好后,还是有问题

kapop@kapop:~/cpp$ g++ a.cpp -o a -lunp
/tmp/cczLHmnw.o:在函数‘main’中:
a.cpp:(.text+0x30):对‘err_quit(char const*, ...)’未定义的引用
a.cpp:(.text+0x67):对‘err_sys(char const*, ...)’未定义的引用
a.cpp:(.text+0xd9):对‘err_quit(char const*, ...)’未定义的引用
a.cpp:(.text+0x108):对‘err_sys(char const*, ...)’未定义的引用
a.cpp:(.text+0x142):对‘err_sys(char const*, ...)’未定义的引用
a.cpp:(.text+0x181):对‘err_sys(char const*, ...)’未定义的引用
collect2: 错误: ld 返回 1
kapop@kapop:~/cpp$ g++ a.cpp unp.c -o a -lunp
kapop@kapop:~/cpp$ ./a 127.0.0.1
03 AUG 2013 15:53:32 CST

unp.c文件内容如下

#include	<errno.h>		/* for definition of errno */
#include <stdarg.h> /* ANSI C header file */
//#include "ourhdr.h"
#include "unp.h" static void err_doit(int, const char *, va_list); char *pname = NULL; /* caller can set this from argv[0] */ /* Nonfatal error related to a system call.
* Print a message and return. */ void
/* $f err_ret $ */
err_ret(const char *fmt, ...)
{
va_list ap; va_start(ap, fmt);
err_doit(1, fmt, ap);
va_end(ap);
return;
} /* Fatal error related to a system call.
* Print a message and terminate. */ void
/* $f err_sys $ */
err_sys(const char *fmt, ...)
{
va_list ap; va_start(ap, fmt);
err_doit(1, fmt, ap);
va_end(ap);
exit(1);
} /* Fatal error related to a system call.
* Print a message, dump core, and terminate. */ void
/* $f err_dump $ */
err_dump(const char *fmt, ...)
{
va_list ap; va_start(ap, fmt);
err_doit(1, fmt, ap);
va_end(ap);
abort(); /* dump core and terminate */
exit(1); /* shouldn't get here */
} /* Nonfatal error unrelated to a system call.
* Print a message and return. */ void
/* $f err_msg $ */
err_msg(const char *fmt, ...)
{
va_list ap; va_start(ap, fmt);
err_doit(0, fmt, ap);
va_end(ap);
return;
} /* Fatal error unrelated to a system call.
* Print a message and terminate. */ void
/* $f err_quit $ */
err_quit(const char *fmt, ...)
{
va_list ap; va_start(ap, fmt);
err_doit(0, fmt, ap);
va_end(ap);
exit(1);
} /* Print a message and return to caller.
* Caller specifies "errnoflag". */ static void
err_doit(int errnoflag, const char *fmt, va_list ap)
{
int errno_save;
char buf[MAXLINE]; errno_save = errno; /* value caller might want printed */
vsprintf(buf, fmt, ap);
if (errnoflag)
sprintf(buf+strlen(buf), ": %s", strerror(errno_save));
strcat(buf, "\n");
fflush(stdout); /* in case stdout and stderr are the same */
fputs(buf, stderr);
fflush(stderr); /* SunOS 4.1.* doesn't grok NULL argument */
return;
}

a.cpp如下所示

#include "unp.h"
#include<iostream>
#include<algorithm>
#include<string>
#include<cstdlib>
using namespace std;
int main(int argc, char **argv){
int sockfd, n;
char recvline[MAXLINE + 1];
struct sockaddr_in servaddr;
if (argc != 2) {
// cout << "ni mei can shu shao le!" << endl;
err_quit("usage: a.out <IPaddress>");
}
if ( (sockfd = socket(AF_INET, SOCK_STREAM,0)) < 0) {
// cout << "Fuck ing life ! " << endl;
err_sys("socket error");
}
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(13);
if (inet_pton(AF_INET,argv[1],&servaddr.sin_addr) <= 0) {
//cout << "inet_pton error for" <<endl;
err_quit("inet_pton error for %s",argv[1]);
}
if (connect(sockfd,(SA *) &servaddr,sizeof(servaddr)) <0) {
/*cout << "connect error"<< endl ;*/
err_sys("connect error");
}
while( (n = read(sockfd, recvline, MAXLINE)) >0 ){
recvline[n]=0;
if (fputs(recvline,stdout) == EOF) {
//cout << "Fputs error" << endl ;
err_sys("fputss error");
}
}
if (n < 0 ) {
//cout << "read error" <<endl;
err_sys("read error");
}
exit(0);
//return 0;
}

感谢互联网的共享精神,感谢记录问题并提供解决方法的大神,让我等*nix菜鸟取得进步。

unix 网路编程(卷一)第一个程序编译过程的更多相关文章

  1. Unix网络编程--卷一:套接字联网API

    UNIX网络编程--卷一:套接字联网API 本书面对的读者是那些希望自己编写的程序能够使用成为套接字(socket)的API进行彼此通信的人. 目录: 0.准备环境 1.简介 2.传输层:TCP.UD ...

  2. 李洪强漫谈iOS开发[C语言-004]-开发概述程序设计语言程序编译过程

    汇编语言 指令用特定的名字来标记,这就是汇编语言 人比较容易看懂汇编语言 汇编直接和程序一一对应的 有汇编器把程序翻译成机器码 把高级语言编译成计算机识别的语言 程序编译过程 命令行 UNIX 系统中 ...

  3. Linux/Unix系统编程手册 第一章:历史和标准

    Unix的开发不受控于某一个厂商或者组织,是由诸多商业和非商业团体共同贡献进行演化的.这导致两个结果:一是Unix集多种特性于一身,二是由于参与者众多,随着时间推移,Unix实现方式逐渐趋于分裂. 由 ...

  4. Linux上安装GO开发环境+第一个程序编译运行

    首先官网下载包: 使用wget命令下载到自己的目录里 wget https://dl.google.com/go/go1.13.4.linux-amd64.tar.gz 解压: tar -xvf go ...

  5. C程序编译过程浅析

    前几天看了<程序员的自我修养——链接.装载与库>中的第二章“编译和链接”,主要根据其中的内容简单总结一下C程序编译的过程吧. 我现在一般都是用gcc,所以自然以GCC编译hellworld ...

  6. C程序编译过程

    1.1程序被其他程序翻译成不同的格式 1.hello.c #include <stdio.h> int main() { printf("hello world\n") ...

  7. 【转】android程序编译过程

    现在很多人想对Android工程的编译和打包进行自动化,比如建立每日构建系统.自动生成发布文件等等.这些都需要我们对Android工程的编译和打包有一个深入的理解,至少要知道它的每一步都做了什么,需要 ...

  8. C程序编译过程浅析(转)

    前几天看了<程序员的自我修养——链接.装载与库>中的第二章“编译和链接”,主要根据其中的内容简单总结一下C程序编译的过程吧. 我现在一般都是用gcc,所以自然以GCC编译hellworld ...

  9. C程序编译过程浅析【转】

    转自:http://blog.csdn.net/koudaidai/article/details/8092647 前几天看了<程序员的自我修养——链接.装载与库>中的第二章“编译和链接” ...

随机推荐

  1. Java [Leetcode 292]Nim Game

    问题描述: You are playing the following Nim Game with your friend: There is a heap of stones on the tabl ...

  2. Struts2的struts.properties文件在哪儿啊?

    老师教我们Struts2的时候叫我们建了个Struts.xml文件啊?那struts.properties呢?不需要吗? 回答1: struts.properties 是可以不要的!!!因为 stru ...

  3. (十一)学习CSS之float属性

    参考:http://www.w3school.com.cn/cssref/pr_class_float.asp 定义和用法 float 属性定义元素在哪个方向浮动.以往这个属性总应用于图像,使文本围绕 ...

  4. u-boot 环境变量参数设置

    今天本来是烧写内核,结果一不小心把uboot也整不能用了,无奈之下只好重新烧个uboot,等都弄好以后,发现系统还是启动不了,原来是启动参数设置不对,于是找到了这篇文章,//是我添加的内容. 原文地址 ...

  5. CF 560e Gerald and Giant Chess

    题意:在h×w的棋盘中从左上角走到右下角,只能向右或向下走,有n个点不可以经过,一共有多少种方案. 解法:dp.先对点按横坐标排序(横坐标相等按纵坐标,也可以反过来)dp[i]表示不经过其他非法点走到 ...

  6. Selenium-Python学习——通过XPath定位元素

    用Xpath定位元素的方法总是记不住,经常要翻出各种文档链接参考,干脆把需要用到的内容整到这个笔记中方便查找. Xpath是在XML文档中定位节点的语言.使用 XPath 的主要原因之一是当想要查找的 ...

  7. MFC对话框

    创建对话框步骤: 第一,创建对话框资源,主要包括创建新的对话框模板.设置对话框属性和为对话框添加各种控件: 第二,生成对话框类,主要包括新建对话框类.添加控件变量和控件的消息处理函数等. 创建对话框类 ...

  8. python学习之copy模块

    Python中的对象之间赋值时是按引用传递的,如果需要拷贝对象,需要使用标准库中的copy模块. 1. copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象.2. copy.deepc ...

  9. Makefile.am讲解

    Makefile.am详解 实战Makefile.amMakefile.am是一种比Makefile更高层次的规则.只需指定要生成什么目标,它由什么源文件生成,要安装到什么目录等构成.表一列出了可执行 ...

  10. Python 同时for遍历多个列表

    a = range(3) b = range(3) [ (x, y) for x, y in zip(a, b) ] 结果: [ (0,0), (1,1), (2,2) ] 当然,如上可以推广到多个列 ...