C++使用socket传输图片
Client:
#include <WinSock2.h>
#include <Windows.h>
#include <stdio.h> #pragma comment(lib, "Ws2_32.lib")
#pragma warning(disable: 4996)
#define Port 6000 SOCKET Socket, Sub;
WSADATA Winsock;
sockaddr_in Addr;
sockaddr_in IncomingAddress;
int AddressLen = sizeof(IncomingAddress); BOOL send_function(BYTE* dib, int dib_size) { WSAStartup(MAKEWORD(, ), &Winsock); // Start Winsock if (LOBYTE(Winsock.wVersion) != || HIBYTE(Winsock.wVersion) != ) // Check version
{
WSACleanup();
return ;
} Socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); ZeroMemory(&Addr, sizeof(Addr));
Addr.sin_family = AF_INET;
Addr.sin_port = htons(Port);
bind(Socket, (sockaddr*)&Addr, sizeof(Addr)); if (listen(Socket, ) == SOCKET_ERROR)
{
printf("listening error\n");
}
else
{
printf("listening ok\n");
} if (Sub = accept(Socket, (sockaddr*)&IncomingAddress, &AddressLen))
{
char* ClientIP = inet_ntoa(IncomingAddress.sin_addr);
int ClientPort = ntohs(IncomingAddress.sin_port);
printf("Client conncted!\n");
printf("IP: %s:%d\n", ClientIP, ClientPort); printf("Sending data .. \n"); char bufsize[];
sprintf(bufsize, "%d", dib_size); send(Sub, (char*)bufsize, , );
send(Sub, (char*)dib, dib_size, ); closesocket(Sub);
closesocket(Socket);
WSACleanup();
}
} int main()
{
//HWND hwnd = GetWindow(GetForegroundWindow(), GW_HWNDLAST);
//RECT rc;
//GetWindowRect(hwnd, &rc);
//HDC hdcScreen = GetDC(NULL);
//HDC hdc = CreateCompatibleDC(hdcScreen);
//HBITMAP hbmp = CreateCompatibleBitmap(hdcScreen,
//rc.right - rc.left, rc.bottom - rc.top);
//SelectObject(hdc, hbmp);
//Print to memory hdc
//PrintWindow(hwnd, hdc, NULL);
HBITMAP Bitmap = (HBITMAP)LoadImage(NULL,
"panda.bmp", // file containing bitmap
IMAGE_BITMAP, // type = bitmap
, , // original size
LR_LOADFROMFILE);
auto hcopy = (HBITMAP)CopyImage(Bitmap, IMAGE_BITMAP, , , LR_CREATEDIBSECTION); BITMAP bm;
GetObject(hcopy, sizeof(bm), &bm); BITMAPINFOHEADER bi = { sizeof(bi) };
bi.biWidth = bm.bmWidth;
bi.biHeight = bm.bmHeight;
bi.biBitCount = bm.bmBitsPixel;
bi.biPlanes = bm.bmPlanes;
bi.biSizeImage = bm.bmWidthBytes * bm.bmHeight; LONG lineSize = bi.biWidth * bi.biBitCount / ;
BYTE* pLineData = new BYTE[lineSize];
BYTE* pStart;
BYTE* pEnd;
BYTE* pData = (BYTE*)bm.bmBits;
LONG lineStart = ;
LONG lineEnd = bi.biHeight - ;
while (lineStart < lineEnd)
{
pStart = pData + (lineStart * lineSize);
pEnd = pData + (lineEnd * lineSize);
// Swap the top with the bottom
memcpy(pLineData, pStart, lineSize);
memcpy(pStart, pEnd, lineSize);
memcpy(pEnd, pLineData, lineSize);
// Adjust the line index
lineStart++;
lineEnd--;
} int dib_size = sizeof(bi) + bi.biSizeImage;
memcpy(pData, &bi, sizeof(bi));
send_function(pData, dib_size); //cleanup
DeleteObject(hcopy);
delete pLineData;
getchar();
return ;
}
Server:
#include <WinSock2.h>
#include <Windows.h>
#include <stdio.h>
#include <gdiplus.h> using namespace Gdiplus;
#pragma comment (lib,"Gdiplus.lib") #pragma comment(lib, "Ws2_32.lib")
#pragma warning(disable: 4996) SOCKET Socket;
WSADATA Winsock;
sockaddr_in Addr;
int Addrlen = sizeof(Addr);
HBITMAP hbitmap; int GetEncoderClsid(const WCHAR* format, CLSID* pClsid)
{
UINT num = ; // number of image encoders
UINT size = ; // size of the image encoder array in bytes ImageCodecInfo* pImageCodecInfo = NULL; GetImageEncodersSize(&num, &size);
if (size == )
return -; // Failure pImageCodecInfo = (ImageCodecInfo*)(malloc(size));
if (pImageCodecInfo == NULL)
return -; // Failure GetImageEncoders(num, size, pImageCodecInfo); for (UINT j = ; j < num; ++j)
{
if (wcscmp(pImageCodecInfo[j].MimeType, format) == )
{
*pClsid = pImageCodecInfo[j].Clsid;
free(pImageCodecInfo);
return ; // Success
}
}
free(pImageCodecInfo);
return -; // Failure
} void receive_function(BYTE* dib, int dib_size)
{
BITMAPINFOHEADER* bi = (BITMAPINFOHEADER*)dib;
BYTE* bits = dib + sizeof(bi);
hbitmap = CreateBitmap(bi->biWidth, bi->biHeight, bi->biPlanes, bi->biBitCount, bits); /*OpenClipboard(NULL);
EmptyClipboard();
SetClipboardData(CF_BITMAP, hbitmap);
CloseClipboard();
printf("Clipboard set!");*/
} int main()
{
GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL); WSAStartup(MAKEWORD(, ), &Winsock); // Start Winsock if (LOBYTE(Winsock.wVersion) != || HIBYTE(Winsock.wVersion) != ) // Check version
{
WSACleanup();
return ;
} Socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); ZeroMemory(&Addr, sizeof(Addr)); // clear the struct
Addr.sin_family = AF_INET; // set the address family
Addr.sin_addr.s_addr = inet_addr("127.0.0.1");
Addr.sin_port = htons(); // set the port if (connect(Socket, (sockaddr*)&Addr, sizeof(Addr)) < )
{
printf("Connection failed !\n");
getchar();
return ;
} printf("Connection successful !\n"); printf("Receiving data .. \n"); int dib_size = ;
char Filesize[]; if (recv(Socket, Filesize, , )) // File size
{
dib_size = atoi(Filesize);
}
printf("File size: %d\n", dib_size); BYTE* dib = new BYTE[dib_size];
if (recv(Socket, (char*)dib, dib_size, ))
{
receive_function(dib, dib_size);
}
CLSID myClsId;
int retVal = GetEncoderClsid(L"image/bmp", &myClsId);
Bitmap *image = new Bitmap(hbitmap, NULL);
image->Save(L"output.bmp", &myClsId, NULL);
delete image; GdiplusShutdown(gdiplusToken); getchar();
return ;
}
C++使用socket传输图片的更多相关文章
- socket传输图片用shutdownoutput()之后无法继续传输数据
socket传输图片用shutdownoutput()之后无法继续传输数据前言java的socket是一个全双工套接字,任何的输入流或输出流的close()都会造成Socket关闭.使用java服务器 ...
- Android网络(3):HttpClient作client,Tomcat Servlet作server的交互演示样例
前面相继介绍了Android网络编程里的Socket传输图片.HttpURLConnection,今天看HttpClient. 第一部分:JavaEE版的Eclipse配置Tomcat [备注:开发后 ...
- java socket通信-传输文件图片--传输图片
ClientTcpSend.java client发送类 package com.yjf.test; import java.io.DataOutputStream; import java.io ...
- PC端使用opencv获取webcam,通过socket把Mat图像传输到android手机端
demo效果图: PC端 android端 大体流程 android端是服务器端,绑定IP和端口,监听来自PC端的连接, pc端通过socket与服务器andorid端传输图片. 主要代码 andro ...
- C# Socket 简易的图片传输
关于网络的数据传输我就是个小白,所以今天学习一下简易的Socket图片传输. 客户端和服务器的连接咱们上次已经学过了,咱们先从简易的文件传输入手.下面开始代码分析了. Server.cs using ...
- 基于 GCDAsyncSocket,简单实现类似《你猜我画》的 socket 数据传输
一.前言 Socket Socket 是对 TCP/IP 协议的封装,其中IP协议对应为网络层,TCP 协议对应为传输层,而我们常用的HTTP协议,是位于应用层,在七层模型中HTTP协议是基于 TCP ...
- PC_android通信之传输图片并显示在手机端【转】
从服务器 (PC 端 ) 发送图片到客户端 (android 手机端 ) ,并在手机页面上显示该图片.(注:本文旨在实现功能,并未考虑效率,有待后续跟进.) 1.服务器端 int port=9090; ...
- Socket 传一幅图片给另一个终端
练习Socket传文件,先添加一个组件,简化socket发送和接收文件, 获取IP和端口的类 public static class AddressHelper { /// <summary&g ...
- socket读写返回值的处理
在调用socket读写函数read(),write()时,都会有返回值.如果没有正确处理返回值,就可能引入一些问题 总结了以下几点 1当read()或者write()函数返回值大于0时,表示实际从缓冲 ...
随机推荐
- JavaScript数值千分位格式化的方法和性能
瞎掰的前提 前端嘛,经常处理数值和时间. 所以数值和时间的格式化少不了. 最近一直在面试前端, 就出了一个如何给数值添加千分位的面试题. 至于答案,我一直都有一种标准, 一是基于你现有的知识可以实现, ...
- Nginx代理与反向代理、负载均衡实
通过 Nginx 提供的反向代理和负载均衡功能,可以合理的完成业务的分配,提高网站的处理能力:同时利用缓存功能,还可以将不需要实时更新的动态页面输出结果,转化为静态网页形成缓存,从而提高网站的响应速度 ...
- DOM事件练习 II
select框联动效果 需求:当在textarea中输入内容,点击留言按钮,会添加到浏览器中,最新留言出现在最顶端. <!DOCTYPE html> <html lang=" ...
- caoz的梦呓:创业公司如何做好信息安全
猫宁!!! 参考链接:https://mp.weixin.qq.com/s/gCWjzHBRfbPFhNeg2VtFhA https://mp.weixin.qq.com/s/bmifCmD2CHV1 ...
- 如何将其它javaweb项目变成可以成功在自己eclipse环境中运行的javaweb项目?
说明:此文档仅适用于以下两种情况 (1)myeclipse项目需要在eclipse环境中运行 (2)eclipse项目,但是无法在自己的电脑eclipse环境中运行 注意:以下 ...
- 【Python开发】python读写文件,和设置文件的字符编码比如utf-8
一. python打开文件代码如下: f = open("d:\test.txt", "w") 说明: 第一个参数是文件名称,包括路径: 第二个参数是打开的模式 ...
- 【VS开发】【DSP开发】浅谈Linux PCI设备驱动(二)
我们在 浅谈Linux PCI设备驱动(一)中(以下简称 浅谈(一) )介绍了PCI的配置寄存器组,而Linux PCI初始化就是使用了这些寄存器来进行的.后面我们会举个例子来说明Linux PCI设 ...
- C++学习笔记-new与delete
C++新增了new和delete关键字,用来开辟内存,对应的就是C语言的malloc和free 对比new/delete和malloc/free malloc和free是库函数,以字节为单位申请堆内存 ...
- ip速度检测与云主机|VPS的抉择:bandwagonhost digitalocean hostWind Vultr Linode
最近的梯子断了,网站又被注销了.又到了挑vps的时间了.其实, 这些东西,烦死人了.挺浪费生命的. 首先速度测试, MTR测试 网站速度测试 17CE. http://tool.chinaz.com/ ...
- 使用PowerShell 修改hosts
直接上代码 # author:lttr <www.cnblogs.com/GoCircle> # date:2019-08-09[CmdletBinding()] param ( [Par ...