I am using Named Pipes to transfer data from a client (C++) to a server (C#), the client does the following:
// C++ Client sending message
struct MESSAGE
{
char cCommand[8];
string sParameter;
};
MESSAGE msg;
strcpy(msg.cCommand, "COMMAND");
strcpy(msg.sParameter, "DO SOMETHING");
DWORD dwWrote = 0;
WriteFile (hpipe, &msg, sizeof(msg), dwWrote, NULL);
// Then, at the receiving end the C# server recieve message:
IntPtr chRequest;
bool fSuccess = ReadFile(hPipeInst, chRequest, uSize, cbRead, OverlappedPtr);
if (fSuccess)
byte[] temp = Encoding.ASCII.GetBytes(Marshal.PtrToStringAnsi(chRequest));
Now, at the receiving end, I need to transform the temp (byte[]) back into the STRUCT or something equivalent so I can access the members cCommand and sPatameter – but at this point I have no clue how to proceed… In reality doesn’t need to be a struct, I just need to extract the data itself.
Note – the STRUCT MESSAGE is something I came up with, meaning that it can be changed if a different format would be helpful in the reconstruction (add the length of sParameter for example?), I just need a COMMAND and PARAMETER to be transfered in a single block (if possible).
Requirements are simple:
– COMMAND is a fixed-length 8-characters long string that indicates what action needs to be performed
– PARAMETER is a variable-length (unless this causes issues) parameter dependant on each COMMAND
For example:
COMMAND = TRANS
PARAMETER = C:\FILE.txt C:\NewFolder\FILE.TXT
(this is just to illustrate, there are a lot more applications)
If possible I would like to extract it as a chunk of data (byte[]) and then pass it along to my application where it could be decomposed, not a fan of reading in the size, then a field, then a size, then a field – that requires that my Communication be overly linked with my implementation.
If there is a more suitable way to implement this transfer please let me know… advice would be welcome…
Any help would be much appreciated.
Thanks,
If you have the definitions of the struct in c++ you can define it in c# (it may require a little finagling). Then just read the size off of the socket and use Marshal.PtrToStructure to marshal it to the c# defined structure.