本次课程设计时间大概是两天半,磕磕碰碰,一路上遇到了很多的问题,也不断的查资料,想办法解决各种拦路的BUG,最后做出来的效果自己还是挺满意的,能够实现多台电脑之间模拟服务端,客户端,进行文件传送。下面做一下整理(附程序和运行效果截图)

本次课程设计完成任务如下:

(1)学习TCP/IP网络基本知识,学习socket通信基本知识,设计基于Socket的网络通信程序,在LINUX 系统与WINDOWS系统之间进行通信,使用C++语言实现。

(2)在Socket服务端,能够读出一副图像数据,经过网络通信,自己设计协议,将这副图片发送到客户端,客户端接收到这副图片后,将其显示在屏幕上。

直接看程序吧,有挺详细的注释->

服务端程序:

#include<iostream>
//#include<winsock.h>
#include <winsock2.h>
#include<stdio.h>
#include<stdlib.h>
#pragma comment(lib,"ws2_32.lib")
using namespace std;
void initialization();
#define BUF_SIZE 1024
SOCKET s_accept;
SOCKADDR_IN accept_addr;
void sendFile() {cout << "输入待传送的文件名:";char filename1[100];cin >> filename1;//检查文件是否存在const char *filename = filename1;
#pragma warning(suppress : 4996)FILE *fp = fopen(filename, "rb");if (fp == NULL){printf("不能打开文件,按任何键退出!");system("pause");}else{cout << "文件准备就绪" << endl;}//循环发送数据,直到文件结尾char buffer[BUF_SIZE] = { 0 };//缓冲区int nCount;while ((nCount = fread(buffer, 1, BUF_SIZE, fp)) > 0){send(s_accept, buffer, nCount, 0);}shutdown(s_accept, SD_SEND);文件读取完毕,断开输出流,向客户端发送FIN包,注意加头文件#include <winsock2.h>,不然报错recv(s_accept, buffer, BUF_SIZE, 0);//阻塞,等待客户端接收完毕//关闭文件fclose(fp);
}
void listen1(SOCKET s_server,int len, SOCKADDR_IN accept_addr) {//设置套接字为监听状态if (listen(s_server, SOMAXCONN) < 0) {cout << "设置监听状态失败!" << endl;WSACleanup();}else {cout << "设置监听状态成功!" << endl;}cout << "服务端正在监听连接,请稍候...." << endl;cout << "-------------------------------------" << endl;//接受连接请求len = sizeof(SOCKADDR);s_accept = accept(s_server, (SOCKADDR*)&accept_addr, &len);if (s_accept == SOCKET_ERROR) {cout << "连接失败!" << endl;WSACleanup();}cout << "连接就绪~" << endl;
}
int main() {//定义长度变量int len = 0;//定义服务端套接字,接受请求套接字SOCKET s_server;//服务端地址客户端地址SOCKADDR_IN server_addr;initialization();//填充服务端信息server_addr.sin_family = AF_INET;server_addr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);//设置端口号server_addr.sin_port = htons(1234);//创建套接字s_server = socket(AF_INET, SOCK_STREAM, 0);//绑定套接字到一个IP地址和一个端口上if (bind(s_server, (SOCKADDR*)&server_addr, sizeof(SOCKADDR)) == SOCKET_ERROR) {cout << "-----------------------------" << endl;cout << "套接字绑定失败!" << endl;WSACleanup();}else {cout << "套接字绑定成功!" << endl;}//监听listen1(s_server, len, accept_addr);//发送文件while (true){sendFile();}//关闭套接字closesocket(s_server);closesocket(s_accept);//释放DLL资源WSACleanup();return 0;
}
void initialization() {//初始化套接字库WORD w_req = MAKEWORD(2, 2);//版本号WSADATA wsadata;int err;err = WSAStartup(w_req, &wsadata);if (err != 0) {cout << "初始化套接字库失败!" << endl;}else {cout << "  计181李延胜" << endl;cout << "--------------------------------------" << endl;cout << "初始化套接字库成功!" << endl;}
}

客户端程序:

