转载来自
http://awind.blog.51cto.com/4628868/861306
http://www.cnblogs.com/shenlian/archive/2011/08/19/2146190.html
是关于搭建环境的过程.
其实在第四步的1中,直接gedit就可以编辑,不非得用命令行,sudo gedit /lib/unp.h
以下是原作者的文章
要开始接触网络编程,用的是大名鼎鼎的Unix Network Programming这本书,第一个例子就遇到困难了,unp.h没有,到谷歌上搜索了一下,找到了一些方法。先下载unpv13e.tar.gz,
1.解压下载的unpv13e.tar.gz文件
- tar -zxvf unpv13e.tar.gz
2。终端中进入unpv13e目录(需要给configure文件增加x权限)
- ./configure
- cd lib
- make
- cd ../libfree # continue building the basic library
- make
然后在unpv13e文件夹中成功生成libunp.a文件
3.将生成的libunp.a静态库复制到/usr/lib/中
- cd ..
- sudo cp libunp.a /usr/lib
4,修改unp.h并将其和config.h拷贝到/usr/include中,为了以后include方便
- kate lib/unp.h //将unp.h中#include "../config.h"修改为#include "config.h"
- sudo cp lib/unp.h /usr/include
- sudo cp config.h /usr/include
这里复制到/usr/include目录后,非root用户无权查看,记得chmod 744 一下
我们现在来讲一个实例
首先在任意目录下
新建两个文件
server.c
#include "unp.h"
#include <time.h>
int
main(int argc, char **argv)
{
int listenfd, connfd;
struct sockaddr_in servaddr;
char buff[MAXLINE];
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); /* daytime server */
Bind(listenfd, (SA *) &servaddr, sizeof(servaddr));
Listen(listenfd, LISTENQ);
for ( ; ; )
{
connfd = Accept(listenfd, (SA *) NULL, NULL);
ticks = time(NULL);
snprintf(buff, sizeof(buff), "%.24s\r\n", ctime(&ticks));
Write(connfd, buff, strlen(buff));
Close(connfd);
}
}
client.c
#include "unp.h"
int
main(int argc, char **argv)
{
int sockfd, n;
char recvline[MAXLINE + 1];
struct sockaddr_in servaddr;
if (argc != 2)
err_quit("usage: a.out <IPaddress>");
if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
err_sys("socket error");
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(13); /* daytime server */
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, 4096)) > 0) {
recvline[n] = 0; /* null terminate */
if (fputs(recvline, stdout) == EOF)
{
err_sys("fputs error");
}
//printf("readed %d byte data\n", n);
}
if (n < 0)
err_sys("read error");
exit(0);
}
其实,我想用codeblock进行编译
但是会一直出现:
obj/Debug/main.o||In function `main':|
/home/lyle/cppproject/unixcode/main.cpp|12|undefined reference to `Socket(int, int, int)'|
/home/lyle/cppproject/unixcode/main.cpp|19|undefined reference to `Bind(int, sockaddr const*, unsigned int)'|
/home/lyle/cppproject/unixcode/main.cpp|21|undefined reference to `Listen(int, int)'|
/home/lyle/cppproject/unixcode/main.cpp|25|undefined reference to `Accept(int, sockaddr*, unsigned int*)'|
/home/lyle/cppproject/unixcode/main.cpp|29|undefined reference to `Write(int, void*, unsigned int)'|
/home/lyle/cppproject/unixcode/main.cpp|31|undefined reference to `Close(int)'|
||=== 已完成构建: 6 个错误, 0 个警告 ===|
原因是没有静态库,估计是这样的,
引用来自http://blog.csdn.net/jiao319/article/details/7752281
通常在一些项目中需要使用外部的头文件和静态库文件,codeblock通过如下方法添加头文件和库文件。
以codeblock 10.05为例
添加头文件:依次点击project->bulid options->Search directories,在该标签页中点击Compiler,单击Add按钮添加头文件路径
添加静态库路径:依次点击project->bulid options->Linker setting,在该标签页中点击Add按钮添加静态库路径。