Bitmapa a winsock

0

Witam, chciałbym napisać aplikację która będzie przesyłać obraz.
Mam zamiar wykorzystać WinApi i teraz pytanie.
W jaki sposób to zrobić, ponieważ funkcje recv i send mają w swoich argumentach bufory typu *char i jak tam wpakować bitmapę?
Myślałem nad użyciem funkcji GetDIBits ale nie mogę pogodzić tego z send i recv, jakieś sugestie?
Dziękuję za pomoc i pozdrawiam

0

Mozesz recv i send uzyc, zreszta lap przyklad ;p
send.c

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <winsock2.h>
#include <windows.h>

void printLogo();

int main(int argc, char *argv[])
{
	printLogo();

	if(argc != 3)
	{
		printf(" Usage: send <file> <ip>\n");
		return 0;
	}

	FILE *fp;
	size_t len;
	BYTE *buff;

	WSADATA wsaData;
	DWORD version;
	SOCKET sock;
	struct sockaddr_in sin;

	fp = fopen(argv[1], "rb");
	if(fp == NULL)
	{
		printf("error: open file!\n");
		return -1;
	}

	fseek(fp, 0, SEEK_END);
	len = ftell(fp);
	rewind(fp);

	buff = (BYTE*)malloc(len*sizeof(BYTE));
	if(buff == NULL)
	{
		fclose(fp);
		return -1;
	}

	fread(buff, 1, len, fp);

	version = MAKEWORD(2,2);
	if(WSAStartup(version, &wsaData) == SOCKET_ERROR)
	{
		printf(" error: <%d> - winsock startup!\n", WSAGetLastError());
		free(buff);
		fclose(fp);
		return -1;
	}

	sock = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, 0);
	if(sock == INVALID_SOCKET)
	{
		printf(" error: <%d> - create socket!\n", WSAGetLastError());
		free(buff);
		WSACleanup();
		fclose(fp);		
		return -1;
	}

	memset(&sin, '\0', sizeof(struct sockaddr_in));
	sin.sin_family = AF_INET;
	sin.sin_port = htons(18087);
	sin.sin_addr.s_addr = inet_addr(argv[2]);

	if(connect(sock, (struct sockaddr*)&sin, sizeof(struct sockaddr)) == SOCKET_ERROR)
	{
		printf(" error: <%d> - connect!\n", WSAGetLastError());
		free(buff);
		WSACleanup();
		fclose(fp);		
		return -1;
	}

	if(send(sock, buff, len, 0) == SOCKET_ERROR)
	{
		printf(" error: <%d> - send!\n", WSAGetLastError());
		free(buff);
		WSACleanup();
		fclose(fp);
		return -1;
	}

	free(buff);
	WSACleanup();
	fclose(fp);

	return 0;
}

void printLogo()
{
	printf("\n\tsimple send file by t0m_k\n\n");
}

recv

#include <stdio.h>
#include <stdlib.h>
#include <winsock2.h>
#include <windows.h>

int main(void)
{
	FILE *fp;
	BYTE buff[1024];
	WSADATA wsaData;
	DWORD version;
	SOCKET sock, acc = INVALID_SOCKET;
	struct sockaddr_in sin, din;

	version = MAKEWORD(2,2);
	WSAStartup(version, &wsaData);

	sock = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, 0);

	memset(&sin, '\0', sizeof(struct sockaddr_in));
	sin.sin_family = AF_INET;
	sin.sin_port = htons(18087);
	sin.sin_addr.s_addr = htonl(ADDR_ANY);

	bind(sock, (struct sockaddr*)&sin, sizeof(struct sockaddr));

	listen(sock, 1);

	do {
		acc = accept(sock, NULL, NULL);
	} while(acc == INVALID_SOCKET);

	fp = fopen("dump.exe", "wb");

	size_t ret;
	while(ret = recv(acc, buff, 1024, 0))
		fwrite(buff, 1, ret, fp);

	fclose(fp);
	WSACleanup();

	return 0;
}
0

Obrazek przesyłasz tak samo jak inne dane. Trzymaj się protokołu by odpowiednio enkapsulować dane i gra gitara.

1 użytkowników online, w tym zalogowanych: 0, gości: 1