TCP-socket(3)

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;

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值