`
lianhuaren
  • 浏览: 1537 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

unp学习01

 
阅读更多
图5.12为tcp服务器的最终(正确)版本。它是并发服务器。关于并发服务器,可参考:
4.7 fork and exec Functions,
4.8 Concurrent Servers,
5.8 POSIX Signal Handling,
5.9 Handling SIGCHLD Signals,
5.10 wait and waitpid Functions

程序在accept后处理了EINTR错误,以及在str_echo函数中使用了3.9封装的Readline,Writen函数。

图4.1:


tcpcliserv/tcpserv04.c代码如下:

#include	"unp.h"

int
main(int argc, char **argv)
{
	int					listenfd, connfd;
	pid_t				childpid;
	socklen_t			clilen;
	struct sockaddr_in	cliaddr, servaddr;
	void				sig_chld(int);

	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(SERV_PORT);

	Bind(listenfd, (SA *) &servaddr, sizeof(servaddr));

	Listen(listenfd, LISTENQ);

	Signal(SIGCHLD, sig_chld);	/* must call waitpid() */

	for ( ; ; ) {
		clilen = sizeof(cliaddr);
		if ( (connfd = accept(listenfd, (SA *) &cliaddr, &clilen)) < 0) {
			if (errno == EINTR)
				continue;		/* back to for() */
			else
				err_sys("accept error");
		}

		if ( (childpid = Fork()) == 0) {	/* child process */
			Close(listenfd);	/* close listening socket */
			str_echo(connfd);	/* process the request */
			exit(0);
		}
		Close(connfd);			/* parent closes connected socket */
	}
}
  • 大小: 31.3 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics