#include

//#include

#include

#include

#include

#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 ,不然报错

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

#include

#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;

//获取IP

cout << "-------------------------" << 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,然后回车可以看到连接是否成功

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

?

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

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

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

?

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

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

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

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

?cs

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

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

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

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

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

  3. hexo搭建自己的博客并部署至免费的github服务器教程

    hexo搭建自己的博客并部署至免费的github服务器教程-mac版本 打开终端,输入sudo su -命令进入root用户 输入npm install -g hexo-cli (前提是按照了node ...

  4. Hugo博客部署到腾讯云轻量级服务器

    文章目录 一.前置条件 二.服务器下载nginx 三.防火墙设置 四.将静态网页传送到服务器 五.申请ssl证书 六.配置nginx的nginx.conf文件 七.后续发布文章 文章内容可能不全面和详 ...

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

            本次课程设计时间大概是两天半,磕磕碰碰,一路上遇到了很多的问题,也不断的查资料,想办法解决各种拦路的BUG,最后做出来的效果自己还是挺满意的,能够实现多台电脑之间模拟服务端,客户端,进 ...

  6. 计算机网络课程设计-Socket网络通信(C++, MacOS)

    实验要求: 利用Socket实现双机通信 实验目的: 利用Socket编程,采用其中的TCP面向连接方式,实现计算机数据的交换 具体要求: 操作系统:可在Linux或Windows操作系统下实现 编程 ...

  7. 专业课程设计之客户与服务器程序的同步与通信机制的设计(一)项目介绍

    源码下载地址为: http://download.csdn.net/detail/qq78442761/9856423 ---------------------------------------- ...

  8. 安装Hexo博客并部署到GitHub或云服务器(细节教程,越过各种坑)

    前言 心血来潮买了云主机,浪费了几个月都没用,然后就学着搭建博客,对比了一下 WordPress 和 Hexo 之后,随性选择了以 Hexo 为框架搭建博客平台. 经过了几次的从零开始,遇到了各种各样 ...

  9. 在阿里云服务器(Ubuntu系统)下使用WordPress搭建博客网站教程

    最近着手也搭建了一个自己的博客网站,在这里与大家分享一下搭建的过程和遇见的问题,希望对同学们有所帮助. 环境:阿里云服务器(Ubuntu系统) 提醒:申请阿里云服务器,可以到阿里云官网领取阿里云幸运券 ...

最新文章

  1. CentOS下TPC-W安装
  2. nyoj 712 探寻宝藏
  3. 【Android】页面栈
  4. HDU 3572 Task Schedule
  5. 7-4 特殊数字 (10 分)
  6. 华为2018年收入超阿里腾讯总和,任正非:华为最大问题是赚钱太多
  7. unity简易游戏制作
  8. Data Center TCP (DCTCP)学习笔记
  9. 软件测试基本流程【车机测试】
  10. 手把手教你搭建一个属于自己的网站-适合零基础小白,文末附网站模板
  11. 希腊计数法罗马计数法
  12. python123第三次作业的解答
  13. html实现音乐界面设计,基于HTML5技术的音乐播放器的设计与实现.doc
  14. macbook air 卸载java,macbook air如何卸载软件 macbook air卸载软件的方法
  15. 多视图几何学(Multiple View Geometry)读书笔记目录
  16. 2021年江苏高考成绩查询时间,2021年江苏高考成绩什么时候出来 公布时间
  17. linux qt编译命令,linux下使用命令模式去编译Qt程序
  18. VMware发布Project Monterey
  19. 100天单词学习计划
  20. Linux安装tomcat,配置环境变量

热门文章

  1. MaxCompute SQL函数详解 ODPS SQL函数详解---之日期相关函数
  2. Adobe Fireworks CS6 安装完提示无法访问Adobe服务器 请检查Internet链接或防火墙设置(错误代码:P206)
  3. 黑群晖+花生壳内网穿透
  4. xml注释快捷键 快捷生成<!-- -->
  5. springBoot+vue企业级中后台管理系统
  6. 网关Gateway zuul总结和面试
  7. 记录集 执行mysql_mysql 多次查询后再执行记录集
  8. 官方正版授权 MAXQDA 标准版、专业质、专业增强版性数据分析工具软件
  9. SQL索引优化之explain查询计划
  10. Lyx error natbib Error Bibliography not compatible with author-year citations