基于TCP流协议的socket网络文件传输Demo

深大计算机网络实验四—— Socket网络编程 目录 实验内容 实验步骤 实验一 1.获取本机IP地址 2.获取指定网站IP地址 3. 使用URL类下载网页并统计大小 实验二 1.使用TCP连接和Socket类实现C/S通信 2.使用UDP连接来编写数据报通信程序 实验三 1.​​​​​​​利用TCP连接实现文件传输 实验内容 使用InetAddress类的方法获取本地机的名称和IP地址。 使用InetAddress类的方法获取网站www.youkuaiyun.com的IP地址,如果存在多个... 阅读详情

基于TCP流协议的socket网络文件传输Demo:

实现:C语言
功能:文件传输(可以传任何格式的文件)

[cpp]  view plain  copy
  1. /************************************************************************* 
  2.     > File Name: Server.c 
  3.     > Author: SongLee 
  4.     > E-mail: lisong.shine@qq.com  
  5.     > Created Time: 2014年03月13日 星期四 22时17分43秒 
  6.     > Personal Blog: http://songlee24.github.io/ 
  7.  ************************************************************************/  
  8.   
  9. #include<netinet/in.h>  // sockaddr_in  
  10. #include<sys/types.h>   // socket  
  11. #include<sys/socket.h>  // socket  
  12. #include<stdio.h>       // printf  
  13. #include<stdlib.h>      // exit  
  14. #include<string.h>      // bzero  
  15.   
  16. #define SERVER_PORT 8000  
  17. #define LENGTH_OF_LISTEN_QUEUE 20  
  18. #define BUFFER_SIZE 1024  
  19. #define FILE_NAME_MAX_SIZE 512  
  20.   
  21. int main(void)  
  22. {  
  23.     // 声明并初始化一个服务器端的socket地址结构  
  24.     struct sockaddr_in server_addr;  
  25.     bzero(&server_addr, sizeof(server_addr));  
  26.     server_addr.sin_family = AF_INET;  
  27.     server_addr.sin_addr.s_addr = htons(INADDR_ANY);  
  28.     server_addr.sin_port = htons(SERVER_PORT);  
  29.   
  30.     // 创建socket,若成功,返回socket描述符  
  31.     int server_socket_fd = socket(PF_INET, SOCK_STREAM, 0);  
  32.     if(server_socket_fd < 0)  
  33.     {  
  34.         perror("Create Socket Failed:");  
  35.         exit(1);  
  36.     }  
  37.     int opt = 1;  
  38.     setsockopt(server_socket_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));  
  39.   
  40.     // 绑定socket和socket地址结构  
  41.     if(-1 == (bind(server_socket_fd, (struct sockaddr*)&server_addr, sizeof(server_addr))))  
  42.     {  
  43.         perror("Server Bind Failed:");  
  44.         exit(1);  
  45.     }  
  46.       
  47.     // socket监听  
  48.     if(-1 == (listen(server_socket_fd, LENGTH_OF_LISTEN_QUEUE)))  
  49.     {  
  50.         perror("Server Listen Failed:");  
  51.         exit(1);  
  52.     }  
  53.   
  54.     while(1)  
  55.     {  
  56.         // 定义客户端的socket地址结构  
  57.         struct sockaddr_in client_addr;  
  58.         socklen_t client_addr_length = sizeof(client_addr);  
  59.   
  60.         // 接受连接请求,返回一个新的socket(描述符),这个新socket用于同连接的客户端通信  
  61.         // accept函数会把连接到的客户端信息写到client_addr中  
  62.         int new_server_socket_fd = accept(server_socket_fd, (struct sockaddr*)&client_addr, &client_addr_length);  
  63.         if(new_server_socket_fd < 0)  
  64.         {  
  65.             perror("Server Accept Failed:");  
  66.             break;  
  67.         }  
  68.   
  69.         // recv函数接收数据到缓冲区buffer中  
  70.         char buffer[BUFFER_SIZE];  
  71.         bzero(buffer, BUFFER_SIZE);  
  72.         if(recv(new_server_socket_fd, buffer, BUFFER_SIZE, 0) < 0)  
  73.         {  
  74.             perror("Server Recieve Data Failed:");  
  75.             break;  
  76.         }  
  77.   
  78.         // 然后从buffer(缓冲区)拷贝到file_name中  
  79.         char file_name[FILE_NAME_MAX_SIZE+1];  
  80.         bzero(file_name, FILE_NAME_MAX_SIZE+1);  
  81.         strncpy(file_name, buffer, strlen(buffer)>FILE_NAME_MAX_SIZE?FILE_NAME_MAX_SIZE:strlen(buffer));  
  82.         printf("%s\n", file_name);  
  83.   
  84.         // 打开文件并读取文件数据  
  85.         FILE *fp = fopen(file_name, "r");  
  86.         if(NULL == fp)  
  87.         {  
  88.             printf("File:%s Not Found\n", file_name);  
  89.         }  
  90.         else  
  91.         {  
  92.             bzero(buffer, BUFFER_SIZE);  
  93.             int length = 0;  
  94.             // 每读取一段数据,便将其发送给客户端,循环直到文件读完为止  
  95.             while((length = fread(buffer, sizeof(char), BUFFER_SIZE, fp)) > 0)  
  96.             {  
  97.                 if(send(new_server_socket_fd, buffer, length, 0) < 0)  
  98.                 {  
  99.                     printf("Send File:%s Failed./n", file_name);  
  100.                     break;  
  101.                 }  
  102.                 bzero(buffer, BUFFER_SIZE);  
  103.             }  
  104.   
  105.             // 关闭文件  
  106.             fclose(fp);  
  107.             printf("File:%s Transfer Successful!\n", file_name);  
  108.         }  
  109.         // 关闭与客户端的连接  
  110.         close(new_server_socket_fd);  
  111.     }  
  112.     // 关闭监听用的socket  
  113.     close(server_socket_fd);  
  114.     return 0;  
  115. }  