#include<iostream>
#include<winsock.h>
#pragma comment(lib,"ws2_32.lib")
using namespace std;
#define BUF_SIZE 1024
void initialization();
int main() {//定义服务端套接字,接受请求套接字SOCKET s_server;//服务端地址客户端地址SOCKADDR_IN server_addr;initialization();//填充服务端信息server_addr.sin_family = AF_INET;//获取IPcout << "-------------------------" << endl;cout << "输入服务器的IP:";//定义保存输入IP的字符数组char Service_ip[15];//遇到空格或者回车结束输入cin >> Service_ip;server_addr.sin_addr.S_un.S_addr = inet_addr(Service_ip);//server_addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");server_addr.sin_port = htons(1234);//创建套接字s_server = socket(AF_INET, SOCK_STREAM, 0);if (connect(s_server, (SOCKADDR*)&server_addr, sizeof(SOCKADDR)) == SOCKET_ERROR) {cout << "服务器连接失败!" << endl;WSACleanup();WSACleanup();}else {cout << "服务器连接成功!" << endl;}while (1){//输入文件名,看文件能否创建成功char filename[100] = { 0 };cout << "请输入要保存的文件:";cin >> filename;//以二进制创建文件
#pragma warning(suppress : 4996)FILE *fp = fopen(filename, "wb");//以只写方式打开或新建一个二进制文件,只允许写数据//循环接受char buffer[BUF_SIZE] = { 0 };//文件保存缓冲区int nCount = 0;while ((nCount = recv(s_server, buffer, BUF_SIZE, 0)) > 0)//recv(对应的套接字,保存数据的地方,保存区的大小,第四个参数一般设置为 0{fwrite(buffer, nCount, 1, fp);//buffer输出数据的地址,nCount要输入内容的字节数,1位写入nCount字节的数据项的个数,fp为目标文件}if (fp == NULL){cout << "接收文件失败!";system("pause");exit(0);}if (fp != NULL) {cout << "文件接收成功!" << endl;}//打开并显示图片ShellExecute(NULL,"open", filename, NULL, NULL, SW_SHOWNORMAL);system("pause");fclose(fp);}//关闭套接字closesocket(s_server);//释放DLL资源WSACleanup();return 0;
}
void initialization() {//初始化套接字库WORD w_req = MAKEWORD(2, 2);//版本号WSADATA wsadata;int err;err = WSAStartup(w_req, &wsadata);//检测版本号if (LOBYTE(wsadata.wVersion) != 2 || HIBYTE(wsadata.wHighVersion) != 2) {cout << "套接字库版本号不符!" << endl;WSACleanup();}else {cout << "计181李延胜" << endl;cout << "套接字库版本正确!" << endl;}}

程序执行效果

分别运行服务端和客户端,本机测试IP地址用127.0.0.1,局域网的话IP自己查IPv4对应的IP号(这里用本机回环测试演示)

在客户端输入IP,然后回车可以看到连接是否成功

然后在服务端输入要传送的文件的路径:(这里演示传送一个视频,发送图片的方式也同理)

在客户端也输入要保存服务端传送过来文件的地址,保存在哪里可以自己定义,文件名也可以自己定义,但是文件格式一定要跟服务器传过来的文件的文件格式一致,即文件后缀名要一样

文件传送成功后,程序会自动调用计算机的默认应用打开文件,即你是传送的文件,那么你收到文件后,系统会调用计算机的视频播放软件打开,如果是图片,那么就会用图片查看器打开,其他文件格式也同理

打开刚刚保存文件的路径,可以看到我们的文件传送过来了,两个文件大小一致

不同计算机连接同一个局域网也能实现文件传送呢,感兴趣的伙伴可以试一下哦!!

程序不足之处:一次运行只能传输一次文件,然后程序就结束退出了,需要再一次传送文件还得再重新先打开服务端然后打开客户端连接, 这个可以考虑把发送接收文件的代码块放到一个循环里,我今天简单尝试了一下,没有成功,时间问题,就没来得及继续完善这个不足了,感兴趣的伙伴可以把上面程序修改修改试试

以上程序的注释是个人对程序的一些理解,可能存在有错误的地方,欢迎大家留言指正!!

创作不易,喜欢的伙伴三连支持一下哦!

 

嵌入式课程设计:socket通信模拟服务器客户端实现文件传送(基于c++语言)相关推荐

  1. socket服务器文件名和客户端一致,缘分锝天空的博客:嵌入式课程设计:socket通信模拟服务器客户端...

    #include //#include #include #include #include #pragma comment(lib,"ws2_32.lib") using nam ...

  2. java仿聊天室项目总结_Java团队课程设计-socket聊天室(Day4总结篇)

    Java团队课程设计-socket聊天室(Day4总结篇) 团队名称: ChatRoom 项目git地址: git提交记录(仅截取部分): 面向对象设计包图.类图 包图 UML类图 总结: 首先总结一 ...

  3. java仿聊天室项目总结_Java团队课程设计-socket聊天室(个人总结)

    Java团队课程设计-socket聊天室(个人总结) 一.团队课程设计博客链接 二.本人负责模块或任务说明 任务1 服务端对socket线程的接受以及对客户端的数据转发操作 任务2 数据库的查找,添加 ...

  4. c语言电子时钟课程设计报告,电子时钟嵌入式课程设计报告

    <电子时钟嵌入式课程设计报告>由会员分享,可在线阅读,更多相关<电子时钟嵌入式课程设计报告(19页珍藏版)>请在人人文库网上搜索. 1.合海大学计算机信息工程学院(常州)课程设 ...

  5. 用linux设计99乘法表,嵌入式课程设计九九乘法表

    <嵌入式课程设计九九乘法表>由会员分享,可在线阅读,更多相关<嵌入式课程设计九九乘法表(8页珍藏版)>请在人人文库网上搜索. 1.安阳师范学院计算机与信息工程学院嵌入式系统课程 ...

  6. 2psk系统的仿真课程设计matlab,通信原理课程设计-基于MATLAB-Simulink的2PSK仿真

    <通信原理课程设计-基于MATLAB-Simulink的2PSK仿真>由会员分享,可在线阅读,更多相关<通信原理课程设计-基于MATLAB-Simulink的2PSK仿真(17页珍藏 ...

  7. 操作系统课程设计--使用多线程模拟时间片轮转法调度

    本篇博文分享操作系统课程设计–使用多线程模拟时间片轮转法调度的思路及代码. 实验环境:虚拟机ubuntu18.04 ,VS Code 博主分享仅为互相学习之用,不懂的地方可以留言提问,谨防抄袭!!!谢 ...

  8. matlab偶极矩电场强度分布图_课程设计用MATLAB模拟偶极子的电场分布.doc

    课程设计用MATLAB模拟偶极子的电场分布 燕山大学 课 程 设 计 说 明 书 题目: 用MATLAB模拟偶极子的电场分布 学院(系): 年级专业: 学 号: 学生姓名: 指导教师: 教师职称: 燕 ...

  9. 计算机网络透明网桥的算法,网基课程设计曼切斯特编码模拟透明网桥自习域转发帧算法模拟IP分片模拟.doc...

    网基课程设计曼切斯特编码模拟透明网桥自习域转发帧算法模拟IP分片模拟 计算机网络基础 课 程 设 计 报 告 学号: 姓名: 班级: 题号:01.06.07 题目:曼切斯特编码模拟.透明网桥自学习域转 ...

最新文章

  1. python 单元测试_聊聊 Python 的单元测试框架(一):unittest
  2. 可以比较两个指针是否相等_算法一招鲜——双指针问题
  3. python 多进程 multiprocessing 进程池 pool apply_async()函数与apply()函数的用法
  4. linux添加vfat分区,浅析mkfs.vfat如何在arm开发板上创建fat32独立分区
  5. VTK:可视化之QuadricLODActor
  6. c语言 方程改main的值_C语言编程笔记丨编写第一个C语言程序hello world,我教你哇...
  7. 程序员必看!Android面试10大知识点总结宝典助你通关!年薪50W
  8. CMMI与Agile敏捷开发比较之二:需求管理篇(兼谈用敏捷实现和满足CMMI的ReqM过程域)...
  9. 超链接把一个值传到多个页面的方法
  10. 第24周SDAI缓解能否预测远期RA骨破坏受抑制
  11. php底部导航栏,微信小程序之底部导航栏目开发(附代码)
  12. 微会动平台与微云推战略携手赋能企业数字营销推广与业绩增长闭环
  13. 8月份全国省会城市快递上门签收分析-谁是剁手王城?
  14. SQLServer2012服务无法启动Windows不能在本地计算机启动SQLServer(SQLEXPRESS)
  15. Mysql workbench画ER图
  16. CCF-20180901 卖菜
  17. iOS疯狂详解之启动分层引导动画
  18. pytorch 高光谱图像分类
  19. Python:enumerate函数
  20. 微信小程序项目实例SSM项目源代码小程序图书借阅系统

热门文章

  1. 微信公共平台 “token验证失败”的一个原因
  2. wordpress友联_WordPress添加友情链接功能
  3. 【《关于我一个小学生用C++写了个抽奖游戏这件事》】
  4. 怎么把做好的网页用deramweaver传上互联网 空间和域名怎么申请
  5. win2d 渐变颜色
  6. Gatekeeper代码导读
  7. html背景图片不重叠铺满,html中背景图片铺满页面没有重复的效果
  8. 深度学习模型试跑(十三):stylegan3
  9. 墨翟科技(上海)有限公司
  10. 使用hutool生成excel遇到的问题: