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时,表示实际从缓冲 ...
随机推荐
- 《Linux命令行大全》 笔记记录
1.Shell是什么 2.(文件目录)导航 3.Linux系统 4.操作文件和目录 5.命令的使用 6.重定向 7.透过shell看世界 扩展 引用 8.高级键盘技巧 9.权限 10.进程 11.环境 ...
- JAVA -数据类型与表达式---数据类型转换
数据类型转换技术 Java中,数据转换的方式有三种:*赋值类型转换*提升类型转换*强制类型转换 1.赋值类型转换 当需要将一个类型的值赋给另一种类型的变量时,该值将被转换为新类型的值,此时就发生了赋值 ...
- win10任务切换变卡
问题:更新之前没有任何问题,用alt+tab是秒切,更新后切换任务后会黑屏一两秒然后才转到切换页面 解决方法:关闭服务“system interface foundation service”
- 看某视频开始做LINUX笔记的第一天
LINUX系统对分区的基本要求: 1.最少要有一个根分区 / 分区,用来存放系统文件及程序.其大小至少在5GB以上. 2.要有一个 swap (交换)分区,它的作用相当与windows的虚拟内存,sw ...
- CentOS7安装Git-2.22.1
1.Git: 分布式版本控制系统(最初用于Linux),每个人的电脑上都是一个完整的版本库,具有强大的分支管理. 自己可以在脱机环境查看开发的版本历史 多人开发时如果充当中央仓库的Git仓库挂了,任何 ...
- Python中的 _init__和 _new__的区别
使用python 的面向对象写过程序之后,相信童鞋对 __init__ 方法已经非常的熟悉了.这个方法通常是 在初始化一个实例的时候使用的. 例如: class MysqlConnector(obje ...
- 第一次编译ffmpeg
今天开始玩ffmpeg了. 从官网下载来的压缩包,不会编译诶,于是我开始研究起来了. 下面就是实时记录的随笔: 首先是从官网下载来的ffmpeg,就是下面这个版本,目前的最新版吧. http://ff ...
- Django之自定义标签,过滤器,以及inclusion_tag
目录 Django之自定义标签,过滤器,以及inclusion_tag 自定义过滤器 自定义标签 inclusion_tag inclusion_tag() 项目实例: inclusion_tag() ...
- MySQL中的SQL的常见优化策略
MySQL中的SQL的常见优化策略 MySQL中的索引优化 MySQL中的索引简介 1 避免全表扫描对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索 ...
- deepin 15.10.1 GTX1060 NVIDIA 驱动安装,双屏显示问题记录
有一段时间没有用Linux了.由于买了个4k的戴尔显示屏,在deepin系统上无法用,从昨晚到现在,总于解决了我的问题! 问题1:无法直接在深度的显卡驱动管理器哪里直接切换,网上看到很多人都有这个问题 ...