What’s up guys, hope you are ok !
well, the problem is that I’m doing a chat client/server aplication but doing some tests with the server, I found out that I have a problem sending messages. I’m using a struct, sockets and DWORD WINAPI threads…
So the code in the struct is:
DWORD WINAPI threadSendMessages(LPVOID vpParam); //THREAD
typedef struct messagesServerChat{ //STRUCT
const char *messageServEnv;
}MESSAGE, *SMESSAGES;
then in the main method I call the struct to use the const char messageServEnv, a HeapAlloc to give some memory to the thread that is going to send the message and a char variable that I use to store the message
char mServer[1024] = ""; //variable to pre-store the message
SMESSAGES messages; //call the struct
messages = (SMESSAGES) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(MESSAGE));
in the main method, I ask the user to insert the message that he wants to send and I use the struct to store the message and send it to the thread as a parameter:
cout<<"Dear user, please insert your message: ";
setbuf(stdin, NULL);
fgets(mServer, 1024, stdin);
messages->messageServEnv = mServer;
DWORD hSend; //send the parameters to the thread function
HANDLE sendThread = CreateThread(0, 0, threadSendMessages, mServer, 0, &hSend);
and finally the thread code function
DWORD WINAPI threadSendMessages(LPVOID lpParam){
SMESSAGES messages;
messages = (SMESSAGES)lpParam;
int mesa;
mesa = send(sConnect, (char *)messages->messageServEnv, sizeof messages->messageServEnv, 0);
//sConnect is the socket
//messages = to use the struct, and messageServEnv is the struct data that should contain the message
return 0;
}
–Edit– I fix a lot of problems using Remy’s solution but maybe I’m missing something… in the Thread threadSendMessages(SMESSAGES lpMessage)
char *ptr = messages->messageServEnv;
int len = strlen(messages->messageServEnv);
I get and error that says messages is undifined, then, I changed to:
SMESSAGES messages;
char *ptr = messages->messageServEnv;
int len = strlen(messages->messageServEnv);
now I can use messages and struct value messageServEnv but if I start debugging visual studio and I try to send a message, I get an error that says messages is used without being initialized, then I change that part to
SMESSAGES messages = new MESSAGE;
and now I can send messages to client but only characters and garbage code
You need to dynamically allocate the memory for each message’s string data and then have the thread free the memory when finished sending it.
You are also passing the wrong pointer to the
lpParameterparameter ofCreateThread(), you are passing yourchar[]buffer instead of your allocatedMESSAGEstruct.You are also using
sizeof()when callingsend(). Since yourmessageServEnvis achar*pointer,sizeof()will return 4 (32-bit) or 8 (64-bit) instead of the actual size of the string that is being pointed at.I would suggest moving the
char[]buffer directly into the struct instead of using a pointer to an external buffer, eg:.
.
If you want to pass a dynamically-lengthed string instead, you are better off using a
std::stringinstead of achar[]:.
.