00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039 extern "C" {
00040 #include <unistd.h>
00041 #include <stdlib.h>
00042 #include <string.h>
00043 #include <arpa/inet.h>
00044 }
00045
00046 #include <fstream>
00047 #include <sstream>
00048
00049 #include "consmgr.h"
00050
00051 #include "sockconn.h"
00052 #include "ipsockaddr.h"
00053 #include "socklistener.h"
00054
00055
00056 static int tcp_test();
00057 static void accept_and_send_on_connection(Listener *listener,
00058 SocketAddressP &where);
00059 static void *socket_sender_thread(void *addr);
00060 static void socket_sender(SocketAddressP &where);
00061
00062 int
00063 main(int argc, char *argv[])
00064 {
00065 int ret;
00066
00067
00068 ret = tcp_test();
00069
00070 exit(0);
00071 }
00072
00073 static int
00074 tcp_test()
00075 {
00076 struct sockaddr_storage ss;
00077 struct sockaddr_in *sin = reinterpret_cast<struct sockaddr_in*>(&ss);
00078
00079 ss.ss_family = AF_INET;
00080 #ifndef NO_SA_LEN
00081 ss.ss_len = sizeof(struct sockaddr_in);
00082 #endif
00083 sin->sin_addr.s_addr = INADDR_ANY;
00084
00085
00086 sin->sin_port = htons(12345);
00087
00088 SocketAddressP addr(new IPSocketAddress(reinterpret_cast<sockaddr*>(&ss)));
00089
00090 cerr << "Opening a socket at INADDR_ANY for listening." << endl;
00091
00092 Listener *listener = new SocketListener(addr);
00093
00094 SocketAddressP target_addr(new IPSocketAddress("127.0.0.1", ntohs(sin->sin_port)));
00095
00096
00097
00098 accept_and_send_on_connection(listener, target_addr);
00099 accept_and_send_on_connection(listener, target_addr);
00100
00101 listener->disconnect();
00102 delete listener;
00103
00104 return(0);
00105 }
00106
00107 void
00108 accept_and_send_on_connection(Listener *listener, SocketAddressP &where)
00109 {
00110
00111 pthread_t tid_tcp_sender;
00112 int ret = pthread_create(&tid_tcp_sender, NULL, socket_sender_thread, &where);
00113 PTHREAD_CHECK_AND_THROW(ret, "pthread_create(socket_sender_thread)");
00114
00115
00116 ConnectorP incoming = listener->listen_for_incoming();
00117
00118 cerr << "Got a connection on " << listener->get_id() << ": ";
00119 cerr << incoming->get_id() << endl;
00120
00121
00122
00123 try {
00124 while (1) {
00125 Data *b = incoming->read();
00126 std::cout << *b;
00127 delete b;
00128 }
00129 } catch (...) {
00130 std::cout << endl << "Connection closed." << endl;
00131 }
00132
00133 ret = pthread_join(tid_tcp_sender, NULL);
00134 }
00135
00136
00137
00138 void *
00139 socket_sender_thread(void *addr)
00140 {
00141 socket_sender(*(SocketAddressP*) addr);
00142 return NULL;
00143 }
00144
00145
00146
00147
00148 void
00149 socket_sender(SocketAddressP &where)
00150 {
00151 IPSocketAddress &addr = dynamic_cast<IPSocketAddress&>(*where);
00152
00153 cerr << "Building a SocketConnector to " << addr.get_addr() << " (port " << addr.port() << ")" << endl;
00154 Connector *conn = new SocketConnector(where);
00155
00156 cerr << "The new SocketConnector is " << conn << endl;
00157
00158 Data b("TEST DATA 45678");
00159 cerr << "Writing to the SocketConnector" << endl;
00160 conn->write(b);
00161 cerr << "Written: deleting it and returning" << endl;
00162 delete conn;
00163 }