前言:在以前的UNIX网络编程系列中我们介绍了有关网络编程的理论知识,本文将在其基础上总结《UNIX网络编程》上的9种不同的TCP客户程序设计例子,希望能给大家带来帮助。本文只介绍实例,相关的理论知识请参考《unix网络编程》或者本博文的http://blog.csdn.net/ts173383201/article/category/1213821系列;
在出代码之前,可能有很多同学遇到《UNIX网络编程》上的例子编译的问题,下面就先介绍网络编程上例子编译环境的搭建方法,这里先说明我们系统是ubuntu:
一,到http://download.csdn.net/detail/ts173383201/4505201去下载源代码,然后解压;
二,cd到你解压后的文件夹下,就是有configure的那个目录下,执行命令./configure;
三,执行cd lib跳到lib目录下,执行make命令,会在上层目录(就是刚才有configure那个目录)生成libunp.a文件
四,复制这个静态库libunp.a到/usr/lib/和/usr/lib64/中;
五,接下来在目录中找到unp.h和config.h,在以后的代码中我们都要用到这两个头文件,将他们复制到和我们的源代码同一个路径下;
这样我们的环境就搭建好了,是不是很简单啊,但是以后编译的时候在gcc的最后加上-lunp导入静态库就可以了。下面我们就来看这些例子:
第一种:TCP迭代服务器程序:迭代服务器总是在完全处理了一个客户的请求后才响应下一个客户的请求。
客户端程序:daytimetcpcli.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, MAXLINE)) > 0) {
recvline[n] = 0; /* null terminate */
if (fputs(recvline, stdout) == EOF)
err_sys("fputs error");
}
if (n < 0)
err_sys("read error");
exit(0);
}
服务器程序:daytimetcpsrv.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);
}
}
好,现在我们接着上面的步骤,将这两个源文件放到我们喜欢的目录下,再复制unp.h和config.h两个文件到同一个目录下;
执行下面的命令:
第二种:TCP并发服务器程序,每个客户一个子进程
每个客户一个子进程:传统上,并发服务器调用fork派生一个子进程来处理每个客户。这使得服务器可在同一时间为多个客户提供服务。
回射服务器:
1, 客户从标准输入读一行文本,写到服务器上;
2, 服务器从网络输入读此行,并回射给客户;
3, 客户度此回射行并写到标准输出;
#include "unp.h"
void
sig_chld(int signo)
{
pid_t pid