【开源项目】Socket服务端与客户端传输视频文件
生活随笔
收集整理的這篇文章主要介紹了
【开源项目】Socket服务端与客户端传输视频文件
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
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() {//啟動(dòng)Windows socket 2.x環(huán)境WORD ver = MAKEWORD(2, 2);WSADATA dat;WSAStartup(ver, &dat);//------------//-- 用Socket API建立簡(jiǎn)易TCP服務(wù)端// 1 建立一個(gè)socket 套接字SOCKET _sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);// 2 bind 綁定用于接受客戶(hù)端連接的網(wǎng)絡(luò)端口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("錯(cuò)誤,綁定網(wǎng)絡(luò)端口失敗...\n");}else {printf("綁定網(wǎng)絡(luò)端口成功...\n");}// 3 listen 監(jiān)聽(tīng)網(wǎng)絡(luò)端口if (SOCKET_ERROR == listen(_sock, 5)){printf("錯(cuò)誤,監(jiān)聽(tīng)網(wǎng)絡(luò)端口失敗...\n");}else {printf("監(jiān)聽(tīng)網(wǎng)絡(luò)端口成功...\n");}// 4 accept 等待接受客戶(hù)端連接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("錯(cuò)誤,接受到無(wú)效客戶(hù)端SOCKET...\n");}printf("新客戶(hù)端加入:IP = %s \n", inet_ntoa(clientAddr.sin_addr));// 5 send 向客戶(hù)端發(fā)送一條數(shù)據(jù)FILE *fp1 = NULL; //指向源文件char *byBuff = NULL; //緩存int fileBytes = 0; //文件大小const char* pSrc = "Src.mp4";if ((fp1 = fopen(pSrc, "rb")) != NULL){fseek(fp1, 0L, 2);//將文件指針移動(dòng)到文件末尾size_t size = ftell(fp1);//計(jì)算文件大小printf("文件大小%d \n", size);byBuff = (char*)malloc(size);//動(dòng)態(tài)分配一塊空間來(lái)存儲(chǔ)讀到的數(shù)據(jù)fseek(fp1, 0L, 0);//將文件指針移動(dòng)到文件頭部fileBytes = fread(byBuff, 1, size, fp1);send(_cSock, byBuff, size, 0);memset(byBuff, 0, sizeof(byBuff));//存儲(chǔ)區(qū)清空f(shuō)close(fp1);}}// 6 關(guān)閉套節(jié)字closesocketclosesocket(_sock);//------------//清除Windows socket環(huán)境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() {//啟動(dòng)Windows socket 2.x環(huán)境WORD ver = MAKEWORD(2, 2);WSADATA dat;WSAStartup(ver, &dat);//------------//-- 用Socket API建立簡(jiǎn)易TCP客戶(hù)端// 1 建立一個(gè)socketSOCKET _sock = socket(AF_INET, SOCK_STREAM, 0);if (INVALID_SOCKET == _sock){printf("錯(cuò)誤,建立Socket失敗...\n");}else {printf("建立Socket成功...\n");}// 2 連接服務(wù)器 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("錯(cuò)誤,連接服務(wù)器失敗...\n");}else {printf("連接服務(wù)器成功...\n");}// 3 接收服務(wù)器信息 recvFILE *fp1 = NULL; //指向源文件const char* pDest = "Dest.MP4";char *byBuff = NULL; //緩存byBuff = (char*)malloc(691767);//動(dòng)態(tài)分配一塊空間來(lái)存儲(chǔ)讀到的數(shù)據(jù)int nlen = recv(_sock, byBuff, 691767, 0);if ((fp1 = fopen(pDest, "ab+")) != NULL){fwrite(byBuff, 691767, 1, fp1);//從數(shù)據(jù)存儲(chǔ)區(qū)向外讀數(shù)據(jù)memset(byBuff, 0, sizeof(byBuff));//存儲(chǔ)區(qū)清空f(shuō)close(fp1);}if (nlen > 0){printf("接收到數(shù)據(jù)\n");}// 4 關(guān)閉套節(jié)字closesocketclosesocket(_sock);//清除Windows socket環(huán)境WSACleanup();getchar();return 0; }UDP 服務(wù)端
#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:初始化網(wǎng)絡(luò)環(huán)境 WSADATA wsa;if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0){printf("WSAStartup failed\n");return -1;}//Step2:建立一個(gè)UDP的socket //建立socket參數(shù):socket(協(xié)議域,指定socket類(lèi)型,指定協(xié)議)(和TCP協(xié)議后兩個(gè)參數(shù)不同,都為IP協(xié)議族)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; // 協(xié)議簇為IPV4的 serverAddr.sin_port = htons(PORT); // 端口 因?yàn)楸緳C(jī)是小端模式,網(wǎng)絡(luò)是大端模式,調(diào)用htons把本機(jī)字節(jié)序轉(zhuǎn)為網(wǎng)絡(luò)字節(jié)序 serverAddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY); // ip地址,INADDR_ANY表示綁定電腦上所有網(wǎng)卡IP //bind(socket描述字, 綁定給listenfd的協(xié)議地址,地址長(zhǎng)度)bind(sock, (sockaddr*)&serverAddr, sizeof(sockaddr));//Step5:與客戶(hù)端進(jìn)行通信char buf[512];while (TRUE){memset(buf, 0, 512);// 網(wǎng)絡(luò)節(jié)點(diǎn)的信息,用來(lái)保存客戶(hù)端的網(wǎng)絡(luò)信息 sockaddr_in clientAddr;memset(&clientAddr, 0, sizeof(sockaddr_in));int clientAddrLen = sizeof(sockaddr);//接收客戶(hù)端發(fā)來(lái)的數(shù)據(jù) //recvfrom參數(shù):socket名稱(chēng),接收數(shù)據(jù)的緩沖區(qū),緩沖區(qū)大小,標(biāo)志位(調(diào)用操作方式),sockaddr結(jié)構(gòu)地址,sockaddr結(jié)構(gòu)大小地址//sockaddr地址用來(lái)保存從哪里發(fā)來(lái),和發(fā)送到哪里的地址信息int ret = recvfrom(sock, buf, 512, 0, (sockaddr*)&clientAddr, &clientAddrLen);//inet_ntoa函數(shù)轉(zhuǎn)化為ip,ntohs函數(shù)轉(zhuǎn)化為端口號(hào)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);//將文件指針移動(dòng)到文件末尾size_t size = ftell(fp1);//計(jì)算文件大小printf("文件大小%d \n", size);byBuff = (char*)malloc(size);//動(dòng)態(tài)分配一塊空間來(lái)存儲(chǔ)讀到的數(shù)據(jù)fseek(fp1, 0L, 0);//將文件指針移動(dòng)到文件頭部fileBytes = fread(byBuff, 1, size, fp1);// 發(fā)一個(gè)數(shù)據(jù)包返回給客戶(hù) //sendto參數(shù):socket名稱(chēng),發(fā)送數(shù)據(jù)的緩沖區(qū),緩沖區(qū)大小,標(biāo)志位(調(diào)用操作方式),sockaddr結(jié)構(gòu)地址,sockaddr結(jié)構(gòu)大小地址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));//存儲(chǔ)區(qū)清空f(shuō)close(fp1);}}return 0; }UDP 客戶(hù)端
#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:初始化網(wǎng)絡(luò)環(huán)境 WSADATA wsa;if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0){printf("WSAStartup failed\n");return -1;}//Step2:建立一個(gè)UDP的socket //建立socket參數(shù):socket(協(xié)議域,指定socket類(lèi)型,指定協(xié)議)(和TCP協(xié)議后兩個(gè)參數(shù)不同,都為IP協(xié)議族)SOCKET sockClient = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);if (sockClient == INVALID_SOCKET){printf("create socket failed\n");return -1;}// 申明一個(gè)網(wǎng)絡(luò)地址信息的結(jié)構(gòu)體,保存服務(wù)器的地址信息 sockaddr_in addr = { 0 };addr.sin_family = AF_INET; // 協(xié)議簇為IPV4的 addr.sin_port = htons(PORT); // 端口 因?yàn)楸緳C(jī)是小端模式,網(wǎng)絡(luò)是大端模式,調(diào)用htons把本機(jī)字節(jié)序轉(zhuǎn)為網(wǎng)絡(luò)字節(jié)序 addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); // 服務(wù)器的ip地址//Step3:與服務(wù)端進(jìn)行通信char buf[] = "client test!";//發(fā)送數(shù)據(jù) //sendto參數(shù):socket名稱(chēng),接收數(shù)據(jù)的緩沖區(qū),緩沖區(qū)大小,標(biāo)志位(調(diào)用操作方式),sockaddr結(jié)構(gòu)地址,sockaddr結(jié)構(gòu)大小地址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 接收服務(wù)器信息 recvFILE *fp1 = NULL; //指向源文件const char* pDest = "Dest.jfif";char *byBuff = NULL; //緩存byBuff = (char*)malloc(2908);//動(dòng)態(tài)分配一塊空間來(lái)存儲(chǔ)讀到的數(shù)據(jù)// 接收數(shù)據(jù) //recvfrom參數(shù):socket名稱(chēng),接收數(shù)據(jù)的緩沖區(qū),緩沖區(qū)大小,標(biāo)志位(調(diào)用操作方式),sockaddr結(jié)構(gòu)地址,sockaddr結(jié)構(gòu)大小地址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);//從數(shù)據(jù)存儲(chǔ)區(qū)向外讀數(shù)據(jù)memset(byBuff, 0, sizeof(byBuff));//存儲(chǔ)區(qū)清空f(shuō)close(fp1);}//Step4:關(guān)閉SOCKET連接 closesocket(sockClient);//清理網(wǎng)絡(luò)環(huán)境 WSACleanup();system("pause");return 0; }總結(jié)
以上是生活随笔為你收集整理的【开源项目】Socket服务端与客户端传输视频文件的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 彩信怎么打开
- 下一篇: 【OpenGL从入门到精通(二)】绘制一