679
社区成员
发帖
与我相关
我的任务
分享
#include"stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <WinSock2.h>
#include"iostream"
#include"opencv2/opencv.hpp"
using namespace cv;
using namespace std;
#define PORT 8000
#define SERVER_IP "192.168.1.107"
#define BUFFER_SIZE 4096
#define FILE_NAME_MAX_SIZE 512
#pragma comment(lib, "WS2_32")
double rate = 1.0;//视频帧率
Size videosize(640,480);
int64 startTime ;//开始运行程序时的时钟周期数
double duration;//运行到现在所用时间
const string &filename="objtr";//文件名
const string &ext = ".jpg";//文件后缀名
int recvFile(char file_name[FILE_NAME_MAX_SIZE], SOCKET clientSocket);
double timeCost(int64 beginTime);
int main()
{
int i=1;
//创建视频写入实例
VideoWriter writer("VideoTest.avi", CV_FOURCC('M', 'J', 'P', 'G'), rate,videosize);
stringstream ss;
char file_name[FILE_NAME_MAX_SIZE+1];
memset(file_name,0,FILE_NAME_MAX_SIZE+1);
// 初始化socket dll
WSADATA wsaData;
WORD socketVersion = MAKEWORD(2, 0);
if(WSAStartup(socketVersion, &wsaData) != 0)
{
printf("Init socket dll error!");
exit(1);
}
//创建socket
SOCKET clientSocket = socket(AF_INET, SOCK_STREAM, 0);
if (SOCKET_ERROR == clientSocket)
{
printf("Create Socket Error!");
system("pause");
exit(1);
}
cout << "创建socket成功" <<endl;
//指定服务端的地址
sockaddr_in server_addr;
server_addr.sin_family = AF_INET;
server_addr.sin_addr.S_un.S_addr = inet_addr(SERVER_IP);
server_addr.sin_port = htons(PORT);
if (SOCKET_ERROR == connect(clientSocket, (LPSOCKADDR)&server_addr, sizeof(server_addr)))
{
printf("Can Not Connect To Server IP!\n");
system("pause");
exit(1);
}
cout << "连接服务器成功" <<endl;
while(1)
{
startTime = getTickCount();//读取系统周期数
ss << filename << i << ext ;
ss >> file_name;
int writen;//判断写入是否成功
writen = recvFile(file_name,clientSocket);//写入文件
if(!writen)
{
break;
}
cout << "文件 "<<file_name<< "接收成功" <<endl;
Mat frame = imread(file_name);
writer << frame;
imshow("display",frame);
send(clientSocket,"~", 1, 0);
ss.clear();
i++;
duration = timeCost(startTime);
cout<< "本次用时:" << duration << "s" <<endl<<endl;
}
closesocket(clientSocket);
//释放winsock库
WSACleanup();
return 0;
}
int recvFile(char file_name[FILE_NAME_MAX_SIZE+1], SOCKET clientSocket)
{
int recvLen=0;//收到的缓冲的长度
int recvedLen=0;//当前已经收到的长度
char* buffer;//文件缓冲
char recvBuffer[BUFFER_SIZE];//接收缓冲区
int retval;
buffer=new char[1024*150];
recvLen=recv(clientSocket,recvBuffer,BUFFER_SIZE,0);
if(recvBuffer[0]=='~')
{
printf("开始接收文件\n");
memset(recvBuffer,0,BUFFER_SIZE);
}
duration = timeCost(startTime);
while(true)
{
recvLen=recv(clientSocket,recvBuffer,BUFFER_SIZE,0);
if(!recvLen)
break;
else
{
memcpy(buffer+recvedLen,recvBuffer,recvLen);
recvedLen += recvLen;
}
}
printf("已经接收%i字节数据\n",recvedLen);
duration = timeCost(startTime)- duration;
cout<< "recv所用时间:" << duration << "s" <<endl;
cout << "开始写入" <<endl;
FILE *fp;
if((fp = fopen(file_name,"wb")) == NULL)
{
exit(1);
}
retval = fwrite(buffer, recvedLen, 1, fp);
printf("写入文件长度:%u\n",recvedLen);
fclose(fp);
return retval;
}
double timeCost(int64 beginTime)
{
double duration;
duration = (getTickCount()-beginTime)/getTickFrequency();
return duration ;
}