unix网络编程各种TCP客户-服务器程序设计实例附环境搭建和编译方法(一)

本文总结了《UNIX网络编程》中的TCP客户-服务器程序设计,包括迭代和并发服务器。详细介绍了环境搭建步骤,涉及配置、编译及静态库的使用。同时还讨论了TCP并发服务器的实现,包括回射服务器和使用select/poll的服务器程序,并解释了shutdown与close的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言:在以前的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两个文件到同一个目录下;

执行下面的命令:

生成了server和client程序,运行server和client程序如下图,顺利成功:
 

第二种:TCP并发服务器程序,每个客户一个子进程

每个客户一个子进程:传统上,并发服务器调用fork派生一个子进程来处理每个客户。这使得服务器可在同一时间为多个客户提供服务。

回射服务器:

1, 客户从标准输入读一行文本,写到服务器上;

2, 服务器从网络输入读此行,并回射给客户;

3, 客户度此回射行并写到标准输出;

#include	"unp.h"

void
sig_chld(int signo)
{
	pid_t	pid
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值