Click here to Skip to main content
15,887,175 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:
I'm just trying to read filename i have in folder and send the name to client so that client will create file with that name. Fyi... I'm sending the filename through command header. The code I written is sending the name from server but receiver is not getting it. here's my command header:

typedef enum {
    CREATE_FILE     =   0,
    SEND_FILE       =   10,
    FILE_SIZE       =   20,
}CommandList;

typedef struct {
    CommandList command;
    CString iDataBuffer;
} COMMAND_HEADER;

Server Code:
COMMAND_HEADER command_header; 
command_header.command = CREATE_FILE;
command_header.iDataBuffer = findfile.cFileName;
int nfRet = SockConnection.Send((char*)&command_header,
sizeof(command_header));

nfRet = SockConnection.Send(command_header.iDataBuffer,
sizeof(command_header.iDataBuffer));

Client code:
CString fname[50];
int nRet = SockConnection.Receive((char*)&hCommand_header, sizeof(hCommand_header));
nRet = SockConnection.Receive(fname, 50);<pre>

what am I doing wrong?

What I have tried:

here, fname receives like <bad ptr>garbage values. Please let me know if this not clear and I'll strive to make this right.
Posted
Updated 30-Jan-19 22:10pm
v4

1 solution

Quote:
int nfRet = SockConnection.Send((char*)&command_header,
sizeof(command_header));

nfRet = SockConnection.Send(command_header.iDataBuffer,
sizeof(command_header.iDataBuffer));

The above calls don't make sense.
On my system
  • sizeof(command_header)=8
  • sizeof(command_header.iDataBuffer)=4

independent on actual iDataBuffer string length.
You should write something similar to

C++
int nfRet = SockConnection.Send((char*)&command_header.command,
sizeof(command_header.command));// send the command
size_t iDataLen = command_header.iDataBuffer.GetLength() * sizeof(TCHAR);
nfRet = SockConnection.Send((char*)command_header.iDataBuffer.GetBuffer(),
iDataLen);
command_header.iDataBuffer.ReleaseBuffer();
 
Share this answer
 
Comments
rmds 31-Jan-19 4:42am    
Thank you, it says a lot! I tried above however, still receiving client not getting the filename. Here's my client end code:

COMMAND_HEADER hCommand_header;
CString fname[50];
int nRet = SockConnection.Receive((char*)&hCommand_header, sizeof(hCommand_header));
switch(hCommand_header.command) {
case CREATE_FILE: {
nRet = SockConnection.Receive((char*)&hCommand_header.iDataBuffer, 50); // instead I
// also tried this:
nRet = SockConnection.Receive(fname, 50);
}
break;
Thank you!
rmds 31-Jan-19 5:04am    
OK...instead this code reads the filename but along with the garbage value:
int nRet = SockConnection.Receive((char*)&hCommand_header.command,
sizeof(hCommand_header.command));

switch(hCommand_header.command) {
case CREATE_FILE: {
nRet = SockConnection.Receive((char*)hCommand_header.iDataBuffer.GetBuffer(), 50);
}
break;

how to get rid of the garbage and unpack the filename to CString?
rmds 31-Jan-19 5:14am    
I got it. It worked! Thank you very much!!!
CPallini 31-Jan-19 5:53am    
You are welcome. I suppose you have sent the lenght of the string, before its actual content.
rmds 31-Jan-19 7:44am    
I hate to trouble but been checking for quite a while now... A txtfile with the name is created, however the above code crashes with error dialog"Heap Corruption Detected: after Normal block. "CRT detected that the application wrote to memory end of heap buffer". It crashes when I press F10 after "DestFile.Open" in following code:

switch(hCommand_header.command) {
case CREATE_FILE: {
nRet = SockConnection.Receive((char*)hCommand_header.iDataBuffer.GetBuffer(),50);
(hCommand_header.iDataBuffer.GetBuffer())[nRet] = '\0';
Destfile.Open(hCommand_header.iDataBuffer, CFile::modeCreate | CFile::modeWrite);
}
hCommand_header.iDataBuffer.ReleaseBuffer();
break;

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900