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
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.