|
|
Home » Community » Newbie corner » my TCP client/server don't work correctly
my TCP client/server don't work correctly [message #57046] |
Mon, 17 May 2021 20:52 |
|
Xemuth
Messages: 387 Registered: August 2018 Location: France
|
Senior Member |
|
|
Following SocketServer / SocketClient example :
Server :
#include <Core/Core.h>
using namespace Upp;
CONSOLE_APP_MAIN
{
TcpSocket server;
if(!server.Listen(3214, 5)) {
Cout() << "Unable to initialize server socket!\n";
SetExitCode(1);
return;
}
Cout() << "Waiting for requests..\n";
TcpSocket s;
if(s.Accept(server)) {
while(!s.IsError()){
String w = s.GetLine();
Cout() << "Request: " << w << " from: " << s.GetPeerAddr() << '\n';
if(w == "time")
s.Put(AsString(GetSysTime()));
else
s.Put(AsString(3 * atoi(~w)));
s.Put("\n");
}
}
Cout() << "Stopping server..\n";
}
Client :
#include <Core/Core.h>
using namespace Upp;
CONSOLE_APP_MAIN
{
TcpSocket s;
if(!s.Connect(CommandLine().GetCount() ? CommandLine()[0] : "127.0.0.1", 3214)) {
Cout() << "Unable to connect to server!\n";
SetExitCode(1);
}
s.GlobalTimeout(1000);
s.Put("time" + '\n');
Cout() << s.GetLine() <<EOL;
s.Put("hello" + '\n');
Cout() << s.GetLine() <<EOL;
}
Here is what I get in my console :
What I'm doing wrong ? the SocketServer / SocketClient work fine but it only use the socket once to send and receive data once before closing it
[Updated on: Mon, 17 May 2021 21:03] Report message to a moderator
|
|
|
|
|
|
Re: my TCP client/server don't work correctly [message #57050 is a reply to message #57049] |
Mon, 17 May 2021 23:53 |
Oblivion
Messages: 1143 Registered: August 2007
|
Senior Contributor |
|
|
Probleme is, when I connect to the server. Neither my first nor my second data is received by server. Instead I receive a Null string from server (probably when I destroy the client socket) (this behavior can be seen in the console screen)
Then, the reason seems to be:
// s.Put("time" + '\n'); // << ------------ This won't work... Clang: warning: adding 'char' to a string does not append to the string [-Wstring-plus-int] (not the same thing what SocketClient does. It appends it to a Upp::String, using the relevant operator.)
s.Put("time\n"); // << ------------ This works as expected.
s.Put(String("time") + '\n'); // also works
Cout() << s.GetLine() <<EOL;
s.Put("hello\n");
Cout() << s.GetLine() <<EOL;
Best regards,
Oblivion
Github page: https://github.com/ismail-yilmaz
upp-components: https://github.com/ismail-yilmaz/upp-components
Bobcat the terminal emulator: https://github.com/ismail-yilmaz/Bobcat
[Updated on: Tue, 18 May 2021 00:03] Report message to a moderator
|
|
|
Re: my TCP client/server don't work correctly [message #57051 is a reply to message #57050] |
Tue, 18 May 2021 08:42 |
|
Xemuth
Messages: 387 Registered: August 2018 Location: France
|
Senior Member |
|
|
Indeed it make sense...
will give a try after work.
Thanks again Oblivion
Edit : It worked fine, here is the code I come up with (not perfect and Many thing need to be added but it might help) :
if(!server.Listen(port, 1)) {
LOG("Unable to initialize server socket on port " + AsString(port));
return;
}
client.GlobalTimeout(1000);
LOG("Waiting for webServer...");
while(!Thread::IsShutdownThreads()){
if(client.Accept(server)){
LOG("WebServer connected");
int emptyData = 0;
while(!client.IsError()){
Upp::String data = client.GetLine();
if(!client.IsTimeout()){
Upp::String sendingCmd = "";
LOG("Receiving : " + data + " from: " + client.GetPeerAddr());
sendingCmd = ProcessCommandNetwork(data);
LOG("Sending: " + sendingCmd + " To: " + client.GetPeerAddr());
sendingCmd += '\n';
sendingCmd.Shrink();
client.Put(sendingCmd);
}else{
client.ClearError();
}
}
LOG("WebServer error: " + client.GetErrorDesc());
client.Close();
client.Clear();
LOG("WebServer disconnected");
}
}
LOG("Connection with webServer ended");
[Updated on: Wed, 19 May 2021 08:49] Report message to a moderator
|
|
|
Goto Forum:
Current Time: Sat Dec 14 15:29:37 CET 2024
Total time taken to generate the page: 0.02789 seconds
|
|
|