日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2023/12/3 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【开源项目】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; }

總結

以上是生活随笔為你收集整理的【开源项目】Socket服务端与客户端传输视频文件的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。