测试了利用socket传输一张图片,在同一台机器上两个进程通信
send.cpp
主要是socket用来connect一个服务器
#include <opencv2/opencv.hpp>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/tcp.h>
#include <netinet/in.h>
#include <netdb.h>
#include <errno.h>
#include <fstream>
#include <iostream>
#include <sstream>
using namespace std;
using namespace cv;
int main(int argc, char *argv[])
{
int my_socked, portno, n;
struct hostent *server;
portno = atoi(argv[1]);
my_socked = socket(AF_INET, SOCK_STREAM, 0);
if (my_socked < 0)
cout << "ERROR opening socket" << endl;
//NETWORK
struct sockaddr_in serv_addr;
bzero((char *) &serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(portno);
serv_addr.sin_addr.s_addr = inet_addr(argv[2]);//127.0.0.1
// re-use already bound address/port (if possible)
int optval = 1;
if (setsockopt(my_socked, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(int)) < 0)
cout << "Cannot set SO_REUSEADDR option on listen socket " << endl;
// set TCP_NODELAY for sure
optval = 1;
if (setsockopt(my_socked, IPPROTO_TCP, TCP_NODELAY, &optval, sizeof(int)) < 0)
cout << " Cannot set TCP_NODELAY option on listen socket" << endl;
if (connect(my_socked, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0)
cout << "ERROR connecting" << endl;
Mat img=imread("5.png",1);
//frame = (frame.reshape(0,1)); // to make it continuous
int imgSize =3*img.rows*img.cols;//640*480*3
// Send data here
int bytes = send(my_socked, img.data, imgSize, 0);
close(my_socked);
}
read.cpp
流程就是建立socket,然后bind一个地址,然后设置监听,然后另外一个socket用来accept。为啥过程是这样不是很懂
#include <opencv2/opencv.hpp>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/tcp.h>
#include <netinet/in.h>
#include <netdb.h>
#include <errno.h>
#include <fstream>
#include <iostream>
#include <sstream>
using namespace std;
using namespace cv;
int main(int argc, char *argv[]){
if (argc < 4) {
cout << "ERROR, no port provided" << endl;
return -1;
}
int sockfd, portno;
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0)
cout << "ERROR opening socket" << endl;
int reuse;
if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (char *)&reuse, sizeof(int)) == -1){
printf("Reuse port Error : %s\n", strerror(errno));
}
int optval = 1;
if (setsockopt(sockfd, IPPROTO_TCP, TCP_NODELAY, &optval, sizeof(int)) < 0)
cout << " Cannot set TCP_NODELAY option on listen socket" << endl;
struct sockaddr_in serv_addr, cli_addr;
bzero((char *) &serv_addr, sizeof(serv_addr));
portno = atoi(argv[1]);
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons(portno);
if (bind(sockfd, (struct sockaddr *) &serv_addr,
sizeof(serv_addr)) < 0)
cout << "ERROR on binding" << endl;
listen(sockfd,5);
socklen_t clilen;
clilen = sizeof(cli_addr);
int newsockfd = accept(sockfd,(struct sockaddr *) &cli_addr,&clilen);
if (newsockfd < 0)
cout << "ERROR on accept" << endl;
//SETUP OUTPUT
namedWindow( "Server", CV_WINDOW_NORMAL );// Create a window for display.
int bytes = 0, bytecount = 0;
Mat img;
int width = atoi(argv[2]);
int height = atoi(argv[3]);
int imgSize = 3*height*width;//921600;
uchar sockData[imgSize];
while(1){
img = Mat::zeros( height,width, CV_8UC3);
// for (int i = 0; i < imgSize; i += bytes) {
// if ((bytes = recv(newsockfd, sockData +i, imgSize - i, 0)) == -1) {
// cout<<"recv failed"<<endl;
// return -1;
// }
// }
//MSG_WAITALL
bytes = 0;
bytecount = 0;
for (int i = 0; i < imgSize; i += bytes) {
if ((bytes = recv(newsockfd, (sockData + i), imgSize - i, MSG_WAITALL)) == -1) {
cout << "recv failed" << endl;
return -1;
}
if (bytes == 0)
bytecount++;
if ( bytecount == 20) {
//cleanup();
cout<<"cleanup"<<endl;
return 0;
}
}
int ptr=0;
for (int i = 0; i < img.rows; i++) {
for (int j = 0; j < img.cols; j++) {
img.at<cv::Vec3b>(i,j) = cv::Vec3b(sockData[ptr+ 0],sockData[ptr+1],sockData[ptr+2]);
ptr=ptr+3;
}
}
imshow( "Server", img );
waitKey(0);
// if (waitKey(0) == 27)
// {
// break;
// }
}
close(newsockfd);
close(sockfd);
return 0;
}