socket和多线程
server.cpp
// server.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <Winsock2.h>
#pragma comment(lib,"ws2_32.lib")
#include <opencv2\opencv.hpp>
#pragma comment(lib,"ws2_32.lib")
#pragma comment(lib,"opencv_core246d.lib")
#pragma comment(lib,"opencv_highgui246d.lib")
int main(int argc, char* argv[])
{
IplImage *pImg = cvLoadImage("D:\\Project\\test_image\\1.bmp",CV_LOAD_IMAGE_GRAYSCALE);
IplImage* pImgSmall = 0;
pImgSmall = cvCreateImage(cvSize(320,240),IPL_DEPTH_8U,1);
cvResize(pImg,pImgSmall);
char *pdata = pImgSmall->imageData;
int step = pImgSmall->widthStep;
char sendBuf[320*240];
for (int i = 0; i < 240; i++)
{
for (int j = 0; j < 320; j++)
{
sendBuf[j+i*320] = pdata[i*step + j];
}
}
/***************/
//加载winsock库
WSADATA wsaData;
WORD sockVersion = MAKEWORD(2,2);
if(WSAStartup(sockVersion,&wsaData)!=0)
return 0;
//创建套接字
SOCKET sServer = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); //创建socket
if(sServer==INVALID_SOCKET)
{
printf("socket error\n");
return 0;
}
//socket中装入地址信息
sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port = htons(1129);
sin.sin_addr.S_un.S_addr = INADDR_ANY;
//bind套接字
if(bind(sServer,(LPSOCKADDR)&sin,sizeof(sin)) == SOCKET_ERROR) //绑定bind
{
printf("bind error!\n");
return 0;
}
//listen模式
if(listen(sServer,5) == SOCKET_ERROR) //监听listen
{
printf("listen error!\n");
closesocket(sServer);
return 0;
}
//循环接受连接请求
sockaddr_in remoteAddr;
SOCKET sClient;
int nAddrLen=sizeof(SOCKADDR_IN);
/**************************/
while(1)
{
int index = 0;
//等待客户请求的到来
sClient = accept (sServer,(SOCKADDR*)&remoteAddr,&nAddrLen); //接受accept(阻塞) 等待请求
if(sClient==INVALID_SOCKET)
{
printf("accept error\n");
continue;
}
// printf("接受来自%s的连接.\n",inet_ntoa(remoteAddr.sin_addr));
//分批发送数据
char SendData[513];
while(true)
{
memset(SendData, 0, sizeof(SendData));
for(int i = 0; i<=511; i++)
{
SendData[i] = sendBuf[i+index];
}
SendData[512] = '\0';
send(sClient,SendData,513,0); //发送
index = index + 512;
if(index == 76800)
{
break;
}
}
//关闭套接字(链接)
closesocket(sClient);
}
//关闭套接字
closesocket(sServer);
WSACleanup();
return 0;
}
client.cpp
// client.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <Winsock2.h>
#include <Windows.h>
#include <opencv2\opencv.hpp>
#pragma comment(lib,"ws2_32.lib")
#pragma comment(lib,"opencv_core246d.lib")
#pragma comment(lib,"opencv_highgui246d.lib")
#pragma comment(lib,"ws2_32.lib")
#include <stdio.h>
#define PORT 1129
#define ADDRESS "127.0.0.1"
DWORD WINAPI NetProc(
LPVOID lpParameter // thread data
);
DWORD WINAPI VideoProc(
LPVOID lpParameter // thread data
);
HANDLE hMutex;
char recvBuf[320*240];
int require=0;
int imageIndex=0;
int main(int argc, char* argv[])
{
//加载winsock库
WSADATA wsaData;
WORD sockVersion = MAKEWORD(2,2);
if(WSAStartup(sockVersion,&wsaData)!=0)
return 0;
HANDLE hThread1;
HANDLE hThread2;
//创建互斥对象
hMutex = CreateMutex(NULL,NULL,NULL); //第二个参数为TRUE,主线程拥有互斥对象
//创建线程
hThread1=CreateThread(NULL,0,NetProc,NULL,0,NULL);
hThread2=CreateThread(NULL,0,VideoProc,NULL,0,NULL);
CloseHandle(hThread1);
CloseHandle(hThread2);
Sleep(1000*1000);
WSACleanup();
return 0;
}
DWORD WINAPI NetProc(
LPVOID lpParameter // thread data
)
{
while(1)
{
WaitForSingleObject(hMutex,INFINITE); //等待hMultex处于有信号状态
printf("怎么回事1\n");
//创建套接字
SOCKET sClient = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); //创建socket
if(sClient==INVALID_SOCKET)
{
printf("socket error\n");
return 0;
}
//socket中装入远程地址信息
SOCKADDR_IN remote; //服务器地址信息
remote.sin_family = AF_INET;
remote.sin_port = htons(1129);
remote.sin_addr.S_un.S_addr = inet_addr(ADDRESS);
//向服务器发送连接请求
if(connect(sClient,(SOCKADDR *)&remote,sizeof(SOCKADDR))==SOCKET_ERROR) //连接connet
{
printf("connect error\n");
closesocket(sClient);
return 0;
}
//接收数据(分段接收数据)
int index =0;
while(true)
{
char revData[513];
int value = recv(sClient,revData,513,0);//接收recv
printf("接受到的字节大小: %d\n",value);
revData[512]='\0';
for(int i=0; i<=511;i++)
{
recvBuf[i+index] = revData[i];
}
index = index + 512;
if(index == 76800)
break;
}
//关闭套接字
closesocket(sClient);
ReleaseMutex(hMutex);
require++ ;
if(require == 200)
break;
}
return 0;
}
DWORD WINAPI VideoProc(
LPVOID lpParameter // thread data
)
{
while(1)
{
int flag =1;
if(flag ==1)
{
Sleep(1);
flag = 0;
}
WaitForSingleObject(hMutex,INFINITE);
printf("怎么回事2\n");
static IplImage* pImgSmall = 0;
if(!pImgSmall)
{
pImgSmall = cvCreateImage(cvSize(320,240),IPL_DEPTH_8U,1);
}
char* pdata = pImgSmall->imageData;
char* pd = recvBuf;
int step = pImgSmall->widthStep;
for(int i=0; i<240; ++i)
{
for(int j=0; j<320; ++j)
{
pdata[i*step+j] = pd[j+i*320];
}
}
//cvShowImage("Image",pImgSmall);
char cChar[255];
sprintf(cChar,"c:\\xueba\\%d%s",++imageIndex,".bmp");
cvSaveImage( cChar, pImgSmall); //保存一帧图片
ReleaseMutex(hMutex);
if(require == 20)
break;
}
return 0;
}