【开源项目】Socket服务端与客户端传输视频文件

TCP Server端

#define WIN32_LEAN_AND_MEAN
#define _WINSOCK_DEPRECATED_NO_WARNINGS#include<windows.h>
#include<WinSock2.h>
#include<stdio.h>
#include <malloc.h>#pragma comment(lib,"ws2_32.lib")int main()
{//启动Windows socket 2.x环境WORD ver = MAKEWORD(2, 2);WSADATA dat;WSAStartup(ver, &dat);//------------//-- 用Socket API建立简易TCP服务端// 1 建立一个socket 套接字SOCKET _sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);// 2 bind 绑定用于接受客户端连接的网络端口sockaddr_in _sin = {};_sin.sin_family = AF_INET;_sin.sin_port = htons(4567);//host to net unsigned short_sin.sin_addr.S_un.S_addr = INADDR_ANY;//inet_addr("127.0.0.1");if (SOCKET_ERROR == bind(_sock, (sockaddr*)&_sin, sizeof(_sin))){printf("错误,绑定网络端口失败...\n");}else {printf("绑定网络端口成功...\n");}// 3 listen 监听网络端口if (SOCKET_ERROR == listen(_sock, 5)){printf("错误,监听网络端口失败...\n");}else {printf("监听网络端口成功...\n");}// 4 accept 等待接受客户端连接sockaddr_in clientAddr = {};int nAddrLen = sizeof(sockaddr_in);SOCKET _cSock = INVALID_SOCKET;char msgBuf[] = "Hello, I'm Server.";while (true){_cSock = accept(_sock, (sockaddr*)&clientAddr, &nAddrLen);if (INVALID_SOCKET == _cSock){printf("错误,接受到无效客户端SOCKET...\n");}printf("新客户端加入:IP = %s \n", inet_ntoa(clientAddr.sin_addr));// 5 send 向客户端发送一条数据FILE *fp1 = NULL; //指向源文件char *byBuff = NULL; //缓存int fileBytes = 0; //文件大小const char* pSrc = "Src.mp4";if ((fp1 = fopen(pSrc, "rb")) != NULL){fseek(fp1, 0L, 2);//将文件指针移动到文件末尾size_t size = ftell(fp1);//计算文件大小printf("文件大小%d \n", size);byBuff = (char*)malloc(size);//动态分配一块空间来存储读到的数据fseek(fp1, 0L, 0);//将文件指针移动到文件头部fileBytes = fread(byBuff, 1, size, fp1);send(_cSock, byBuff, size, 0);memset(byBuff, 0, sizeof(byBuff));//存储区清空fclose(fp1);}}// 6 关闭套节字closesocketclosesocket(_sock);//------------//清除Windows socket环境WSACleanup();return 0;
}

TCP Client端

#define WIN32_LEAN_AND_MEAN#include<windows.h>
#include<WinSock2.h>
#include<stdio.h>
#include<malloc.h>#pragma comment(lib,"ws2_32.lib")int main()
{//启动Windows socket 2.x环境WORD ver = MAKEWORD(2, 2);WSADATA dat;WSAStartup(ver, &dat);//------------//-- 用Socket API建立简易TCP客户端// 1 建立一个socketSOCKET _sock = socket(AF_INET, SOCK_STREAM, 0);if (INVALID_SOCKET == _sock){printf("错误,建立Socket失败...\n");}else {printf("建立Socket成功...\n");}// 2 连接服务器 connectsockaddr_in _sin = {};_sin.sin_family = AF_INET;_sin.sin_port = htons(4567);_sin.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");int ret = connect(_sock, (sockaddr*)&_sin, sizeof(sockaddr_in));if (SOCKET_ERROR == ret){printf("错误,连接服务器失败...\n");}else {printf("连接服务器成功...\n");}// 3 接收服务器信息 recvFILE *fp1 = NULL; //指向源文件const char* pDest = "Dest.MP4";char *byBuff = NULL; //缓存byBuff = (char*)malloc(691767);//动态分配一块空间来存储读到的数据int nlen = recv(_sock, byBuff, 691767, 0);if ((fp1 = fopen(pDest, "ab+")) != NULL){fwrite(byBuff, 691767, 1, fp1);//从数据存储区向外读数据memset(byBuff, 0, sizeof(byBuff));//存储区清空fclose(fp1);}if (nlen > 0){printf("接收到数据\n");}// 4 关闭套节字closesocketclosesocket(_sock);//清除Windows socket环境WSACleanup();getchar();return 0;
}

UDP 服务端

