Unix Network Programming习题作业集

首先是安装书上体统的源码根据它提供的readme进行安装,基本上没有问题。

1. 进入src目录

./configure

进行配置

2. 进入lib文件夹,编译基本函数

make

3. 进入libfree文件夹,编译基本函数库

make

4. 进入intro文件夹,编译源码

进行测试

wang@wang:~/Desktop/unpv13e/intro$ ./daytimetcpcli 127.0.0.1
Sun Aug 20 09:24:41 2017
表示已经成功,记得开启./daytimecpcsrv服务。


第一部分 Introduction and TCP/IP

第一章 Introduction

1. Deciding that the client always initiates(发起) requests tends to simplify the protocol as well as the programs themselves.

2. The client application and the server application may be thought of as communicating via a network protocol, but actually multiple layers of network protocols are typically involved.

3. 举例

The client establishes a TCP connection with a server and the server simply sends back the current time and date in human-readable format.

4. The socket function create an Internet (AF_INET) stream (SOCK_STREAM) socket, which is fancy name for a TCP socket.

5. We fill in an Internet socket address structure (a sockaddr_in structure named servaddr) with the server's IP address and port number.

6. htons to cenvert the binary port number.

7. The connect function, when applied to the TCP socket, establishes a TCP connection with the server specified by the socket address structure pointed to by the second argument.

完整的客户端程序如下

#include "unp.h"

int main(int argc, char **argv) {
	int sockfd, n;
	struct sockaddr_in servaddr;
	char recvline[MAXLINE+1];
	if (argc != 2) {
		err_quit("usage: argv[0] <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);
	if (inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0)
		err_quit("inet_pton error for %s", argv[1]);
	
	// #define SA struct sockaddr
	if (connect(sockfd, (SA *) &servaddr, sizeof(servaddr)) < 0) 
		err_sys("connect error");
	
	while ((n = read(sockfd, recvline, MAXLINE)) > 0) {
		recvline[n] = 0;
		if (fputs(recvline, stdout) == EOF)
			err_sys("fputs error");
	}
	if (n < 0)
		err_sys("read error");
	exit(0);
}
建立socket, 创建sockaddr_in结构体,绑定连接,读取数据写入到终端,结束完成。

8. IPv6结构

#include	"unp.h"

int
main(int argc, char **argv)
{
	int					sockfd, n;
	struct sockaddr_in6	servaddr;
	char				recvline[MAXLINE + 1];

	if (argc != 2)
		err_quit("usage: a.out <IPaddress>");

	if ( (sockfd = socket(AF_INET6, SOCK_STREAM, 0)) < 0)
		err_sys("socket error");

	bzero(&servaddr, sizeof(servaddr));
	servaddr.sin6_family = AF_INET6;
	servaddr.sin6_port   = htons(13);	/* daytime server */
	if (inet_pton(AF_INET6, argv[1], &servaddr.sin6_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);
}

9. 使用包裹函数简化错误处理

int Socket(int family, int type, int protocol) {
    int n;
    if ((n = socket(family, type, protocol)) < 0)
	err_sys("socket error");
    return n;
}
10. 错误处理

When an error occurs in a Unix function, the global variable errno is set to a positive value indicating the type of error and the function normally returns -1.

Our err_sys function looks at the value of errno and prints the corresponding error message string.

11. 创建一个服务器程序步骤

1. create a TCP socket

2. Bind server's well-known port to socket

3. Convert socket to listening socket

12. Normally, the server process is put to sleep in the call to accept, waiting for a client connection to arrive and be accepted.

A TCP connection uses what is called a three-way handshake to establish a connection. When this handshake completes, accept returns, and the return vlaue from the function is a new descriptor (connfd) that is called the connected descriptor.

#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);
    }
}
The server closes its connection with the client by calling close.

This initiates the normal TCP connection termination sequence: a FIN is sent in each direction and each FIN is acknowledged by the other end.

13. 常用unit命令

wang@wang:~$ netstat -ni
Kernel Interface table
Iface   MTU Met   RX-OK RX-ERR RX-DRP RX-OVR    TX-OK TX-ERR TX-DRP TX-OVR Flg
eth0       1500 0     62894      0      0 0         56402      0      0      0 BMRU
lo        65536 0    133888      0      0 0        133888      0      0      0 LRU

netstat -nr

ifconfig eth0

ping -b 206.168.112.127

习题

1.1 尝试常用的命令

1.2 编译书上的示例

1.3 连接错误

1.4 read的次数

 22     int count = 0;
 23     while ((n = read(sockfd, recvline, MAXLINE)) > 0) {
 24         if (n > 0) count++;
 25         recvline[n] = 0;
 26         if (fputs(recvline, stdout) == EOF)
 27             err_sys("fputs error");
 28     }
 29     printf("count = %d\n", count);
wang@wang:~/Desktop/unpv13e/intro$ ./sample 127.0.0.1
Sun Aug 20 11:37:16 2017
count = 1

1.5 单个字符写出

 28         // Write(connfd, buff, strlen(buff));
 29         int i;
 30         for (i = 0; i < strlen(buff); i++) {
 31             Write(connfd, &buff[i], 1);
 32         }





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
UNIX Network Programming Volume 2》(Unix网络编程卷2英文版,djvu格式,带绿色小巧的阅读器) 原书名: UNIX Network Programming Volume 2:Interprocess Communications 2nd ed. 原出版社: Prentice Hall/Pearson 作者: W.Richard Stevens preface part 1. introduction chapter 1. introduction 1.1 introduction 3 1.2 processes, threads, and the sharing of information 5 1.3 persistence of ipc objects 6 1.4 name spaces 7 1.5 effect of fork, exec, and exit on ipc objects 9 1.6 error handling: wrapper functions 11 1.7 unix standards 13 1.8 road map to ipc examples in the text 15 1.9 summary 16 chapter 2. posix ipc 2.1 introduction 19 2.2 ipc names 19 2.3 creating and opening ipc channels 22 2.4 ipc permissions 25 2.5 summary 26 .chapter 3. system v ipc 3.1 introduction 27 3.2 key_t keys and ftok function 28 3.3 ipc_perm structure 30 3.4 creating and opening ipc channels 30 3.5 ipc permissions 32 3.6 identifier reuse 34 3.7 ipcs and ipcrm programs 36 3.8 kernel limits 36 3.9 summary 38 part 2. message passing chapter 4. pipes and fifos 4.1 introduction 43 4.2 a simple client--server example 43 4.3 pipes 44 4.4 full-duplex pipes 50 4.5 popen and pc1ose functions 52 4.6 fifos 54 4.7 additional properties of pipes and fifos 58 4.8 one server, multiple clients 60 4.9 iterative versus concurrent servers 66 4.10 streams and messages 67 4.11 pipe and fifo limits 72 4.12 summary 73 chapter 5. posix message oueues 5.1 introduction 75 5.2 mq_open, mq_c1ose, and mq_un1ink functions 76 5.3 mq_getattr and mq_setattr functions 79 5.4 mq_send and mq_receive functions 82 5.5 message queue limits 86 5.6 mq_notify function 87 5.7 posix realtime signals 98 5.8 implementation using memory-mapped i/o 106 5.9 summary 126 chapter 6. system v message queues 6.1 introduction 129 6.2 msgget function 130 6.3 msgsnd function 131 6.4 msgrcv function 132 6.5 msgctl function 134 6.6 simple programs 135 6.7 client-server example 140 6.8 multiplexing messages 142 6.9 message queues w
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值