博客摘录「 TCP/IP网络编程——习题答案」2023年10月30日

cpp 复制代码
clnt_addr_size=sizeof(clnt_addr);  
	clnt_sock=accept(serv_sock, (struct sockaddr*)&clnt_addr,&clnt_addr_size);
	if(clnt_sock==-1)
		error_handling("accept() error");  
	
	for(i=0; i<3; i++)
	{
		str_len=strlen(str_arr[i])+1;
		write(clnt_sock, (char*)(&str_len), 4);
		write(clnt_sock, str_arr[i], str_len);
		
		read(clnt_sock, (char*)(&str_len), 4);
		read(clnt_sock, read_buf, str_len);
		puts(read_buf);
	}

以下是对上述代码的解释:

上述代码片段是一个基于TCP的服务器端代码,用于向客户端发送一组字符串,并接收客户端返回的字符串。

代码分析如下:

  1. `clnt_addr_size=sizeof(clnt_addr);`:设置`clnt_addr_size`变量为`clnt_addr`结构体的大小,用于接收客户端的地址信息。

  2. `clnt_sock=accept(serv_sock, (struct sockaddr*)&clnt_addr,&clnt_addr_size);`:通过`accept()`函数接受客户端的连接请求,创建一个新的套接字`clnt_sock`与客户端进行通信。`serv_sock`是服务器端的套接字文件描述符,`clnt_addr`是用于存储客户端地址信息的结构体。

  3. `if(clnt_sock==-1) error_handling("accept() error");`:如果`accept()`函数返回-1,表示接受连接请求失败,输出错误信息并退出。

  4. `for(i=0; i<3; i++)`:循环三次,发送和接收三组字符串。

  5. `str_len=strlen(str_arr[i])+1;`:计算当前字符串`str_arr[i]`的长度,并加1,用于发送给客户端。

  6. `write(clnt_sock, (char*)(&str_len), 4);`:将字符串长度`str_len`以4字节的形式发送给客户端。

  7. `write(clnt_sock, str_arr[i], str_len);`:将当前字符串`str_arr[i]`发送给客户端。

  8. `read(clnt_sock, (char*)(&str_len), 4);`:从客户端读取4字节的数据,即接收客户端返回的字符串长度。

  9. `read(clnt_sock, read_buf, str_len);`:从客户端读取长度为`str_len`的字符串数据,并存储到`read_buf`缓冲区中。

  10. `puts(read_buf);`:将接收到的字符串打印输出。

以上代码片段实现了服务器向客户端发送一组字符串,并接收客户端返回的字符串的功能。需要注意的是,代码中没有对错误进行详细处理,例如网络连接错误、读写错误等,实际应用中需要根据具体情况进行错误处理。

注意这里两个write和两个read的参数,重点注意第二个参数:

在这里,`(char*)(&str_len)`是将整型变量`str_len`的地址强制转换为字符型指针。这是因为`write()`函数的第二个参数是一个`const void*`类型的指针,它期望接收一个指向要发送数据的缓冲区的指针。

`str_len`是一个整型变量,用于存储要发送的字符串的长度。为了满足`write()`函数的参数要求,需要将`str_len`的地址转换为字符型指针。

强制类型转换`(char*)`的作用是将整型指针转换为字符型指针,这样可以将整型变量的地址作为字符型指针传递给`write()`函数,从而发送整型变量的内容。

在这种情况下,`write()`函数会将整型变量的内容以字节的形式发送给客户端。由于整型变量的大小通常为4字节,因此使用`write()`函数发送4字节的数据。

需要注意的是,发送和接收数据时,发送方和接收方需要使用相同的数据格式和字节顺序,以确保正确地解析数据。

相关推荐
wdfk_prog7 分钟前
[Linux]学习笔记系列 -- [kernel][time]timer
linux·笔记·学习
熊猫_豆豆14 分钟前
回调函数的作用与举例(Python版)
服务器·python·编程语法
VincentHe26 分钟前
当 ServerCat 遇上 Shell 环境变量:一次服务器监控性能优化记录与探索
服务器·shell·监控
Wilber的技术分享30 分钟前
【大模型实战笔记 6】Prompt Engineering 提示词工程
人工智能·笔记·llm·prompt·大语言模型·提示词工程
JJJJ_iii32 分钟前
【机器学习16】连续状态空间、深度Q网络DQN、经验回放、探索与利用
人工智能·笔记·python·机器学习·强化学习
深耕AI37 分钟前
如何在云服务器上找回并配置宝塔面板:完整指南
运维·服务器
电化学仪器白超1 小时前
④使用 PPTSYNC.exe 与华为手机拍照制作 GIF 动画
服务器·华为·智能手机
jerryinwuhan1 小时前
Linux常用命令练习题
linux·运维·服务器
tang777892 小时前
对抗高级反爬:基于动态代理 IP 的浏览器指纹模拟与轮换策略
网络·网络协议·tcp/ip
CtrlZ学习录2 小时前
笔记:现代操作系统:原理与实现(8)
linux·笔记·架构·开源