之前学过点socket编程,但是忘得差不多了,最近又重新看了一下。看本文章的人可以先了解一下socket编程的基本过程,网上有很多,博主在此就不赘述了。
直接上干货。方便刚学socket 使用opencv的新人。注:首先需要配置opencv的环境才可用啊。高手勿喷!
博主用的环境为:opencv2.4.13 + vs2013
客户端的程序:
#include <WINSOCK2.H>
#include <iostream>
#include <stdio.h>
#include <cv.h>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace cv;
using namespace std;
#pragma comment(lib,"ws2_32.lib")
int main(int argc, char* argv[])
{
WORD sockVersion = MAKEWORD(2, 2);
WSADATA data;
if (WSAStartup(sockVersion, &data) != 0)
{
return 0;
}
SOCKET sclient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sclient == INVALID_SOCKET)
{
printf("invalid socket !\n");
return 0;
}
sockaddr_in serAddr;
serAddr.sin_family = AF_INET;
serAddr.sin_port = htons(8888);
serAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
if (connect(sclient, (sockaddr *)&serAddr, sizeof(serAddr)) == SOCKET_ERROR)
{
printf("connect error !\n");
closesocket(sclient);
return 0;
}
//读取图像并发送
Mat M1 = imread("D:\\lena.bmp",0);//载入图片
Mat M2(M1.rows, M1.cols, CV_8UC1); //放置灰度图像
printf("%d*%d\n", M1.rows, M2.cols);
M2 = M1.clone();
int i, j;
char sendData[1000000] = "";
cvNamedWindow("client", 1);
for (i = 0; i < M1.rows; i++)
{
uchar *data = M2.ptr<uchar>(i);
for (j = 0; j < M1.cols; j++)
{
sendData[M1.rows * i + j] = (char)data[j];
}
}
imshow("client", M1);
send(sclient, sendData, 1000000, 0);//发送
cvWaitKey(0);//任意键发送
cvDestroyWindow("client");
closesocket(sclient);
WSACleanup();
return 0;
}
服务端的程序:
#include <stdio.h>
#include <winsock2.h>
#include <cv.h>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#pragma comment(lib,"ws2_32.lib")
using namespace std;
using namespace cv;
int main(int argc, char* argv[])
{
//初始化WSA
WORD sockVersion = MAKEWORD(2, 2);
WSADATA wsaData;
if (WSAStartup(sockVersion, &wsaData) != 0)
{
return 0;
}
//创建套接字
SOCKET slisten = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (slisten == INVALID_SOCKET)
{
printf("socket error !");
return 0;
}
//绑定IP和端口
sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port = htons(8888);//端口8888
sin.sin_addr.S_un.S_addr = INADDR_ANY;
if (bind(slisten, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR)
{
printf("bind error !");
}
//开始监听
if (listen(slisten, 5) == SOCKET_ERROR)
{
printf("listen error !");
return 0;
}
//循环接收数据
SOCKET sClient;
sockaddr_in remoteAddr;
int nAddrlen = sizeof(remoteAddr);
printf("等待连接...\n");
do
{
sClient = accept(slisten, (SOCKADDR *)&remoteAddr, &nAddrlen);
} while (sClient == INVALID_SOCKET);
printf("接受到一个连接:%s \r\n", inet_ntoa(remoteAddr.sin_addr));
char revData[1000000] = "";
Mat M(256, 256, CV_8UC1);//接收灰度图像
uchar *p = (uchar *)M.data;
int i, j;
int ret;
while (true)
{
//接收数据
ret = recv(sClient, revData, 1000000, 0);
if (ret > 0)
{
revData[ret-1] = '\0';
for (i = 0; i < M.rows; i++)
{
uchar *data = M.ptr<uchar>(i);
for (j = 0; j < M.cols; j++)
{
data[j] = (uchar)revData[M.rows * i + j];
//cout << (int)data[j] << " ";
}
cout << endl;
}
ret = 0;
}
imshow("sevice", M);
cvWaitKey(0);
}
cvDestroyWindow("server");
closesocket(slisten);
WSACleanup();
return 0;
}