[cpp]  view plain  copy
  1. /************************************************************************* 
  2.     > File Name: Client.c 
  3.     > Author: SongLee 
  4.     > E-mail: lisong.shine@qq.com  
  5.     > Created Time: 2014年03月14日 星期五 09时41分46秒 
  6.     > Personal Blog: http://songlee24.github.io/ 
  7.  ************************************************************************/  
  8.   
  9. #include<netinet/in.h>   // sockaddr_in  
  10. #include<sys/types.h>    // socket  
  11. #include<sys/socket.h>   // socket  
  12. #include<stdio.h>        // printf  
  13. #include<stdlib.h>       // exit  
  14. #include<string.h>       // bzero  
  15.   
  16. #define SERVER_PORT 8000  
  17. #define BUFFER_SIZE 1024  
  18. #define FILE_NAME_MAX_SIZE 512  
  19.   
  20. int main()  
  21. {  
  22.     // 声明并初始化一个客户端的socket地址结构  
  23.     struct sockaddr_in client_addr;  
  24.     bzero(&client_addr, sizeof(client_addr));  
  25.     client_addr.sin_family = AF_INET;  
  26.     client_addr.sin_addr.s_addr = htons(INADDR_ANY);  
  27.     client_addr.sin_port = htons(0);  
  28.   
  29.     // 创建socket,若成功,返回socket描述符  
  30.     int client_socket_fd = socket(AF_INET, SOCK_STREAM, 0);  
  31.     if(client_socket_fd < 0)  
  32.     {  
  33.         perror("Create Socket Failed:");  
  34.         exit(1);  
  35.     }  
  36.   
  37.     // 绑定客户端的socket和客户端的socket地址结构 非必需  
  38.     if(-1 == (bind(client_socket_fd, (struct sockaddr*)&client_addr, sizeof(client_addr))))  
  39.     {  
  40.         perror("Client Bind Failed:");  
  41.         exit(1);  
  42.     }  
  43.   
  44.     // 声明一个服务器端的socket地址结构,并用服务器那边的IP地址及端口对其进行初始化,用于后面的连接  
  45.     struct sockaddr_in server_addr;  
  46.     bzero(&server_addr, sizeof(server_addr));  
  47.     server_addr.sin_family = AF_INET;  
  48.     if(inet_pton(AF_INET, "127.0.0.1", &server_addr.sin_addr) == 0)  
  49.     {  
  50.         perror("Server IP Address Error:");  
  51.         exit(1);  
  52.     }  
  53.     server_addr.sin_port = htons(SERVER_PORT);  
  54.     socklen_t server_addr_length = sizeof(server_addr);  
  55.   
  56.     // 向服务器发起连接,连接成功后client_socket_fd代表了客户端和服务器的一个socket连接  
  57.     if(connect(client_socket_fd, (struct sockaddr*)&server_addr, server_addr_length) < 0)  
  58.     {  
  59.         perror("Can Not Connect To Server IP:");  
  60.         exit(0);  
  61.     }  
  62.   
  63.     // 输入文件名 并放到缓冲区buffer中等待发送  
  64.     char file_name[FILE_NAME_MAX_SIZE+1];  
  65.     bzero(file_name, FILE_NAME_MAX_SIZE+1);  
  66.     printf("Please Input File Name On Server:\t");  
  67.     scanf("%s", file_name);  
  68.   
  69.     char buffer[BUFFER_SIZE];  
  70.     bzero(buffer, BUFFER_SIZE);  
  71.     strncpy(buffer, file_name, strlen(file_name)>BUFFER_SIZE?BUFFER_SIZE:strlen(file_name));  
  72.       
  73.     // 向服务器发送buffer中的数据  
  74.     if(send(client_socket_fd, buffer, BUFFER_SIZE, 0) < 0)  
  75.     {  
  76.         perror("Send File Name Failed:");  
  77.         exit(1);  
  78.     }  
  79.   
  80.     // 打开文件,准备写入  
  81.     FILE *fp = fopen(file_name, "w");  
  82.     if(NULL == fp)  
  83.     {  
  84.         printf("File:\t%s Can Not Open To Write\n", file_name);  
  85.         exit(1);  
  86.     }  
  87.   
  88.     // 从服务器接收数据到buffer中  
  89.     // 每接收一段数据,便将其写入文件中,循环直到文件接收完并写完为止  
  90.     bzero(buffer, BUFFER_SIZE);  
  91.     int length = 0;  
  92.     while((length = recv(client_socket_fd, buffer, BUFFER_SIZE, 0)) > 0)  
  93.     {  
  94.         if(fwrite(buffer, sizeof(char), length, fp) < length)  
  95.         {  
  96.             printf("File:\t%s Write Failed\n", file_name);  
  97.             break;  
  98.         }  
  99.         bzero(buffer, BUFFER_SIZE);  
  100.     }  
  101.   
  102.     // 接收成功后,关闭文件,关闭socket  
  103.     printf("Receive File:\t%s From Server IP Successful!\n", file_name);  
  104.     close(fp);  
  105.     close(client_socket_fd);  
  106.     return 0;  
  107. }  



