Skip to content
Snippets Groups Projects
PruebaOpenCV.cpp 5.11 KiB
Newer Older
/*
using namespace cv;
using namespace std;

#include <opencv2/opencv.hpp>
#include <iostream>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <sys/socket.h>

#define BUFLEN 1048576 //1024*1024  //Max length of buffer
#define MAX_QUEUE 10
#define PORT 8890   //The port on which to listen for incoming data



int pruebaRecibirUDP();
int pruebaRecibirTCP();

int main() {
	cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!!

	pruebaRecibirTCP();

	return 0;
}

void die(char *s)
{
    perror(s);
    exit(1);
}

int pruebaRecibirUDP();
int pruebaRecibirTCP();

int pruebaRecibirTCP() {
    char buf[BUFLEN];

	//primitiva SOCKET
	int server_socket = socket(AF_INET, SOCK_STREAM, 0);


    //primitiva BIND
    struct sockaddr_in server_addr;
    socklen_t server_addr_size = sizeof server_addr;
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(PORT);
    server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
    bind(
       server_socket,
       (struct sockaddr*)&server_addr, server_addr_size
    );

    cout << "Waiting for connection..." << endl;

	//primitiva LISTEN
	listen(server_socket, MAX_QUEUE);

	//primitiva ACCEPT
	struct sockaddr_in client_addr;
	socklen_t client_addr_size = sizeof client_addr;
	int socket_to_client = accept(
		 server_socket,
		 (struct sockaddr *)&client_addr, &client_addr_size
	);

    char delimiter[] = "Grupo25";
    char recibido[BUFLEN];

	int fin = 0; // Mantiene el indice de los bytes recibidos.

    int received_data_size = 1;
    while(received_data_size > 0)
    {

        //primitiva RECEIVE
        int data_size = BUFLEN;

		received_data_size = recv(socket_to_client, buf, data_size, 0);

		//print details of the client/peer and the data received
		//printf("\nReceived packet from %s:%d\n", inet_ntoa(si_other.sin_addr), ntohs(si_other.sin_port));
		cout << "Datos recibidos: " << received_data_size  << endl;


		// en el arrray recibido se mantiene los datos que ya exisitian mas los nuevos.
		for(int j = 0; j < received_data_size; j++) {
			recibido[fin+j] = buf[j];
		}
		fin = fin + received_data_size;
		//cout << "fin: " << fin << endl;

		int inicio = 0;
		int found = -1;
		while ((found = findPosDelimiter(recibido, fin+1, delimiter, inicio)) != -1) {
			char jpg[found-inicio];

			//cout << "encontre delimitador en pos: " << found << endl;

			for (int h = 0; h < found-inicio; h++) {
				jpg[h] = recibido[inicio+h];
			}

			cout << "nuevo jpg size: " << sizeof(jpg) << endl;

	        namedWindow("cliente", CV_WINDOW_AUTOSIZE);

	        Mat rawData = Mat(1, found, CV_8UC1, jpg);
	        Mat frame = imdecode(rawData, CV_LOAD_IMAGE_COLOR);

	        imshow("cliente", frame);

			waitKey(1000/30);

			inicio = found + sizeof(delimiter)-1;
		}

		if (inicio != 0) {
			// mueve los datos recibidos al inicio, quitando el (o los) frame dibujado y el delimitador
			for (int d = inicio; d < fin+1; d++) {
				recibido[d-inicio] = recibido[d];
			}
			fin = fin-inicio;
			//cout << "nuevo fin: " << fin << endl;
		}

    }

	//primitiva CLOSE
	//close(socket_to_client);

    close(server_socket);
    return 0;
}

int findPosDelimiter(const char *array, int len, char * delimiter, int inicio) {
	int i = -1;
	int pos = 0;
	for (i = inicio; i<len; i++) {
		if (sizeof(delimiter)-1 == pos) {
			if (array[i] == delimiter[pos]) {
				return i - sizeof(delimiter) + 2;
			} else {
				pos=0;
			}
		} else {
			if (array[i] == delimiter[pos]) {
				pos++;
			} else {
				pos=0;
			}
		}
	}
	return -1;
}

int pruebaRecibirUDP(){
    struct sockaddr_in si_me, si_other;

    int s, slen = sizeof(si_other) , recv_len;
    char buf[BUFLEN];

    //create a UDP socket
    if ((s=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1)
    {
        die("socket");
    }

    // zero out the structure
    memset((char *) &si_me, 0, sizeof(si_me));

    si_me.sin_family = AF_INET;
    si_me.sin_port = htons(PORT);
    si_me.sin_addr.s_addr = htonl(INADDR_ANY);

    //bind socket to port
    if( bind(s , (struct sockaddr*)&si_me, sizeof(si_me) ) == -1)
    {
        die("bind");
    }

    socklen_t server_addr_size = sizeof si_other;

    //keep listening for data
    while(1)
    {
        printf("Waiting for data...");
        fflush(stdout);

        //try to receive some data, this is a blocking call
        if ((recv_len = recvfrom(s, buf, BUFLEN, 0, (struct sockaddr *) &si_other, &server_addr_size)) == -1)
        {
            die("recvfrom()");
        }

        //print details of the client/peer and the data received
        printf("\nReceived packet from %s:%d\n", inet_ntoa(si_other.sin_addr), ntohs(si_other.sin_port));
        printf("Tamanio Data: %d\n", sizeof(buf));

        namedWindow("cliente", CV_WINDOW_AUTOSIZE);

        Mat rawData = Mat(1, sizeof(buf), CV_8UC1, buf);
        Mat frame = imdecode(rawData, CV_LOAD_IMAGE_COLOR);

        imshow("cliente", frame);
        waitKey(1000/30);

        //now reply the client with the same data

        //if (sendto(s, buf, recv_len, 0, (struct sockaddr*) &si_other, slen) == -1)
        //{
        //    die("sendto()");
        //}

    }

    close(s);
    return 0;
}
*/