|
From: <mrv...@us...> - 2007-06-03 00:48:19
|
Revision: 28
http://svn.sourceforge.net/dawnofinfinity/?rev=28&view=rev
Author: mrvacbob
Date: 2007-06-02 17:48:17 -0700 (Sat, 02 Jun 2007)
Log Message:
-----------
simpler control flow for set, fill in more Net stuff
Modified Paths:
--------------
trunk/net.cpp
trunk/net.h
trunk/set.h
trunk/tests.cpp
Modified: trunk/net.cpp
===================================================================
--- trunk/net.cpp 2007-06-02 09:09:06 UTC (rev 27)
+++ trunk/net.cpp 2007-06-03 00:48:17 UTC (rev 28)
@@ -31,37 +31,50 @@
#include <sys/time.h>
#include <stdio.h>
-Connection::Connection(int fd, ConnectionGroup *parent) : sock(fd), parent(parent)
+Connection::Connection(int fd, ConnectionGroup *parent) : parent(parent), net(parent->parent)
{
- curp = curp_udp = NULL;
+ tcp.sock = fd;
+ tcp.curp = udp.curp = NULL;
recv_remain = recv_done = send_remain = send_done = 0;
recievebuf = (Packet)GC_malloc(2);
ccontext = NULL;
- fcntl(sock,F_SETFL,O_NONBLOCK);
+ fcntl(tcp.sock,F_SETFL,O_NONBLOCK);
- sock_udp = socket(AF_INET6,SOCK_DGRAM,IPPROTO_UDP);
-
- if (sock_udp == -1) {
- sock_udp = socket(AF_INET,SOCK_STREAM,IPPROTO_UDP);
+ if (net->v6) {
+ udp.sock = socket(AF_INET6,SOCK_DGRAM,IPPROTO_UDP);
+
+ struct sockaddr_in6 sin;
+ socklen_t len = sizeof(sin);
+
+ getpeername(tcp.sock, (sockaddr*)&sin, &len);
+ connect(udp.sock, (sockaddr*)&sin, len);
+ } else {
+ udp.sock = socket(AF_INET,SOCK_STREAM,IPPROTO_UDP);
+
+ struct sockaddr_in6 sin;
+ socklen_t len = sizeof(sin);
+
+ getpeername(tcp.sock, (sockaddr*)&sin, &len);
+ connect(udp.sock, (sockaddr*)&sin, len);
}
-
- // XXX here we getpeerinfo the tcp peer and connect() udp to it
}
Connection::~Connection()
{
- close(sock);
- close(sock_udp);
+ close(tcp.sock);
+ close(udp.sock);
- FD_CLR(sock, &parent->parent->active_fds);
- FD_CLR(sock_udp, &parent->parent->active_fds);
+ FD_CLR(tcp.sock, &net->active_fds);
+ FD_CLR(udp.sock, &net->active_fds);
}
void Connection::enqueue(Packet p, enum tcp_udp pt)
{
- (pt == p_tcp ? transmitq_tcp : transmitq_udp).push(p);
- FD_SET((pt == p_tcp ? sock : sock_udp), &parent->parent->writing_fds);
+ ProtocolConn pc = pt == p_tcp ? tcp : udp;
+
+ pc.transmitq.push(p);
+ FD_SET(pc.sock, &net->writing_fds);
}
int Connection::task()
@@ -79,7 +92,7 @@
void ConnectionGroup::broadcastexceptfor(Packet p, Connection *c, enum tcp_udp pt)
{
- SETPERFORM_START(&connections, Connection, cc)
+ SETPERFORM_START(&connections, Connection, cc);
if (c != &cc) cc.enqueue(p, pt);
SETPERFORM_END();
}
@@ -94,7 +107,7 @@
static const struct addrinfo hints = {AI_PASSIVE|AI_NUMERICHOST,PF_INET6,SOCK_STREAM,IPPROTO_TCP,0,NULL,NULL,NULL};
static const struct addrinfo hints_v4 = {AI_PASSIVE|AI_NUMERICHOST,PF_INET,SOCK_STREAM,IPPROTO_TCP,0,NULL,NULL,NULL};
- bool v6 = true;
+ v6 = true;
int so = socket(AF_INET6,SOCK_STREAM,IPPROTO_TCP);
if (so == -1) {
so = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
@@ -138,6 +151,13 @@
cgroups.add(ConnectionGroup(cc, this));
}
+void Net::broadcast(Packet p, enum tcp_udp pt)
+{
+ SETPERFORM_START(&cgroups, ConnectionGroup, cg);
+ cg.broadcast(p, pt);
+ SETPERFORM_END();
+}
+
void Net::task()
{
}
\ No newline at end of file
Modified: trunk/net.h
===================================================================
--- trunk/net.h 2007-06-02 09:09:06 UTC (rev 27)
+++ trunk/net.h 2007-06-03 00:48:17 UTC (rev 28)
@@ -54,15 +54,18 @@
struct Connection : public Object
{
- Queue<Packet> transmitq_tcp, transmitq_udp;
- Packet curp, curp_udp;
+ struct ProtocolConn {
+ Queue<Packet> transmitq;
+ Packet curp;
- int sock, sock_udp;
+ int sock;
+ } tcp, udp;
ssize_t recv_remain, recv_done;
ssize_t send_remain, send_done;
struct ConnectionGroup *parent;
+ struct Net *net;
Packet recievebuf;
@@ -103,6 +106,7 @@
int lsock;
long highfd;
+ bool v6;
//const char *port; // what does this do
NewConnCallback *ncc;
@@ -115,8 +119,10 @@
void addgroup(ConnCallback *cc);
void task();
+ void broadcast(Packet p, enum tcp_udp pt = p_tcp);
+
private:
- void Net::setup_listener(const char *port);
+ void setup_listener(const char *port);
};
#endif
\ No newline at end of file
Modified: trunk/set.h
===================================================================
--- trunk/set.h 2007-06-02 09:09:06 UTC (rev 27)
+++ trunk/set.h 2007-06-03 00:48:17 UTC (rev 28)
@@ -34,28 +34,34 @@
/// Set equivalent of QPERFORM
#define SETPERFORM_START(_inset, type, varname) \
{\
- Set<type> *_ins2 = (Set<type> *)_inset;\
- for (size_t _set_i = 0;_set_i<_ins2->filled;) {\
- type &varname = _ins2->data[_set_i++]; \
+ Set<type> *_iset = (Set<type> *)_inset;\
+ for (size_t _set_i = 0;_set_i<_iset->filled;) {\
+ type &varname = _iset->data[_set_i++]; \
/// A hack to allow the same block of code to operate on two sets without code duplication.
#define TWOSETSPERFORM_START(_inset, _inset2, type, varname) \
{\
- Set<type> *_ins2 = (Set<type> *)_inset, *_ins22 = (Set<type> *)_inset2;\
- for (size_t _set_i = 0;;) {\
- if (_set_i>=_ins2->filled) {if (_ins2 == _ins22) break; _ins2 = _ins22; _set_i = 0; continue;}\
- const void *varname = _ins2->data[_set_i++];\
+ Set<type> *_iset1 = (Set<type> *)_inset, *_iset2 = (Set<type> *)_inset2;\
+ for (int _whichset_i = 0; _whichset_i < 2; _whichset_i++) {\
+ Set<type> *_iset = _whichset_i ? _iset2 : _iset1; \
+ for (size_t _set_i = 0;_set_i<_iset->filled;) {\
+ type &varname = _iset->data[_set_i++];\
#define PSETPERFORM_START(_inset, varname) SETPERFORM_START(_inset, void *, varname)
-#define TWOPSETSPERFORM_START(_inset, _inset2, varname) SETPERFORM_START(_inset, _inset2, void *, varname)
+#define TWOPSETSPERFORM_START(_inset, _inset2, varname) TWOSETSPERFORM_START(_inset, _inset2, void *, varname)
#define SETPERFORM_END() \
}\
}
+#define TWOSETSPERFORM_END() \
+ }\
+ }\
+}
+
/// Remove the current set member from the set, used inside setperform.
#define SETPERFORM_REMOVETHIS() \
-{_ins2->filled--; if (_set_i != _ins2->filled) _ins2->data[_set_i] = _ins2->data[_ins2->filled]; _ins2->clear(_ins2->filled); _set_i--;}
+{_iset->filled--; _iset->data[_set_i] = _iset->data[_iset->filled]; _iset->clear(_iset->filled); _set_i--;}
Modified: trunk/tests.cpp
===================================================================
--- trunk/tests.cpp 2007-06-02 09:09:06 UTC (rev 27)
+++ trunk/tests.cpp 2007-06-03 00:48:17 UTC (rev 28)
@@ -6,19 +6,25 @@
void test_set()
{
PSet s;
+ PSet s2;
const char *a="a",*b="b",*c="c";
s.add(a);
s.add(b);
s.add(0);
s.add(c);
+ s2.add(c);
+ s2.add(0);
+
printf("%d ",s.contains(0)); //1
s.remove(a);
printf("%d ",s.contains(a)); //0
- PSETPERFORM_START(&s, i);
+ TWOPSETSPERFORM_START(&s, &s2, i);
if (i == 0) SETPERFORM_REMOVETHIS();
- SETPERFORM_END();
- printf("%d\n",s.contains(0)); //0
+ TWOSETSPERFORM_END();
+ printf("%d ",s.contains(0)); //0
+
+ printf("%d %d\n",s2.contains(c),s2.contains(0));
}
void test_queue()
@@ -40,6 +46,7 @@
void test_net()
{
+ Net n("6660",NULL);
}
#undef main
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|