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基础入门04
目录 JavaScript 基础入门04 JavaScript 对象 介绍 关于键名 对象的引用 语句和表达式需要注意的地方 对象属性常见的操作 with语句 JSON 特点 语法规则 JSON合法示 ...
- CornerNet-Lite算法笔记
论文名称:CornerNet-Lite: Efficient Keypoint Based Object Detection 论文链接:https://arxiv.org/abs/1904.08900 ...
- Docker管理面板-URLOS(易用、高效、强大)
一.介绍 URLOS是一个Docker管理面板,它把服务器端软件应用的安装行为简化到极致,堪称服务器端的应用宝,具有集群管理.自动故障转移.自动负载均衡等高级功能,可轻易搭建7*24小时在线的网站运行 ...
- 浏览器渲染优化4(styles and layout)
你已经学会了查找和解决问题.希望你的js能正常运行了,但这只是制作帧的一小部分.在这节课里,你将处理样式,也就是像开发工具里标记的那样,重新计算样式.学完这节课后,你将学会从样式计算过程中找到性能问题 ...
- 如何用快排思想在O(n)内查找第K大元素--极客时间王争《数据结构和算法之美》
前言 半年前在极客时间订阅了王争的<数据结构和算法之美>,现在决定认真去看看.看到如何用快排思想在O(n)内查找第K大元素这一章节时发现王争对归并和快排的理解非常透彻,讲得也非常好,所以想 ...
- PTA(Basic Level)1057.数零壹
给定一串长度不超过 105 的字符串,本题要求你将其中所有英文字母的序号(字母 a-z 对应序号 1-26,不分大小写)相加,得到整数 N,然后再分析一下 N 的二进制表示中有多少 0.多少 1.例如 ...
- POJ - 1149 PIGS (建图思维+最大流)
(点击查看原题) 题目分析 (以下均为 Edelweiss 大佬的思路,博主承认自己写不了这么好,但是学习的心促使我记录下这个好题的写法,所以代码是我写的) [题目大意] 有 M 个猪圈,每个猪圈里初 ...
- git diff 命令介绍
https://www.jianshu.com/p/6e1f7198e76a https://www.jianshu.com/p/5b6a014ac3db https://blog.csdn.net/ ...
- python-连接mysql实例
import pymysql # 创建连接 conn = pymysql.connect(host='192.168.71.140', port=3306, user='root', passwd=' ...
- 关于echarts中南海诸岛的显示问题
1.china.js 文件中 echarts.registerMap('china', //名字要是'china',不能写成'中国' 2.echarts 配置中地图名称 mapName: ...