C/C++ Socket编程

上个月的计算机网络课程设计结课了,整理一下。
共四个题:

  1. 实现简单的服务器-客户端通信。
  2. 实现1.的多线程版。
  3. 用RawSocket监听网络。
  4. 实现文件传输。

进入正题之前先插一个小题目:

『智力题』AB各有一把钥匙和锁,现在A要用加锁的盒子通过快递C传一个东西给B,但是如果C能打开盒子的话就会私吞这个东西,问AB该怎么做才能确保东西能从A传给B。(面试题)

文章最后可能有答案。


第一题纯属上手,熟悉一般流程。
服务器端

  1. 引入头文件
  2. 设置编译链接选项
  3. 加载套接字库
  4. 创建套接字
  5. 初始化地址族变量
  6. 绑定到地址和端口
  7. 监听
  8. 等待连接
  9. 发送接收

客户端第6步开始是

  1. 连接服务器
  2. 发送接收

点击显示/隐藏代码


第二题客户端代码没有变化。

第二题,多线程版本。
新建线程,可以指定新线程执行的函数以及要传递的参数。
要传递的参数,自定义的结构体。THREAD_DATA threadData1(connSocket, clientAddr, count++);
新建线程,ThreadProc是自己实现线程函数,threadData就是参数。HANDLE thread = CreateThread(nullptr, 0, ThreadProc, &threadData1, 0, nullptr);

点击显示/隐藏代码

第二题,使用Select实现
参见:windows 和 linux 套接字中的 select 机制浅析

  • 1. 调用 FD_ZERO 来初始化套接字状态;
  • 2. 调用 FD_SET 将感兴趣的套接字描述符加入集合中(每次循环都要重新加入,因为 select 更新后,会将一些没有满足条件的套接字移除队列);
  • 3. 设置等待时间后,调用 select 函数 — 更新套接字的状态;
  • 4. 调用 FD_ISSET,来判断套接字是否有相应状态,然后做相应操作,比如,如果套接字可读,就调用 recv 函数去接收数据。

关键技术:套接字队列和状态的表示与处理。

点击显示/隐藏代码


第三题,原始套接字。
首先定义协议头部的结构体,然后对收到的数据进行解析即可。
具体细节可以看代码,注释还算详细。

点击显示/隐藏代码


第四题,传输文件。
设置各种消息类型,采用一问一答形式,比如刚建立连接时:

服务器:[MSG_CMD]我支持这些命令。
客户端:[MSG_FILENAME]输入一个命令< 我要a.txt文件>
服务器:[MSG_FILE_LENGTH]你怎么知道我有这个文件呢,返回文件长度。
客户端:[MSG_CLIENT_READY]收到长度表示服务器有这个文件,在客户端本地新建(或覆盖)这个文件。我准备好了,你从位置0开始传输内容吧。
服务器:[MSG_FILE]从位置0开始传输一个文件块。(假设一个块长1024)
客户端:[MSG_CLIENT_READY]我准备好了,你从1024开始传输吧。
服务器:[MSG_FILE]从1024开始传输文件块。
客户端:[MSG_FILE_SUCC]客户端计算知道文件传输完毕,就说接收完毕。
服务器:[MSG_FILE_CMD]哦,我知道了。我支持这些命令。

一轮结束。错误处理看代码吧。

点击显示/隐藏代码


提示一

双重加密,或交换公钥。

解法1

a锁上给b,b再把他的锁锁上给a,a拿到把自己的锁解下,再传给b

解法2

可以先让b把打开的锁传给a(公钥),然后a使用盒子装好目标文件后加上b的锁(使用公钥加密),继而传给b,最后b解锁(私钥))

————其实都是QQ好友的评论2333

代码可在github上找到:https://github.com/YouthLin/Network


“C/C++ Socket编程”的4个回复

Loading...
  1. 『智力题』AB各有一把钥匙和锁,现在A要用加锁的盒子通过快递C传一个东西给B,但是如果C能打开盒子的话就会私吞这个东西,问AB该怎么做才能确保东西能从A传给B。
    说一下我个人关于这个题目的解答:
    物品:一个可以上锁的盒子,锁A,锁B,钥匙A,钥匙B。
    分配:(假设A,B之间的传输从开始)
    A:把盒子,锁A,锁B,钥匙A给A。
    B: 让B持有钥匙B。
    传输过程:A把锁A放进盒子里,用锁B给盒子上锁,通过C传递给B,B拿到盒子以后用钥匙B打开盒子,取出东西后,再把自己想回复给A的东西和锁B一起放进盒子里,用锁A给盒子上锁,再通过C传回给A。即可完成一次传输,最终状态与最初相同,可以重复完成上述过程反复进行传输。

  2. 自己看过java的socket编程,很浅,这次看了c++的,c++的感觉更深入些

发表评论

电子邮件地址不会被公开。 必填项已用*标注