Variable Bildgrößen Übertragung über Socket



  • Hallo

    habe leider gerade eine Denkblockade.
    Der Grundgedanke ist das ein Client ein Bild an den Server über einen Socket sendet.
    Allerdings hab ich probleme damit die Pixelanzahl variabel zu halten.

    Client:

    void sendImg(CByteImage *img, int width, int height) {	
    	int sock;
    	struct sockaddr_in echoserver;
    
    	// Create the TCP socket 
    	if ((sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) {
    		printf("Failed to create socket");
    	}
    
    	// Construct the server sockaddr_in structure 
    	memset(&echoserver, 0, sizeof(echoserver));			// Clear struct 
    	echoserver.sin_family = AF_INET;					// Internet/IP 
    	echoserver.sin_addr.s_addr = inet_addr(SERVERADDR);	// IP address 
    	echoserver.sin_port = htons(atoi(DISPLAYSERVERPORT));	// Server port 
    
    	// Establish connection 
    	if (connect(sock,(struct sockaddr *) &echoserver,sizeof(echoserver)) < 0) {
    		printf("Failed to connect with server");
    	}
    
    	char send_data[width*height];
    	for(int i=0; i<(width*height); i++) {
    		send_data[i]= img->pixels[i];
    	}
    
    	// Send the word to the server 
    	if (send(sock, send_data, width*height, 0) != width*height) {
    		printf("Mismatch in number of sent bytes");
    	} else {
    		printf("Image send\n");
    	}
    }
    

    Server:

    CByteImage HandleClient(int sock) {
    
    	std::vector<unsigned char>  received_data;
    	received_data.reserve(320*240);
    
    	unsigned char buffer[BUFFSIZE];
    
    	int received = -1;
    
    	/* Receive message */
    	if ((received = recv(sock, buffer, BUFFSIZE, 0)) < 0) {
    		printf("Failed to receive initial bytes from client");
    	} else {
    		for (unsigned int j = 0; j < received; ++j) {
    			received_data.push_back( buffer[j] );
    		}
    	}
    
    	/* check for more incoming data in loop */
    	while (received > 0) {
    		if ((received = recv(sock, buffer, BUFFSIZE, 0)) < 0) {
    			printf("Failed to receive additional bytes from client");
    		} else {
    			for (unsigned int j = 0; j < received; ++j) {
    				received_data.push_back( buffer[j] );
    			}
    		}		
    	}
    
    	CByteImage rcamImg = new CByteImage(320, 240, CByteImage::eGrayScale);
    	//CByteImage rrecImg = new CByteImage(40, 40, CByteImage::eGrayScale);
    
    	for(int j=0; j <(320*240); j++) {
    	    rcamImg.pixels[j] = received_data[j];
    	}
    
    	std::string filename = "temp/imgcam";
    	std::string end = ".bmp";
    	std::stringstream str;
    	str << filename << bildno << end;
    	filename = str.str();
    
    	bool written = false;
    
    	written = rcamImg.SaveToFile(filename.c_str());
    
    	printf("%s\n",filename.c_str());
    
    	bildno++;
    
    	close(sock);
    
    	return rcamImg;
    }
    

    Für Bilder mit der größe 320*240 funktioniert es wunderbar. Allerdings sollen auch andere größen wie z.b. 40*40 möglich sein. Kann ich irgendwie herausfinden wieviele pixel empfangen wurden oder gibt es ganz andere Ansätze? Selbst wenn ich weiß wieviele Pixel übertragen wurde weiß ich ja nicht wie diese anzuordnen sind.

    MfG Jens



  • Wenn du die Größe nicht einfach mitsenden möchtest, könntest du rand() verwenden und hoffen, dass das richtige herauskommt.



  • ah das ist natürlich eine idee die größe mitzusenden 🙂


Anmelden zum Antworten