个人站点:http://songlee24.github.io/

C语言socket编程----实现TCP通信 TCP/IP协议(Transmission Control Protocol/Internet Pro'to'co) 阅读详情

相关推荐

TCP通讯Demo实战:掌握网络编程基础与TCP协议

传输控制协议(TCP)是一种面向连接的、可靠的、基于字节流的传输层通信协议。TCP保证了数据在网络中传输的可靠性和顺序性。它与互联网协议(IP)组合而成的TCP/IP模型是目前互联网数据通信的基础。

weixin_35019679的博客 993

linux 网络编程socket

Socket=(IP地址:端口号),套接字的表示方法是点分十进制的lP地址后面写上端口号,中间用冒号或逗号隔开。每一个传输层连接唯一地被通信两端的两个端点所确定。

Qurry的博客 4594

linux udp多客户端文件传输

对应博客地址:http://blog.youkuaiyun.com/jmq_0000/article/details/7308192

LINUX下的socket网络编程

因为对于服务端来说,它的工作是永远保持运行状态,接收外来ip地址的访问,所以在主函数中,我们采用死循环的方式来保持其永久活力。接着作为服务端需要创建socket,使用bind进行本地地址的绑定,通过listen监听客户端的连接,为了操作方便和出错的情况采用for循环去执行对应函数。接着是ip地址的解析,作为客户端只需要创建socket以及connect进行连接,为了操作方便和出错的情况采用for循环去执行对应函数。到这里客户端的代码就完成了,接下来是服务端的代码,与客户端差不多。

m0_70984490的博客 462

基于socket和tkinter的python网络聊天室程序

