barrier/test.cpp

146 lines
3.3 KiB
C++

#include "CTCPSocket.h"
#include "CTCPListenSocket.h"
#include "CNetworkAddress.h"
#include "IInputStream.h"
#include "IOutputStream.h"
#include "CThread.h"
#include "CFunctionJob.h"
#include <stdio.h>
//
// test
//
SInt16 port = 50000;
static void thread1(void*)
{
try {
fprintf(stdout, "client started\n");
CThread::sleep(1.0);
CNetworkAddress addr("127.0.0.1", port);
fprintf(stdout, "client connecting\n");
CTCPSocket* socket = new CTCPSocket;
socket->connect(addr);
fprintf(stdout, "client connected (%p). waiting.\n", socket);
CThread::sleep(2.0);
fprintf(stdout, "client sending message\n");
static const char msg[] = "message from client\n";
socket->getOutputStream()->write(msg, sizeof(msg) - 1);
socket->getOutputStream()->flush();
fprintf(stdout, "client waiting for reply\n");
UInt8 buffer[4096];
UInt32 n;
do {
n = socket->getInputStream()->read(buffer, sizeof(buffer) - 1);
buffer[n] = 0;
fprintf(stdout, "%s", buffer);
} while (n == 0 && memchr(buffer, '\n', n) == NULL);
fprintf(stdout, "client closing\n");
socket->close();
delete socket;
fprintf(stdout, "client terminating\n");
}
catch (XBase& e) {
fprintf(stderr, "exception: %s\n", e.what());
}
}
static void thread2(void*)
{
try {
fprintf(stdout, "server started\n");
CNetworkAddress addr("127.0.0.1", port);
CTCPListenSocket listenSocket;
listenSocket.bind(addr);
fprintf(stdout, "server accepting\n");
ISocket* socket = listenSocket.accept();
fprintf(stdout, "server accepted %p\n", socket);
UInt8 buffer[4096];
UInt32 n;
do {
n = socket->getInputStream()->read(buffer, sizeof(buffer) - 1);
buffer[n] = 0;
fprintf(stdout, "%s", buffer);
} while (n == 0 && memchr(buffer, '\n', n) == NULL);
fprintf(stdout, "server replying\n");
static const char reply[] = "data received\n";
socket->getOutputStream()->write(reply, sizeof(reply) - 1);
fprintf(stdout, "server closing\n");
socket->close();
delete socket;
fprintf(stdout, "server terminating\n");
}
catch (XBase& e) {
fprintf(stderr, "exception: %s\n", e.what());
}
}
static void thread3(void*)
{
try {
fprintf(stdout, "### looking up address\n");
CNetworkAddress addr("www.google.com", 80);
fprintf(stdout, "### connecting\n");
CTCPSocket* socket = new CTCPSocket;
socket->connect(addr);
fprintf(stdout, "### sending message\n");
static const char msg[] = "GET / HTTP/1.0\nAccept: */*\n\n";
socket->getOutputStream()->write(msg, sizeof(msg) - 1);
socket->getOutputStream()->flush();
socket->getOutputStream()->close();
fprintf(stdout, "### waiting for reply\n");
UInt8 buffer[4096];
UInt32 n;
do {
n = socket->getInputStream()->read(buffer, sizeof(buffer) - 1);
buffer[n] = 0;
fprintf(stdout, "%s", buffer);
} while (n != 0);
fprintf(stdout, "### closing\n");
socket->close();
delete socket;
fprintf(stdout, "### terminating\n");
}
catch (XBase& e) {
fprintf(stderr, "### exception: %s\n", e.what());
}
}
int main(int argc, char** argv)
{
/*
if (argc > 1) {
port = (SInt16)atoi(argv[1]);
}
fprintf(stdout, "starting threads\n");
CThread t1(new CFunctionJob(thread1));
CThread t2(new CFunctionJob(thread2));
fprintf(stdout, "waiting for threads\n");
t1.wait();
t2.wait();
fprintf(stdout, "threads finished\n");
*/
int tick = 0;
CThread t3(new CFunctionJob(thread3));
while (!t3.wait(0.1)) {
fprintf(stdout, "$$$ %d\n", ++tick);
}
return 0;
}