TECHNOLOGIES
FORUMS
JOBS
BOOKS
EVENTS
INTERVIEWS
Live
MORE
LEARN
Training
CAREER
MEMBERS
VIDEOS
NEWS
BLOGS
Sign Up
Login
No unread comment.
View All Comments
No unread message.
View All Messages
No unread notification.
View All Notifications
Answers
Post
An Article
A Blog
A News
A Video
An EBook
An Interview Question
Ask Question
Forums
Monthly Leaders
Forum guidelines
Jithin Jose
NA
69
3.3k
Image processing from the client through TCP socket failed
Apr 12 2017 6:51 AM
I am developing an application for viewing client screen over TCP socket. my server application is in C# and the client application is in C++. I could send the image to the server without any error. At the server end, while converting buffer length I am getting a big number and this causes 'Overflow exception' while making image buffer with that size. Following are the code I have tried.
Server Code
public
static
void
StartListening()
{
// Data buffer for incoming data.
byte
[] bytes =
new
Byte[1024];
// Establish the local endpoint for the socket.
// The DNS name of the computer
// running the listener is "host.contoso.com".
IPHostEntry ipHostInfo = Dns.GetHostEntry(
"127.0.0.1"
);
IPAddress ipAddress = ipHostInfo.AddressList[0];
IPEndPoint localEndPoint =
new
IPEndPoint(IPAddress.Parse(
"127.0.0.1"
), 11000);
// Create a TCP/IP socket.
Socket listener =
new
Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp);
// Bind the socket to the local endpoint and listen for incoming connections.
try
{
listener.Bind(localEndPoint);
listener.Listen(100);
while
(
true
)
{
// Set the event to nonsignaled state.
allDone.Reset();
// Start an asynchronous socket to listen for connections.
Console.WriteLine(
"Waiting for a connection..."
);
listener.BeginAccept(
new
AsyncCallback(AcceptCallback),
listener);
// Wait until a connection is made before continuing.
allDone.WaitOne();
}
}
catch
(Exception e)
{
Console.WriteLine(e.ToString());
}
Console.WriteLine(
"\nPress ENTER to continue..."
);
Console.Read();
}
public
static
void
AcceptCallback(IAsyncResult ar)
{
// Signal the main thread to continue.
allDone.Set();
// Get the socket that handles the client request.
Socket listener = (Socket)ar.AsyncState;
Socket handler = listener.EndAccept(ar);
// Create the state object.
StateObject state =
new
StateObject();
state.workSocket = handler;
handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
new
AsyncCallback(ReadHeaderCallback), state);
}
public
static
void
ReadHeaderCallback(IAsyncResult ar)
{
// Retrieve the state object and the handler socket
// from the asynchronous state object.
StateObject state = (StateObject)ar.AsyncState;
Socket handler = state.workSocket;
// Read data from the client socket.
int
bytesRead = handler.EndReceive(ar);
//we need to add error handler here...but later
state.ImageSize = BitConverter.ToInt32(state.buffer, 0);
_imageBuff =
new
byte
[state.ImageSize];
_totBytesRead = 0;
handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
new
AsyncCallback(ReadCallback), state);
}
public
static
void
ReadCallback(IAsyncResult ar)
{
String content = String.Empty;
// Retrieve the state object and the handler socket
// from the asynchronous state object.
StateObject state = (StateObject)ar.AsyncState;
Socket handler = state.workSocket;
// Read data from the client socket.
int
bytesRead = handler.EndReceive(ar);
if
(bytesRead > 0)
{
// There might be more data, so store the data received so far.
Buffer.BlockCopy(state.buffer, 0, _imageBuff, _totBytesRead, bytesRead);
_totBytesRead += bytesRead;
if
(_totBytesRead < state.ImageSize)
{
// Not all data received. Get more.
handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
new
AsyncCallback(ReadCallback), state);
}
else
{
File.WriteAllBytes(@
"c:\temp\incoming\untitled.bmp"
, _imageBuff);
}
}
}
public
static
int
Main(String[] args)
{
StartListening();
return
0;
}
Client Code:
void
SendScreen()
{
HDC
hdcScreen;
HDC
hdcWindow;
HDC
hdcMemDC = NULL;
HBITMAP
hbmScreen = NULL;
BITMAP bmpScreen;
HWND
hWnd = GetDesktopWindow();
// Retrieve the handle to a display device context for the client
// area of the window.
hdcScreen = GetDC(NULL);
hdcWindow = GetDC(hWnd);
// Create a compatible DC which is used in a BitBlt from the window DC
hdcMemDC = CreateCompatibleDC(hdcWindow);
if
(!hdcMemDC)
{
//MessageBox(hWnd, L"CreateCompatibleDC has failed",L"Failed", MB_OK);
goto
done;
}
// Get the client area for size calculation
RECT rcClient;
GetClientRect(hWnd,&rcClient);
//This is the best stretch mode
SetStretchBltMode(hdcWindow,HALFTONE);
//The source DC is the entire screen and the destination DC is the current
window (
HWND
)
if
(!StretchBlt(hdcWindow,
0,0,
rcClient.right, rcClient.bottom,
hdcScreen,
0,0,
GetSystemMetrics (SM_CXSCREEN),
GetSystemMetrics (SM_CYSCREEN),
SRCCOPY))
{
MessageBox(hWnd,
"StretchBlt has failed"
,
"Failed"
, MB_OK);
goto
done;
}
// Create a compatible bitmap from the Window DC
hbmScreen = CreateCompatibleBitmap(hdcWindow, rcClient.right-rcClient.left,
rcClient.bottom-rcClient.top);
if
(!hbmScreen)
{
MessageBox(hWnd,
"CreateCompatibleBitmap Failed"
,
"Failed"
, MB_OK);
goto
done;
}
// Select the compatible bitmap into the compatible memory DC.
SelectObject(hdcMemDC,hbmScreen);
// Bit block transfer into our compatible memory DC.
if
(!BitBlt(hdcMemDC,
0,0,
rcClient.right-rcClient.left, rcClient.bottom-rcClient.top,
hdcWindow,
0,0,
SRCCOPY))
{
MessageBox(hWnd,
"BitBlt has failed"
,
"Failed"
, MB_OK);
goto
done;
}
// Get the BITMAP from the HBITMAP
GetObject(hbmScreen,
sizeof
(BITMAP),&bmpScreen);
BITMAPFILEHEADER bmfHeader;
BITMAPINFOHEADER bi;
bi.biSize =
sizeof
(BITMAPINFOHEADER);
bi.biWidth = bmpScreen.bmWidth;
bi.biHeight = bmpScreen.bmHeight;
bi.biPlanes = 1;
bi.biBitCount = 32;
bi.biCompression = BI_RGB;
bi.biSizeImage = 0;
bi.biXPelsPerMeter = 0;
bi.biYPelsPerMeter = 0;
bi.biClrUsed = 0;
bi.biClrImportant = 0;
DWORD
dwBmpSize = ((bmpScreen.bmWidth bi.biBitCount + 31) / 32) 4 *
bmpScreen.bmHeight;
HANDLE
hDIB = GlobalAlloc(GHND,dwBmpSize);
char
lpbitmap = (
char
)GlobalLock(hDIB);
GetDIBits(hdcWindow, hbmScreen, 0,
(
UINT
)bmpScreen.bmHeight,
lpbitmap,
(BITMAPINFO *)&bi, DIB_RGB_COLORS);
HANDLE
hFile = CreateFile(
"capture.bmp"
,
GENERIC_WRITE,
0,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL, NULL);
// Add the size of the headers to the size of the bitmap to get the total file size
DWORD
dwSizeofDIB = dwBmpSize +
sizeof
(BITMAPFILEHEADER) +
sizeof
(BITMAPINFOHEADER);
//Offset to where the actual bitmap bits start.
bmfHeader.bfOffBits = (
DWORD
)
sizeof
(BITMAPFILEHEADER) + (
DWORD
)
sizeof
(BITMAPINFOHEADER);
//Size of the file
bmfHeader.bfSize = dwSizeofDIB;
//bfType must always be BM for Bitmaps
bmfHeader.bfType = 0x4D42;
//BM
DWORD
dwBytesWritten = 0;
WriteFile(hFile, (
LPSTR
)&bmfHeader,
sizeof
(BITMAPFILEHEADER), &dwBytesWritten, NULL);
WriteFile(hFile, (
LPSTR
)&bi,
sizeof
(BITMAPINFOHEADER), &dwBytesWritten, NULL);
WriteFile(hFile, (
LPSTR
)lpbitmap, dwBmpSize, &dwBytesWritten, NULL);
SendingToSocketBFH(bmfHeader);
SendingToSocketBIH(bi);
SendingToSocket(lpbitmap,dwBmpSize);
//Unlock and Free the DIB from the heap
GlobalUnlock(hDIB);
GlobalFree(hDIB);
//Close the handle for the file that was created
CloseHandle(hFile);
//Clean up
done:
DeleteObject(hbmScreen);
DeleteObject(hdcMemDC);
ReleaseDC(NULL,hdcScreen);
ReleaseDC(hWnd,hdcWindow);
}
void
SendingToSocketBFH(BITMAPFILEHEADER bfinfo)
{
DWORD
dwErr=0;
int
sent=0;
sent = Send((
char
*)&bfinfo,
sizeof
(bfinfo),0);
dwErr = GetLastError();
}
void
SendingToSocketBIH(BITMAPINFOHEADER binfo)
{
DWORD
dwErr=0;
int
sent=0;
sent = Send((
char
*)&binfo,
sizeof
(binfo),0);
dwErr = GetLastError();
}
void
SendingToSocket(
char
* cpBuff,
int
iLen)
{
DWORD
dwErr=0;
int
sent=0;
sent = Send(cpBuff,iLen,0);
dwErr = GetLastError();
}
Reply
Answers (
0
)
When should I use Async and Await in ASP.NET MVC?
How to mask a phone number in MVC?