unix 网路编程(卷一)第一个程序编译过程

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)