|
// ============================================================================
// server.cc
//
// This program is responsible for accepting requests for files from the rcopy
// program and transmitting the file back. This program should never terminate
// (unless you kill it with a ctrl-c). It should continually process requests
// from the rcopy program.
//
// The server needs to handle error conditions such as non-existing files by
// passing back a flag to the rcopy program and then waiting for a new file
// request.
//
// The server should output its port number to be used by the rcopy program.
// The server program will be run as:
//
// server error-percent
//
// where
//
// error-percent is the percent of packets that are in error (floating
// point number)
//
// Author: Jon Sagara
//
// This file represents the SERVER.
// ============================================================================
#include <iostream.h>
#include <stdio.h>
#include <stdlib.h>
#include <stream.h>
#include <ctype.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <string.h>
#include <strings.h>
#include <sys/time.h>
#include "networks.h"
#include "sendtoErrB.h"
int CreateServerSocket();
int main(int argc, char *argv[])
{
int nSocket;
int nBytesRead = 0; // Number of bytes read from rcopy.
int nBytesSent = 0; // Number of bytes send to rcopy.
int nRemoteLen = 0; // Length of remote
sockaddr_in remote; // Socket address of rcopy.
unsigned char recv_buf[BUFF_SIZE];
unsigned char send_buf[BUFF_SIZE];
//
// Check command line arguments.
//
if (2 != argc)
{
cout << "usage: " << argv[0] << " error-percent" << endl;
exit(-1);
}
nSocket = CreateServerSocket();
nBytesRead = recvfrom(nSocket, recv_buf, BUFF_SIZE, 0, (struct sockaddr *) &remote, &nRemoteLen);
cout << recv_buf << " len: " << nBytesRead << endl;
memcpy(send_buf, "Jon Sagara", 11);
nBytesSent = sendto(nSocket, send_buf, 11, 0, (struct sockaddr *) &remote, sizeof(remote));
if (nBytesSent < 0)
{
perror("Error sending data in server. Sending back to rcopy");
close(nSocket);
exit(1);
}
close(nSocket);
return 0;
}
// ----------------------------------------------------------------------------
// CreateServerSocket()
//
// Creates a server socket and binds it to a particular address and port. This
// allows any process to (theoretically) connect to our server.
//
// Assumes: We will bind to the local address.
// Results: A socket is created, bound to the local machine's address.
// Returns: The socket descriptor.
// ----------------------------------------------------------------------------
//
int CreateServerSocket()
{
int nSocket = 0; // Socket descriptor.
int nLocalLen = 0; // sizeof(local).
sockaddr_in local; // Local socket address.
//
// Create the socket.
//
if ((nSocket = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
{
perror("Error creating socket in CreateServerSocket()");
exit(1);
}
//
// Set up the socket ("name it").
//
local.sin_family = AF_INET; // Internet family.
local.sin_addr.s_addr = INADDR_ANY; // Wild card machine address (local address).
local.sin_port = 0; // Let the system choose the port.
//
// Bind the name (address) to a port.
//
nLocalLen = sizeof(local);
if ((bind(nSocket, (struct sockaddr *) &local, nLocalLen)) < 0)
{
perror("Error calling bind() in CreateServerSocket()");
exit(1);
}
//
// Get the port name and print it out.
//
getsockname(nSocket, (struct sockaddr *) &local, &nLocalLen);
cout << "Socket has port " << local.sin_port << "\n";
return nSocket;
}
Jon Sagara
"After all is said and done, usually more is said than done." -- <i>Unknown</i>
|
|
|
|
|
|
Jon
you've got some nerve posting Unix code on codeproject
Nish
Sonork ID 100.9786 voidmain
www.busterboy.org
Nish is a BIG fan of Goran Ivanisevic
|
|
|
|
|
Like you said in the next thread up, the concepts are largely the same. I was stuck on the same lamo bug for a few hours and I was getting desperate, so I thought I'd give it a go here in the CP forums. Seems like every time I post a question here, I end up answering it myself 20 minutes later. Maybe I should post first and think later.
Jon Sagara
"After all is said and done, usually more is said than done." -- Unknown
|
|
|
|
|
Jon Sagara wrote:
I end up answering it myself 20 minutes later.
Who am I kidding? It took almost 3 hours. Time stamps are the devil.
Jon Sagara
"After all is said and done, usually more is said than done." -- Unknown
|
|
|
|
|
Jon Sagara wrote:
Time stamps are the devil.
got you that time, didnt we !
Nish
Sonork ID 100.9786 voidmain
www.busterboy.org
Nish is a BIG fan of Goran Ivanisevic
|
|
|
|
|
Hi, I have a question that may be very very easy for most of you. Please don't laugh, I'm embarassed not able to find it after spending quite a bit of time on it.
How can I call up a dialog box that browses for a directory? I know CFileDialog can browse for a file, but I do not need the file. I just want the directory.
Thank you very much for your help.
|
|
|
|
|
Use SHFileOperation(). There are wrapper classes here on CP to help you get started if you need it.
--Mike--
http://home.inreach.com/mdunn/
#include "witty_sig.h"
your with and
|
|
|
|
|
SHBrowseForFolder() works better IMHO
---
It may be that your sole purpose in life is simply to serve as a warning to others.
|
|
|
|
|
|
I'll ride on this topic with mine...on the off chance the original poster is using WinXP
http://www.codeproject.com/script/comments/forums.asp?forumid=1647&select=80917&fr=176&df=2&app=50#xx79842xx
--Mark Terrano
|
|
|
|
|
How to refresh CommandUI of menu and toolsbar at once?
|
|
|
|
|
Problem:
Code working for a long time under WinME/2000/98 does not work under WinXP. Little function to pop up a dialog box and allow the user to pick a folder (or file) which is returned as a CString. I get back the wrong value if user creates new folder or types non-existing folder into box.
What I'm looking for:
Function to pop up dialog and get back existing or new folder as specified by user.
Symptoms:
Works just as I would expect it to under Win98/ME/2000.
Under WinXP if the user creates a folder, or types a new folder into the edit box I get back a reference to their user directory. (Please excuse a bit of 'debugging mess' I'm still trying to figure out what is going on).
Also, there are some header files that I don't have the latest versions of, being limited to VC6 with all patches (so you can ignore my comments about BIF_USENEWUI - which is documented but appears at some later point I think).
I didn't see any KB articles related to WinXP for either of my two functions-in-question.
Any help would be appreciated!
--Mark
-----My Test Code------
CString CXpgetfoldercheckDlg::getFolderName(CString title, bool requireTrailingBackslash, bool allowNewFolders)
{
// PURPOSE:
// Uses latest UI to get a folder name.
// PARAMS:
// title = the title of the browse dialog.
// rquireTrailingBackslash = true if you want the last character of the folder to be '\' (default t)
// allowNewFolders = true if you want a 'new' button to appear on the dialog (default t)
// RETURNS:
// valid folder name if successful or NULL if not
// REQUIRED:
// IE 5.0 on up, or Win2000 on up
// STEPS:
// Bring up a common file dialog,
// Allow the user's to select a folder name
// Close the dialog
//
// KNOWN BUG: Problem with WindowXP (11-2-2001) - typed-in filename (i.e. new file name) returns the
// user's mydocuments folder.
// Results with the following settings
// info.ulFlags = BIF_RETURNONLYFSDIRS | BIF_EDITBOX;
BROWSEINFO info;
ITEMIDLIST *list;
HRESULT ret;
DWORD dwCoInit=COINIT_APARTMENTTHREADED;
ret = CoInitializeEx(NULL,dwCoInit);
if (ret == S_OK || ret == S_FALSE )
TRACE("CoInitted\n");
else
{
return "ERR: Failed CoInit";
}
//info.ulFlags = BIF_RETURNONLYFSDIRS | BIF_USENEWUI ; //new
// Where are these?
// BIF_USENEWUI
// BIF_NEWDIALOGSTYLE
//FIXME: Could not get the various header issues to work, so I just added the param values for the
//reqd. params above. Docs are correct, could not get them to appear. Will work with IE5.0+ versions.
info.hwndOwner = NULL;
info.lpszTitle = title;
info.lpfn = NULL;
info.pidlRoot = NULL;
info.lParam = 0L;
info.iImage= NULL;
info.pszDisplayName = NULL;
if (allowNewFolders)
{
info.ulFlags = 0x0040 | BIF_EDITBOX;
//info.ulFlags = BIF_RETURNONLYFSDIRS | BIF_EDITBOX;
//info.ulFlags = BIF_RETURNONLYFSDIRS | 0x0040 | BIF_EDITBOX;
//info.ulFlags = BIF_RETURNONLYFSDIRS | BIF_EDITBOX | BIF_STATUSTEXT ;
//info.ulFlags = BIF_RETURNONLYFSDIRS | 0x0040 | BIF_EDITBOX;
}
else
{
info.ulFlags = BIF_RETURNONLYFSDIRS;
}
list = SHBrowseForFolder( &info );
if (list == NULL)
{
//User hit cancel
AfxMessageBox("User cancelled");
return "ERR: User Cancelled";
}
CString fileName;
char buf[MAX_PATH+1];
buf[0]='\0';
ret = SHGetPathFromIDList( list, buf );
if (!ret)
{
return("ERR:Failed to get path from IDList");
}
else
{
fileName = buf;
}
#ifdef _DEBUG
TRACE1("getFolderName] User folder: %s\n", buf);
#endif
//Could still be invalid return - i.e. spaces.
if (fileName.IsEmpty())
return fileName;
// For most uses, I require a trailing \ at the end of the filename. If it is not
// there, then it is appended.
if (requireTrailingBackslash)
if (fileName.Right(1) != "\\")
fileName += "\\";
return fileName;
}
--Mark Terrano
|
|
|
|
|
hi :
does any body knows about how to access external hardware through vc++ like what type of programmig should i do menas how to access the external hardware . like if i want to handle external sensors then wht should i do if any one wanna more detail on it then he can ask me at email
bilal_bilu82@hotmail.com
|
|
|
|
|
Maybe you can just post some more details about the kind of hardware you are going to interface to and the communication to it. Different ways to talk over the Com port, USB, Keyboard, etc. If your question is a general one about how to interface with some sensors - look at companies like Home Automation Labs and X-10 - who have some inexpensive up to professional sensors that are designed to be connected to PCs.
There are lab automation application applications of all kinds that are designed to do real-time processing of sensor data and feed other applications clean data, do logs, etc - and you can pick one to interface to an API with C++, VB or your langage of choice.
Good luck - post details if you need additional help.
--Mark Terrano
www.ensemblestudios.com
(Creators of the Age of Empires series)
|
|
|
|
|
I'm hoping to use the registry as a sort of associative container, where I can set a key, then iterate through the items stored there AND their values. Is there a way to discover the names of items stored in the registry under a specific subkey ? For example, I have HKEY_CURRENT_USER/Software/Graus/MovieDatabase/Files, and I want to know the name as well as the value of every item stored there.
Thanks.
Christian
After all, there's nothing wrong with an elite as long as I'm allowed to be part of it!! - Mike Burston Oct 23, 2001
|
|
|
|
|
Is it still unanswered? CP is very slow today, at least for me
RegEnumKeyEx and RegEnumValue will do the job.
Tomasz Sowinski -- http://www.shooltz.com
|
|
|
|
|
Hi all, I have a strange (but probably simple) question on DIB's and DDB's. I have a HANDLE (essentially a HBITMAP), and from this I want to create a DIB so that I may access "the bits" etc. Now at the moment, I have the following code, which manages to create a valid HBITMAP (and later on Blits it to the screen - no problem). However, i have had terrible trouble getting access to "the bits" later on in my program, and I think its something to do with the GetDIBitmap function (MSDN says it returns a DDB FROM A DIB). I cannot seem to use the GetObject function either to get a DIBSECTION or BITMAP structure which my program relies on (that is essentially what I need from this, plus the HBITMAP of course). Any help on this would be hugely appreciated (including any better ways of going about converting the HANDLE to a HBITMAP), I have been working on this for days, thats why I haven`t been seen for a while!
void CMainFrame::GetImage(HANDLE handle)
{
CBitmapDoc* pBitmapDoc = NewDocument();
CBitmapFrame* pBitmapWnd = (CBitmapFrame*)NewWindow(pBitmapDoc);
BYTE* lpVoid, *pBits;
LPBITMAPINFO pHead;
lpVoid = (BYTE*)GlobalLock(handle);
pHead = (LPBITMAPINFO)lpVoid;
GlobalUnlock(lpVoid);
pBits = (BYTE*)lpVoid + sizeof(BITMAPINFOHEADER);
HBITMAP newbitmap = CreateDIBitmap(pBitmapWnd->GetDC()->m_hDC, &pHead->bmiHeader, CBM_INIT, pBits, pHead, DIB_RGBCOLORS);
}
Thanks anyway for looking at my problem,
Alan.
"When I left you I was but the learner, now I am the Master" - Darth Vader
|
|
|
|
|
from DDB to DIB, you want GetDIBits.
here's how i do it (edit out what you don't want):
HANDLE CISImgUtil::DDBToDIB( HBITMAP bitmap, UINT32 dwCompression, HPALETTE hPal )
{
CCallbackLock lock;
UINT32 dwLen;
HANDLE hDIB;
ISASSERT( bitmap );
if( dwCompression == BI_BITFIELDS )
{
m_error=IS_ERR_INTERNAL;
return NULL;
}
if (hPal==NULL)
hPal = (HPALETTE) GetStockObject(DEFAULT_PALETTE);
BITMAP bm;
::GetObject(bitmap, sizeof(bm),(LPSTR)&bm);
BITMAPINFOHEADER bi;
bi.biSize = sizeof(BITMAPINFOHEADER);
bi.biWidth = bm.bmWidth;
bi.biHeight = bm.bmHeight;
bi.biPlanes = 1;
bi.biBitCount = bm.bmPlanes * bm.bmBitsPixel;
bi.biCompression = dwCompression;
bi.biSizeImage = 0;
bi.biXPelsPerMeter = 0;
bi.biYPelsPerMeter = 0;
bi.biClrUsed = 0;
bi.biClrImportant = 0;
int nColors = (1 << bi.biBitCount);
if( nColors > 256 )
nColors = 0;
if (bi.biBitCount>31)
nColors=0;
dwLen = bi.biSize + nColors * sizeof(RGBQUAD);
HDC hDC = GetDC(NULL);
hPal = SelectPalette(hDC,hPal,FALSE);
RealizePalette(hDC);
hDIB = (HGLOBAL)ISAlloc(dwLen);
if (hDIB==NULL)
{
SelectPalette(hDC,hPal,FALSE);
ReleaseDC(NULL,hDC);
m_error=IS_ERR_MEM;
return NULL;
}
LPBITMAPINFOHEADER lpbi = (LPBITMAPINFOHEADER)hDIB;
*lpbi = bi;
if (!GetDIBits(hDC, bitmap, 0L, (UINT32)bi.biHeight,
(LPBYTE)NULL, (LPBITMAPINFO)lpbi, (UINT32)DIB_RGB_COLORS))
{
ISFree(hDIB);
SelectPalette(hDC,hPal,FALSE);
ReleaseDC(NULL,hDC);
m_error=IS_ERR_GETDIB;
return NULL;
}
bi = *lpbi;
if (bi.biSizeImage == 0){
bi.biSizeImage = ((((bi.biWidth * bi.biBitCount) + 31) & ~31) / 8)
* bi.biHeight;
if (dwCompression != BI_RGB)
bi.biSizeImage = (bi.biSizeImage * 3) / 2;
}
dwLen += bi.biSizeImage;
HANDLE hTemp = GlobalReAlloc(hDIB, dwLen, GMEM_MOVEABLE);
if (hTemp==NULL)
{
ISFree(hDIB);
SelectPalette(hDC,hPal,FALSE);
ReleaseDC(NULL,hDC);
m_error=IS_ERR_MEM;
return NULL;
}
hDIB=hTemp;
lpbi = (LPBITMAPINFOHEADER)hDIB;
BOOL bOK = GetDIBits( hDC, bitmap,
0L,
(UINT32)bi.biHeight,
(LPBYTE)lpbi
+ (bi.biSize + nColors * sizeof(RGBQUAD)),
(LPBITMAPINFO)lpbi,
(UINT32)DIB_RGB_COLORS);
if( !bOK )
{
ISFree(hDIB);
SelectPalette(hDC,hPal,FALSE);
ReleaseDC(NULL,hDC);
m_error=IS_ERR_GETDIB;
return NULL;
}
SelectPalette(hDC,hPal,FALSE);
ReleaseDC(NULL,hDC);
return hDIB;
}
POKE 808,234
|
|
|
|
|
Geeze, thanks for that Chris, its exactly what i need (minus the palette stuff cos I`m dealing with 24-bit DIBs). I cannot thank you enough for both the detail and accuracy of your response.
Many, many thanks,
Alan.
"When I left you I was but the learner, now I am the Master" - Darth Vader
|
|
|
|
|
no problem.
actually, that's a chunk of code i got off of codeguru a couple of years ago - it's always worked well for me. just sharing the wealth.
-c
POKE 808,234
|
|
|
|
|
Dear Sirs,
I must receive serial bytes in a MFC proyect using a WideTrack buffer (as Greenleaf Comms lib calls it); with every byte I must receive its error status (parity error, frame error) so that I can discard it.
The proyect is a propietary protocols monitor in a noisy environment (radio comunications).
I've tried to use alternative techniques as to use the error message that comes every time an erroneous byte arrives, but the problem is I'm unable to identificate which one in the waiting queue is the bad one.
Can you help me?
T.I.A.
|
|
|
|
|
Haven't checked this, but maybe you can set the size of input buffer to 1 (with SetupComm ) to make it easier to sync bytes received and error messages. Also, the UART has an internal buffer of its own (see Control Panel->System->your COM port->Properties->Configuration->Advanced) that you might want to set down to the minimum. Tell us back if something along this line works.
Joaquín M López Muñoz
Telefónica, Investigación y Desarrollo
|
|
|
|
|
Not sure if I understand the original question exactly or not, but etting the UART to the minimum might be a problem if he can't service the comm before the next character comes in - with Windows this is probably a fairly likely thing and the reason there is a buffer there - it will just be overwritten. You can probably get away with it if the speeds are low - but it seems like you are asking for compatibility problems (i.e. it fails a lot with Winmodems or Cable Modems) if you do this.
Can you read the bytes into an intermediate buffer, throw your error if and when you need to, and only pass clean (that pass your test) bytes on to the application?
--Mark Terrano
www.ensemblestudios.com
(Creators of the Age of Empires series)
|
|
|
|
|
VC++ 6.0 now making executable above 20 MB rather than 400 KB. MFC used as shared libraryes. If it used as a static executable size - 30 MB.
Answers pls send to e-mail: ovm@SoftHome.net
P.S. Executable ziping to 200 KB
|
|
|
|
|