基于python socket和tkinter界面库实现的网络聊天室程序,实现登录、注册、在线成员显示、聊天等功能,可详见: http://www.huqj.top/article?id=169

基于TCP协议编程的网络聊天室

设计内容:基于TCP协议编程的方式,编写程序模拟网络聊天室的运行过程。 设计要求: 1. 采用C/S模式,基于TCP协议编程的方式,使得各个用户通过服务器转发实现聊天的功能。 2. 分为两大模块:客户端模块和服务器端模块。 3. 客户端模块的主要功能: 1)登陆功能:用户可以注册,然后选择服务器登入聊天室。 2)显示用户:将在线用户显示在列表中。 3)接收信息:能接收其他用户发出的信息。 4)发送信息:能发出用户要发出的信息。 4.服务器端模块的主要功能: 1)检验登陆信息:检查登陆信息是否正确,并向客户端返回登陆信息,如信息正确。就允许用户登陆。 2)显示在线状态:将该用户的状态发给各在线用户。 3)转发聊天信息:将消息转发给所有在线的用户。 来源GitHub:wangzhe0828/ChatRoom,对代码加入了详细的注释。

Linux中的socket网络编程

socket网络编程框架、基础函数

wst1529210144的博客 1734

Android 开发实战:从零到一集成 espeak-ng 实现中文离线 TTS(无需账号开箱即用)

本文详细介绍了如何在 Android 项目中集成 espeak-ng,实现中文离线语音播报。通过下载 so 库、编写 Java 接口、封装管理类,开发者可快速构建无需账号的 TTS 功能。文章覆盖从零到一的开发步骤、调试技巧及性能优化,适合中高级 Android 开发者参考。

全栈 3320

socket/io(1)、Linux的socket编程详解