#include <stdio.h>  
#include <winsock2.h>  
#include <Windows.h>  #pragma comment(lib,"ws2_32.lib")  
#define  PORT 2345  int main(int argc, char* argv[])
{//Step1:初始化网络环境  WSADATA wsa;if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0){printf("WSAStartup failed\n");return -1;}//Step2:建立一个UDP的socket  //建立socket参数:socket(协议域,指定socket类型,指定协议)(和TCP协议后两个参数不同,都为IP协议族)SOCKET sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);if (sock == SOCKET_ERROR){printf("create socket failed\n");return -1;}//Step3:绑定地址信息  sockaddr_in serverAddr;serverAddr.sin_family = AF_INET;		// 协议簇为IPV4的  serverAddr.sin_port = htons(PORT);		// 端口  因为本机是小端模式,网络是大端模式,调用htons把本机字节序转为网络字节序  serverAddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);	// ip地址,INADDR_ANY表示绑定电脑上所有网卡IP //bind(socket描述字, 绑定给listenfd的协议地址,地址长度)bind(sock, (sockaddr*)&serverAddr, sizeof(sockaddr));//Step5:与客户端进行通信char buf[512];while (TRUE){memset(buf, 0, 512);// 网络节点的信息,用来保存客户端的网络信息  sockaddr_in clientAddr;memset(&clientAddr, 0, sizeof(sockaddr_in));int clientAddrLen = sizeof(sockaddr);//接收客户端发来的数据 //recvfrom参数:socket名称,接收数据的缓冲区,缓冲区大小,标志位(调用操作方式),sockaddr结构地址,sockaddr结构大小地址//sockaddr地址用来保存从哪里发来,和发送到哪里的地址信息int ret = recvfrom(sock, buf, 512, 0, (sockaddr*)&clientAddr, &clientAddrLen);//inet_ntoa函数转化为ip,ntohs函数转化为端口号printf("Recv msg:%s from IP:[%s] Port:[%d]\n", buf, inet_ntoa(clientAddr.sin_addr), ntohs(clientAddr.sin_port));FILE *fp1 = NULL; //指向源文件char *byBuff = NULL; //缓存int fileBytes = 0; //文件大小const char* pSrc = "rgb24_fmt.jfif";if ((fp1 = fopen(pSrc, "rb")) != NULL){fseek(fp1, 0L, 2);//将文件指针移动到文件末尾size_t size = ftell(fp1);//计算文件大小printf("文件大小%d \n", size);byBuff = (char*)malloc(size);//动态分配一块空间来存储读到的数据fseek(fp1, 0L, 0);//将文件指针移动到文件头部fileBytes = fread(byBuff, 1, size, fp1);// 发一个数据包返回给客户  //sendto参数:socket名称,发送数据的缓冲区,缓冲区大小,标志位(调用操作方式),sockaddr结构地址,sockaddr结构大小地址sendto(sock, byBuff, fileBytes, 0, (sockaddr*)&clientAddr, clientAddrLen);printf("Send msg back to IP:[%s] Port:[%d]\n", inet_ntoa(clientAddr.sin_addr), ntohs(clientAddr.sin_port));memset(byBuff, 0, sizeof(byBuff));//存储区清空fclose(fp1);}}return 0;
}

UDP 客户端

