TCP/IP网络编程 习题2

1. 什么是协议?在收发数据中定义协议有何意义?

协议是对话中使用的通信规则.定义协议可让计算机进行正确无误的对话.

2. 面向连接的TCP套接字传输特性有3点,请分别说明?

  1. 可靠性,传输的过程数据不会丢失
  2. 字节流,按序传输数据,不存在数据边界
  3. 面向连接,双方必须建立连接后,才可以进行数据传递

3. 下面哪些是面向消息的套接字特性?

  • 传输数据可能丢失 ***
  • 没有数据边界
  • 以快速传输为目标 ***
  • 不限制每次传递数据的大小
  • 与面向连接的数据不同,不存在连接的概念 ***

4. 下列数据适合用哪类套接字传输?

  • 演唱会现在直播的多媒体数据 --- (UDP,传输速度要快,对数据丢失有一定容忍度)
  • 某人压缩过的文本文件 --- (TCP,对数据丢失零容忍,使用具有可靠性的TCP传输方式)
  • 网上银行用户与银行之间的数据传递 --- (TCP)

5. 何种类型的套接字不存在数据边界?,这类套接字接受数据时需要注意什么?

TCP套接字不存在数据边界,套接字接受数据时会首先将数据存入由字节数组构成的缓冲区中,

如果读取速度小于写入速度,则缓冲区可能会被填满,此时传输端的套接字会停止传输,以防止数据丢失

6. 更改程序使server端多次传输数据,client端调用一次read函数进行读取

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <unistd.h>
 4 #include <string.h>
 5 #include <arpa/inet.h>
 6 #include <sys/types.h>
 7 #include <sys/socket.h>
 8 
 9 void error_exit(char* message);
10 
11 int main(int argc, char* argv[])
12 {
13     int serv_sock, clnt_sock;
14     struct sockaddr_in serv_addr, clnt_addr;
15     socklen_t clnt_addr_size;
16     char message[] = "hello,world";
17     int i = 0;
18 
19     if(argc != 2)
20     {
21         printf("Usage: %s <port>\n", argv[0]);
22         getchar();
23         exit(1);
24     }
25 
26     serv_sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
27     if(serv_sock == -1)
28         error_exit("serv_sock() error!\n");
29     
30     memset(&serv_addr, 0, sizeof(serv_addr));
31     serv_addr.sin_family = AF_INET;
32     serv_addr.sin_port = htons(atoi(argv[1]));
33     serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
34 
35     if(bind(serv_sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) == -1)
36         error_exit("bind() error!\n");
37     
38     if(listen(serv_sock, 5) == -1)
39         error_exit("listen() error!\n");
40     
41     clnt_addr_size = sizeof(clnt_addr);
42     if((clnt_sock = accept(serv_sock, (struct sockaddr*)&clnt_addr, &clnt_addr_size)) == -1)
43         error_exit("accept() error!\n");
44     
45     while(write(clnt_sock, &message[i++], 1) != -1);
46 
47     close(serv_sock);
48     close(clnt_sock);
49     return 0;
50 };
51 
52 void error_exit(char* message)
53 {
54     fputs(message, stderr);
55     fputc('\n', stderr);
56     exit(1);
57 }
serv_scok
 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <unistd.h>
 4 #include <string.h>
 5 #include <arpa/inet.h>
 6 #include <sys/types.h>
 7 #include <sys/socket.h>
 8 
 9 #define BUF_SIZE 1024
10 
11 void error_exit(char* message);
12 
13 int main(int argc, char* argv[])
14 {
15     int sock;
16     struct sockaddr_in sock_addr;
17     char buf[BUF_SIZE];
18     int str_len;
19 
20     if(argc != 3)
21     {
22         printf("Usage: %s <ip> <port>\n", argv[0]);
23         getchar();
24         exit(1);
25     }
26 
27     sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
28     if(sock == -1)
29         error_exit("socket() error!\n");
30     
31     memset(&sock_addr, 0, sizeof(sock_addr));
32     sock_addr.sin_family = AF_INET;
33     sock_addr.sin_port = htons(atoi(argv[2]));
34     sock_addr.sin_addr.s_addr = inet_addr(argv[1]);
35 
36     if(connect(sock, (struct sockaddr*)&sock_addr, sizeof(sock_addr)) == -1)
37         error_exit("connect() error!\n");
38     
39     sleep(2);
40 
41     str_len = read(sock, &buf, BUF_SIZE-1);
42     if(str_len == -1)
43         error_exit("read() error!\n");
44     
45     printf("Message From Server: %s\n", buf);
46     close(sock);
47 
48     return 0;
49 }
50 
51 void error_exit(char* message)
52 {
53     fputs(message, stderr);
54     fputc('\n', stderr);
55     getchar();
56     exit(1);
57 }
clnt_sock

猜你喜欢

转载自www.cnblogs.com/liqaing1992/p/9398599.html