怎么提高recv()的速度

kmij261 2016-10-19 07:49:09
用socket发送文件,局域网,测试文件是大约100k的图片,发送端需要40ms左右,但是接收的时候单是recv()就需要600ms。。。两边都是阻塞模式。不知道怎么改进。。代码如下


#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.108"
#define BUFFER_SIZE 4096
#define FILE_NAME_MAX_SIZE 512
#pragma comment(lib, "WS2_32")

double rate = 2.0;//视频帧率
Size videosize(640,480);

int64 startTime ;//开始运行程序时的时钟周期数
double duration;//运行到现在所用时间

const string &filename="objtr";//文件名
const string &ext = ".jpg";//文件后缀名
void 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, IPPROTO_TCP);
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;

duration = timeCost(startTime);
recvFile(file_name,clientSocket);//接收并写入文件
duration = timeCost(startTime)- duration;
cout << "文件 "<<file_name<< "接收成功,"<< "接收文件所用时间:" << duration << "s" <<endl;

Mat frame = imread(file_name);
if (frame.empty())
cout<< "图片读取失败" <<endl;
return -2;

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;
}

void 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*300];

while(true)
{
recvLen=recv(clientSocket,recvBuffer,BUFFER_SIZE, 0);
if((recvLen==1)&&(recvBuffer[0]=='#'))//"#"为服务器发送文件结束标志
break;
else
{
memcpy(buffer+recvedLen,recvBuffer,recvLen);
recvedLen += recvLen;
}
}
printf("已经接收%i字节数据\n",recvedLen);

cout << "开始写入" <<endl;
FILE *fp = NULL;
if((fp = fopen(file_name,"wb")) == NULL)
{
cout << "文件 "<<file_name<< "接收成功" <<endl;
exit(1);
}

retval = fwrite(buffer, recvedLen, 1, fp);
fclose(fp);

}

double timeCost(int64 beginTime)
{
double duration;
duration = (getTickCount()-beginTime)/getTickFrequency();

return duration ;
}

...全文
1467 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
56625079 2018-08-14
  • 打赏
  • 举报
回复
用非阻塞模式试试?

679

社区成员

发帖
与我相关
我的任务
社区描述
智能路由器通常具有独立的操作系统,包括OpenWRT、eCos、VxWorks等,可以由用户自行安装各种应用,实现网络和设备的智能化管理。
linuxpython 技术论坛(原bbs)
社区管理员
  • 智能路由器社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