#include <stdio.h>  
#include <winsock2.h>  
#include <Windows.h>  #pragma comment(lib,"ws2_32.lib")  
#define  PORT 2345  
int main(int argc, char* argv[])
{//Step1:初始化网络环境  WSADATA wsa;if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0){printf("WSAStartup failed\n");return -1;}//Step2:建立一个UDP的socket //建立socket参数:socket(协议域,指定socket类型,指定协议)(和TCP协议后两个参数不同,都为IP协议族)SOCKET sockClient = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);if (sockClient == INVALID_SOCKET){printf("create socket failed\n");return -1;}// 申明一个网络地址信息的结构体,保存服务器的地址信息  sockaddr_in addr = { 0 };addr.sin_family = AF_INET;		// 协议簇为IPV4的  addr.sin_port = htons(PORT);	// 端口  因为本机是小端模式,网络是大端模式,调用htons把本机字节序转为网络字节序  addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");	// 服务器的ip地址//Step3:与服务端进行通信char buf[] = "client test!";//发送数据  //sendto参数:socket名称,接收数据的缓冲区,缓冲区大小,标志位(调用操作方式),sockaddr结构地址,sockaddr结构大小地址int dwSent = sendto(sockClient, buf, strlen(buf), 0, (SOCKADDR *)&addr, sizeof(SOCKADDR));if (dwSent == 0){printf("send %s failed\n", buf);return -1;}printf("send msg:%s\n", buf);char recvBuf[512];memset(recvBuf, 0, 512);sockaddr_in addrSever = { 0 };int nServerAddrLen = sizeof(sockaddr_in);// 3 接收服务器信息 recvFILE *fp1 = NULL; //指向源文件const char* pDest = "Dest.jfif";char *byBuff = NULL; //缓存byBuff = (char*)malloc(2908);//动态分配一块空间来存储读到的数据// 接收数据  //recvfrom参数:socket名称,接收数据的缓冲区,缓冲区大小,标志位(调用操作方式),sockaddr结构地址,sockaddr结构大小地址int dwRecv = recvfrom(sockClient, byBuff, 2908, 0, (SOCKADDR *)&addrSever, &nServerAddrLen);if ((fp1 = fopen(pDest, "ab+")) != NULL){printf("Recv data\n");fwrite(byBuff, 2908, 1, fp1);//从数据存储区向外读数据memset(byBuff, 0, sizeof(byBuff));//存储区清空fclose(fp1);}//Step4:关闭SOCKET连接  closesocket(sockClient);//清理网络环境  WSACleanup();system("pause");return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/336172.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java comparator_【面试题】Java必考面试题全集(15)

Java基础面试题(15)1&#xff1a;Comparator 与Comparable 有什么不同&#xff1f;2&#xff1a;Object中有哪些方法&#xff1f;3&#xff1a;说下jdk8中的一些新特性4&#xff1a;在64 位 JVM 中&#xff0c;int 的长度是多数&#xff1f;5&#xff1a;java每改一点都需要重新…

px是什么意思计算机二级,px是什么意思?照片中的px是什么的缩写?

px是什么意思?px(Pixel&#xff0c;像素)是可以在数字显示设备上显示和表示的数字图像或图形的最小单位。像素是数字图形中的基本逻辑单元。将像素组合在一起以在计算机显示器上形成完整的图像&#xff0c;视频&#xff0c;文本或任何可见的东西。像素也称为图像元素。若把影像…

【OpenGL从入门到精通(一)】Windows搭建OpenGL的渲染环境,并初始化一个OPenGL窗口

注意&#xff1a;需要在Windows 窗口程序下&#xff0c;而不能是控制台程序&#xff0c;Windows平台的VS下已经包含了OpenGL相关的API&#xff0c;可以直接引用 #include <windows.h> #include<gl/GL.h> #include<gl/GLU.h>#pragma comment(lib,"openg…

java 交替_Java 8:使用交替接口公开的类型安全地图生成器

java 交替动态展示您的课程 当我还是Java新手时&#xff0c;我记得当时以为应该有一种方法可以删除或隐藏我不想公开的类中的方法。 就像用private方法或类似方法覆盖public方法一样&#xff08;哪种情况是不可能的&#xff0c;也不应该是不可能的&#xff09;。 显然&#xff…

ieee期刊_论文绘图神器来了:一行代码绘制不同期刊格式图表,哈佛博士后开源...

贾浩楠 发自 凹非寺量子位 报道 | 公众号 QbitAI「一篇论文投多个期刊&#xff0c;每个期刊对图表格式要求不一&#xff0c;同一组数据要用多种工具分别绘图。」不光是你&#xff0c;哈佛大学天文研究所的博士后&#xff0c;也不堪忍受论文重复绘图之苦。他的解决办法是&#x…

微课与计算机技术的论文,微课在高校计算机教学的运用论文

微课在高校计算机教学的运用论文摘要&#xff1a;现代信息社会不断发展进步&#xff0c;高校计算机教学也面临着复杂的形势&#xff0c;为全面提高计算机教学质量&#xff0c;提升学生的专业素质及综合能力&#xff0c;应当微课加以科学化应用。本文基于微课的内涵及应用意义出…

【OpenGL从入门到精通(二)】绘制一个点

1.想要绘制一个点&#xff0c;首先要在OpenGL初始化中先设置矩阵 2.然后在绘制场景中进行点的绘制。其中包括 当前颜色设置&#xff1b;点的位置&#xff0c;点的大小等等 #include <windows.h> #include<gl/GL.h> #include<gl/GLU.h>#pragma comment(lib,…

spring 启动加载数据_12个很棒的Spring数据教程来启动您的数据项目

spring 启动加载数据Spring Data的任务是为数据访问提供一个熟悉且一致的&#xff0c;基于Spring的编程模型&#xff0c;同时仍保留基础数据存储的特​​殊特征。 它使使用数据访问技术&#xff0c;关系和非关系数据库&#xff0c;map-reduce框架以及基于云的数据服务变得容易…

concurrenthashmap_ConcurrentHashMap是如何保证线程安全的

文章已同步发表于微信公众号JasonGaoH&#xff0c;ConcurrentHashMap是如何保证线程安全的之前分析过HashMap的一些实现细节&#xff0c;关于HashMap你需要知道的一些细节, 今天我们从源码角度来看看ConcurrentHashMap是如何实现线程安全的&#xff0c;其实网上这类文章分析特别…

计算机系统计算机,计算机系统与计算机化系统的区别

2010版GMP正文中提到“计算机”的地方一共三处&#xff0c;两处用的是计算机化&#xff0c;一处用的是“计算机”。在GMP的术语条款&#xff0c;则只提到了“计算机化系统”&#xff0c;2015年12月生效的GMP附录中的表述也是“计算机化系统”。那么“计算机系统”与“计算机化系…

【OpenGL从入门到精通(三)】第一个点的理论

OpenGL状态机 一&#xff0c;OpenGL是一个状态机matrix中包括&#xff1a; model view (模型矩阵) worldpos(世界坐标,也称为顶点坐标)通过mv(模型矩阵)转到cameru摄像机下&#xff08;根据右手坐标系&#xff0c;只有在Z的负方向才可以看得见&#xff09; projection …

cloud foundry_将Spring Boot应用程序绑定到Cloud Foundry中的服务的方法

cloud foundry如果要试用Cloud Foundry &#xff0c;最简单的方法是下载出色的PCF开发人员或在Pivotal Web Services站点上创建试用帐户。 其余文章假定您已经安装了Cloud Foundry&#xff0c;并且对Cloud Foundry有了较高的了解。 这篇文章的目的是列出将Java应用程序集成到服…

js find的用法_React常用库Immutable.js常用API

JavaScript 中的对象一般是可变的(Mutable)&#xff0c;因为使用了引用赋值&#xff0c;新的对象简单的引用了原始对象&#xff0c;改变新的对象将影响到原始对象。如 foo{a: 1}; barfoo; bar.a2 你会发现此时 foo.a 也被改成了 2。虽然这样做可以节约内存&#xff0c;但当应用…

教学案例 计算机,计算机教学案例

海量优秀的免费计算机教学案例范文供您参考与下载&#xff0c;关于计算机教学案例的免费论文范文参考资料是由2016年最新的相关论文题目按照标准论文格式模板写作的,适合不知道怎么写计算机教学案例的大学毕业生,对相关的本科论文和硕士毕业论文及职称论文发表写作有参考价值&a…

java 开发:md5_Java社区调查结果:74%的开发人员希望减少详细程度

java 开发:md5一个新的JDK增强建议&#xff08;JEP&#xff09;在Java社区中风起云涌&#xff1a;JEP286。该建议建议在Java的未来版本中引入局部变量类型推断&#xff0c;以简化Java应用程序的编写。 在下面的文章中&#xff0c;我们将解释它的含义以及它将如何影响您的代码。…

python获取当前目录_又有几个Python小技巧分享

今天这篇文章为大家带来几个Python使用的小技巧&#xff1a;快速生成依赖文件文件路径处理通过set将对象去重单元测试unitest捕获异常快速生成依赖文件Python通过requirements.txt来管理项目所依赖的库&#xff0c;通过pip install -r requirements.txt命令可以直接安装项目所需…

计算机弹歌曲做我老婆好不好,做我老婆好不好吉他谱(图片谱,指弹,做我老婆好不好,徐誉滕)_徐誉滕(徐海;徐歆舜)...

做我老婆好不好词曲&#xff1a;徐誉滕演唱&#xff1a;徐誉滕走过多少路口 听过多少叹息我认真着你的不知所措这种迷茫心情 我想谁都会有幸运的是能分担你的愁能不能靠近一点 能不能再近一点满足我心中小小的虚荣其实你并不知道 在我心中你最美就像风雨过后天边的那道彩虹如果…

python敏感字替换_python用类实现文章敏感词的过滤方法示例

过滤一遍并将敏感词替换之后剩余字符串中新组成了敏感词语,这种情况就要用递归来解决&#xff0c;直到过滤替换之后的结果和过滤之前一样时才算结束 第一步:建立一个敏感词库(.txt文本)第二步:编写代码在文章中过滤敏感词(递归实现) # -*- coding: utf-8 -*- # author 代序春秋…

2018年冷链百强_在分析了47,251个依赖关系之后,2016年Java图书馆百强

2018年冷链百强谁在上面&#xff0c;谁在后面&#xff1f; 我们分析了Github上的47,251个依赖关系&#xff0c;并抽取了前100个Java库 对于长周末而言&#xff0c;我们最喜欢的消遣是浏览Github并搜索流行的Java库。 我们决定与您分享乐趣和信息。 我们分析了Github上前3,862…

【FFMPEG应用篇】基于FFmpeg的封装格式转换

/* * 一笑奈何 * cn-yixiaonaihe.blog.csdn.net */#include <iostream> #include <thread> extern "C" { #include "libavformat/avformat.h" #include "libavcodec/avcodec.h" #include "libswscale/swscale.h" #inc…