博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
TCP-socket(3)
阅读量:4148 次
发布时间:2019-05-25

本文共 5029 字,大约阅读时间需要 16 分钟。

socket和多线程

server.cpp

// server.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include 
#pragma comment(lib,"ws2_32.lib")#include
#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 
#include
#include
#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
#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;}

转载地址:http://ubpti.baihongyu.com/

你可能感兴趣的文章
九度:题目1012:畅通工程
查看>>
九度:题目1017:还是畅通工程
查看>>
九度:题目1034:寻找大富翁
查看>>
第六章 背包问题——01背包
查看>>
51nod 分类
查看>>
1136 . 欧拉函数
查看>>
面试题:强制类型转换
查看>>
Decorator模式
查看>>
Template模式
查看>>
Observer模式
查看>>
高性能服务器设计
查看>>
性能扩展问题要趁早
查看>>
MySQL-数据库、数据表结构操作(SQL)
查看>>
OpenLDAP for Windows 安装手册(2.4.26版)
查看>>
图文介绍openLDAP在windows上的安装配置
查看>>
Pentaho BI开源报表系统
查看>>
Pentaho 开发: 在eclipse中构建Pentaho BI Server工程
查看>>
JSP的内置对象及方法
查看>>
android中SharedPreferences的简单例子
查看>>
android中使用TextView来显示某个网址的内容,使用<ScrollView>来生成下拉列表框
查看>>