《TCP IP网络编程》尹圣雨----4.第二章习题

来源:互联网 发布:视频后期制作的软件 编辑:程序博客网 时间:2024/06/07 00:03

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

协议使对话中使用的通信规则。在收发数据中定义协议,能够让计算机之间进行正确无误的对话,以此来交换数据。


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

a.可靠性,传输过程中数据不会消失。

b.字节流,按序传输数据,传输数据不存在数据边界。

c.面向连接,双方之间必须建立连接后,才可进行数据的传递。


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

a.传输数据可能丢失

b.没有数据边界(Boundary)

c.以快速传递为目标

d.不限制每次传递数据的大小

e.与面向连接的套接字不同,不存在连接的概念


a,c,e


(4)下列数据适合用哪些套接字传输?并给出原因。

a.演唱会现场直播的多媒体数据(UDP),传送这类数据需要速度快,对数据丢失有一定容忍度。

b.某人压缩过的文本文件(TCP),对数据丢失零容忍,所以必须使用具有可靠性的传输方式TCP。

c.网上银行用户与银行之间的数据传递(TCP),也是对数据丢失零容忍。


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

TCP套接字不存在数据边界。在接收数据时,需要保证在接收套接字的缓冲区填充满之时就从buffer里读取数据。也就是,在接收套接字内部,写入buffer的速度要小于读出buffer的速度。


(6)tcp_server.c和tcp_client.c中需要多次调用read函数读取服务器调用1次write函数传递的字符串。更改程序,使服务器端多次调用(次数自拟)write函数传输数据,客户端调用1次read函数进行读取。为达到这一目的,客户端需延迟调用read函数,因为客户端要等待服务器端传输所有数据。windows和linux都通过下列代码延迟read或recv函数的调用。

for(i=0;i<3000;i++)

printf("wait time %d \n",i);

让CPU执行多余任务以延迟代码运行的方式称为“Busy waiting”。使用得当即可推迟函数调用。


#include <stdio.h>#include <stdlib.h>#include <WinSock2.h>void ErrorHandling(char *message) {fputs(message, stderr);fputs("\n", stderr);exit(1);}int main(int argc, char * argv[]) {WSADATA wsaData;SOCKET hServSock, hClntSock;SOCKADDR_IN servAddr, clntAddr;int szClntAddr;char message[] = "Hello World!";if (argc != 2) {printf("Usage : %s <port>\n", argv[0]);exit(1);}if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)ErrorHandling("WSAStartup() error!");hServSock = socket(PF_INET, SOCK_STREAM, 0);if (hServSock == INVALID_SOCKET)ErrorHandling("socket() error!");memset(&servAddr, 0, sizeof(servAddr));servAddr.sin_family = AF_INET;servAddr.sin_addr.s_addr = htonl(INADDR_ANY);servAddr.sin_port = htons(atoi(argv[1]));if (bind(hServSock, (SOCKADDR *)&servAddr, sizeof(servAddr)) == SOCKET_ERROR)ErrorHandling("bind() error!");if (listen(hServSock, 5) == SOCKET_ERROR)ErrorHandling("listen() error!");szClntAddr = sizeof(clntAddr);hClntSock = accept(hServSock, (SOCKADDR*)&clntAddr, &szClntAddr);if (hClntSock == INVALID_SOCKET)ErrorHandling("accept() error!");//fputs("sending message...\n",stderr);for (int i = 0; i < strlen(message); i++) {send(hClntSock, &message[i], sizeof(message[i]), 0);printf("sending %c\n", message[i]);}send(hClntSock, &message[strlen(message)], sizeof(message[strlen(message)]), 0);closesocket(hClntSock);closesocket(hServSock);WSACleanup();return 0;}