Linux的SOCKET编程详解 1. 网络中进程之间如何通信 进 程通信的概念最初来源于单机系统。由于每个进程都在自己的地址范围内运行,为保证两个相互通信的进 程之间既互不干扰又协调一致工作,操作系统为进程通信提供了相应设施,如 UNIX BSD有:管道(pipe)、命名管道(named pipe)软中断信号(signal) UNIX system V有:消息(mes......

黄规速博客:学如逆水行舟,不进则退 34万+

海康工业相机使用教程

海康工业相机连接电脑教程

qq_43251445的博客 2万+

车辆TBOX科普 第7次 TBOX技术深度解析:硬件架构与核心组件详解

摘要: TBOX(车载远程信息处理单元)是智能网联汽车的核心组件,承担数据采集、通信连接与安全交互等关键功能。其硬件架构以主控单元为核心,采用ARM架构处理器(如NXP i.MX系列)实现高效能低功耗处理,搭配DDR4/LPDDR5内存保障性能,eMMC/UFS存储确保数据可靠性。设计中需平衡车规级可靠性(AEC-Q100)、EMC兼容性及成本控制,同时集成通信、定位与安全模块。未来趋势聚焦异构计算、先进制程及功能安全(ASIL-D)与信息安全融合,推动TBOX向边缘计算节点演进。该技术是汽车智能化转型的重

IT深耕十余载,大道之简 863

Linux网络编程之socket文件传输示例

本文所述示例程序是基于Linux平台的socket网络编程,实现文件传输功能。该示例是基于TCP流协议实现的socket网络文件传输程序。采用C语言编写。最终能够实现传输任何格式文件的文件传输程序。 具体实现代码如下: Server端代码如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

风平浪静的专栏 8268

别再死记硬背了!用MaxDEA软件实操SBM、DDF、NDDF模型,手把手教你测算绿色全要素生产率

本文深度解析如何使用MaxDEA软件实操SBM、DDF、NDDF模型,手把手教你测算绿色全要素生产率(GTFP)。通过详细的模型选择对比、数据准备策略和MaxDEA操作流程,帮助研究者科学构建指标体系并准确解读结果,提升环境管理研究的实证分析能力。

weixin_28731231的博客 316

Linux网络编程:socket文件传输范例

基于TCP流协议的socket网络文件传输Demo: 实现:C语言 功能:文件传输(可以传任何格式的文件) /************************************************************************* > File Name: Server.c > Author: SongLee > E-mail: lisong.shine@

已转移博客园 1万+

避坑指南:合宙Air780EG阿里云一型一密连接时,为什么你的HmacMD5加密总失败?

本文针对合宙Air780EG模组连接阿里云物联网平台时,HmacMD5签名失败的常见问题提供深度解决方案。详细剖析了签名拼接格式、密钥使用、随机数处理及编码大小写等关键陷阱,并结合STM32嵌入式开发环境,给出了串口调试、分步验证及AT指令链路的实用排错技巧,帮助开发者顺利完成一型一密动态注册。

kiwi8的博客 441

为何LPDDR4支持on-die ECC,但是DDR4却不支持呢?

DRAM的ECC,目前的编码方式都是128bit data,产生8bit parity或者ECC code. 而且必须要128bit才行。这8bit的ECC code是要被写入到DRAM内存里面的,从而read的时候,可以读取这8bit ECC code来判定read data是否有错,如果是SBF,就可以纠错了,如果是double bit,大部分时候是可以detect到错误,即所谓的SEC(Single Error Correct) + DED(Double Error Detect).

一个DRAM从业者的告白 1556

Windows网络编程:winsock文件传输范例

基于TCP流协议的winsock网络文件传输Demo: 实现:C语言 功能:文件传输(可以传任何格式的文件) /************************************************************************* > File Name: Win_Server.c > Author: SongLee &gt...

dbbaq24022的专栏 132

复现报告:《多回路人机控制系统仿真及II型PIO分析》方法复现与代码实现

本文复现了谭文倩硕士论文《多回路人机控制系统仿真及II型PIO分析》中的关键方法,重点实现了频域驾驶员模型辨识和参数灵敏度分析。通过数字化提取论文图表数据,构建了结构驾驶员模型传递函数,并验证了参数变化对系统特性的影响。采用MATLAB实现了描述函数计算、模型参数辨识和灵敏度分析算法,为后续神经网络模型辨识和II型PIO研究奠定了基础。由于缺乏原始实验数据,部分结果通过数值模拟获得,但仍有效重现了论文的核心分析方法。~~~~~

huanghm88的专栏 175

Linux网络 socket编程

Linuxsocket编程

good good study, day day up! 1349

罗克韦尔AB PLC_FactoryTalk无法登录的解决方法

罗克韦尔AB PLC_FactoryTalk无法登录的解决方法

Robot_PLC_HMI_Automation 3575

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Windows平台下的win socket网络编程-文件传输小范例:

Windows平台下的win socket网络编程-文件传输小范例: 实现:C语言 功能:文件传输(可以传任何格式的文件)  //  // FILENAME:  //         File_Transfer_Server.c  //  // DESCRIPTION:  //         Winsocket Server demo, receive filenam

zhangshan415的专栏 2082

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Visual C++ Socket文件传输:从TCP协议到MFC GUI的完整实现

Socket网络编程是计算机通信的基础,它基于TCP/IP协议栈,通过套接字接口实现进程间数据交换。其核心原理在于建立连接、数据传输和连接释放的三次握手与四次挥手过程,确保了数据的可靠、有序送达。这项技术的价值在于为分布式应用提供了底层通信保障,是实现C/S架构、远程调用、实时数据传输的基石。在工业控制、嵌入式系统、内部网络管理等对自主可控性要求高的应用场景中,基于原生Socket API开发的文件传输工具尤为重要,它能避免第三方库依赖,实现轻量、高效的二进制流处理。本文以Visual C++和MFC为开发

weixin_34258838的博客 413

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

java 文件传输 socket tcp,Java基于TCP协议socket网络编程的文件传送的实现

先了解一下socket基本概念socket也叫套接字:是指在网路中不同主机上的应用进程之间,进行双向通信的端点的抽象。简单理解就是:两个主机之间要通信,就需要知道彼此的ip,端口号等信息,而一台主机这些信息的集合:就可以理解为一个端点,即为套接字双方通过套接字作为一种坐标,建立信息通道,形成连接(两点连接一条直线)简单理解了套接字的概念后,来看看如何通过java socket编程来实现两台主机文件...

weixin_32520565的博客 268
上一篇: 理解IP和端口
下一篇: linux重定向串口打印到telnet
简单并快乐着
博客等级 码龄15年 474粉丝 96原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值