Client socket sending data only one time.
holo via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Sun Sep 27 12:48:38 PDT 2015
On Friday, 25 September 2015 at 04:38:06 UTC, tcak wrote:
> On Thursday, 24 September 2015 at 14:20:39 UTC, holo wrote:
>> Hello
>>
>> I'm trying to connect to server and send data, with such
>> simple client:
>>
>> #!/usr/bin/rdmd
>>
>> import std.stdio;
>> import std.socket;
>> import std.socketstream;
>> import std.process;
>> import std.conv;
>> import core.time;
>>
>> void main()
>> {
>> char[1024] buffer = 0;
>>
>> Socket client = new TcpSocket();
>> auto addrServer = new InternetAddress("localhost",
>> 8080);
>> client.connect(addrServer);
>>
>> while(1)
>> {
>>
>> client.send(readln());
>> client.receive(buffer);
>> writeln(buffer);
>> buffer = 0;
>> }
>> }
>>
>> It is working but only one time, when I'm trying to send again
>> (second loop of while) it's stooping on readln() but not
>> sending input data.
>>
>> What am i missing here?
>>
>> Thanks in advance for any help.
>
> Where is the other side of this client? There must be a TCP
> Server to listen connections, and create a second TCPSocket for
> communication. There is only one TCPSocket in your code. A lot
> of things are missing there. I would suggest you to check "C
> TCPSocket example" in your favourite search engine.
Sorry i forgot to paste server side. After your post i look on
that side of my simple socket program and i find out the problem.
This is example from other forum topic:
#!/usr/bin/rdmd
import std.stdio;
import std.socket;
import std.algorithm;
import std.conv;
void main() {
Socket server = new TcpSocket();
server.setOption(SocketOptionLevel.SOCKET,
SocketOption.REUSEADDR, true);
server.bind(new InternetAddress(8080));
server.listen(1);
while(true) {
Socket client = server.accept();
char[1024] buffer = 0;
auto received = client.receive(buffer);
writefln("The client said:\n%s", buffer[0.. received]);
enum header =
"HTTP/1.0 200 OK\nContent-Type: text/html;
charset=utf-8\n\n";
string response = header ~ "Hello World!\n";
client.send(response);
client.shutdown(SocketShutdown.BOTH);
client.close();
}
}
Lie we see after each data recive server is closing connection. I
rewrite it to something like it:
#!/usr/bin/rdmd
import std.stdio;
import std.socket;
import std.algorithm;
import std.conv;
void main() {
Socket server = new TcpSocket();
server.setOption(SocketOptionLevel.SOCKET,
SocketOption.REUSEADDR, true);
server.bind(new InternetAddress(8080));
server.listen(1);
Socket client = server.accept();
while(true) {
char[1024] buffer = 0;
auto received = client.receive(buffer);
writefln("The client said:\n%s", buffer[0.. received]);
enum header =
"HTTP/1.0 200 OK\nContent-Type: text/html;
charset=utf-8\n\n";
string response = header ~ "Hello World!\n";
client.send(response);
auto command = to!string(buffer[0.. received]);
if(command == "exit")
{
break;
}
}
client.shutdown(SocketShutdown.BOTH);
client.close();
}
Now everything is working like i needed.
More information about the Digitalmars-d-learn
mailing list