aboutsummaryrefslogtreecommitdiff
path: root/tcpserver.c
diff options
context:
space:
mode:
authorIOhannes m zmölnig <zmoelnig@users.sourceforge.net>2010-03-26 14:32:53 +0000
committerIOhannes m zmölnig <zmoelnig@users.sourceforge.net>2010-03-26 14:32:53 +0000
commit3cafcad577d2be2d8b222612e9a1765175abb05b (patch)
tree31dc97f31356ccd6f1793cf196f3a0556faf5a73 /tcpserver.c
parent74c2b971e0b15c27f9b3b489cffad4a85a8284a8 (diff)
output the sending host
svn path=/trunk/externals/iem/iemnet/; revision=13278
Diffstat (limited to 'tcpserver.c')
-rw-r--r--tcpserver.c37
1 files changed, 16 insertions, 21 deletions
diff --git a/tcpserver.c b/tcpserver.c
index 3a15c31..239b2a6 100644
--- a/tcpserver.c
+++ b/tcpserver.c
@@ -43,8 +43,9 @@ typedef struct _tcpserver_socketreceiver
{
struct _tcpserver *sr_owner;
- t_symbol *sr_host;
- t_int sr_fd;
+ long sr_host;
+ unsigned short sr_port;
+ t_int sr_fd;
t_iemnet_sender*sr_sender;
t_iemnet_receiver*sr_receiver;
} t_tcpserver_socketreceiver;
@@ -62,13 +63,11 @@ typedef struct _tcpserver
t_int x_nconnections;
t_int x_connectsocket; /* socket waiting for new connections */
-
- t_atom x_addrbytes[4];
} t_tcpserver;
static void tcpserver_receive_callback(void*x, t_iemnet_chunk*,int argc, t_atom*argv);
-static t_tcpserver_socketreceiver *tcpserver_socketreceiver_new(t_tcpserver *owner, int sockfd, t_symbol*host)
+static t_tcpserver_socketreceiver *tcpserver_socketreceiver_new(t_tcpserver *owner, int sockfd, struct sockaddr_in*addr)
{
t_tcpserver_socketreceiver *x = (t_tcpserver_socketreceiver *)getbytes(sizeof(*x));
if(NULL==x) {
@@ -77,9 +76,11 @@ static t_tcpserver_socketreceiver *tcpserver_socketreceiver_new(t_tcpserver *own
} else {
x->sr_owner=owner;
- x->sr_host=host;
x->sr_fd=sockfd;
+ x->sr_host=ntohl(addr->sin_addr.s_addr);
+ x->sr_port=ntohs(addr->sin_port);
+
x->sr_sender=iemnet__sender_create(sockfd);
x->sr_receiver=iemnet__receiver_create(sockfd, x, tcpserver_receive_callback);
}
@@ -310,7 +311,8 @@ static void tcpserver_receive_callback(void *y0,
if(NULL==y || NULL==(x=y->sr_owner))return;
if(argc) {
- iemnet__addrout(x->x_status_outlet, x->x_addrout, c->addr, c->port);
+
+ iemnet__addrout(x->x_status_outlet, x->x_addrout, y->sr_host, y->sr_port);
outlet_list(x->x_msgout, gensym("list"), argc, argv);
} else {
// disconnected
@@ -331,8 +333,7 @@ static void tcpserver_connectpoll(t_tcpserver *x)
if (fd < 0) post("%s: accept failed", objName);
else
{
- t_symbol*host=gensym(inet_ntoa(incomer_address.sin_addr));
- t_tcpserver_socketreceiver *y = tcpserver_socketreceiver_new((void *)x, fd, host);
+ t_tcpserver_socketreceiver *y = tcpserver_socketreceiver_new((void *)x, fd, &incomer_address);
if (!y)
{
sys_closesocket(fd);
@@ -355,15 +356,18 @@ static void *tcpserver_new(t_floatarg fportno)
/* create a socket */
sockfd = socket(AF_INET, SOCK_STREAM, 0);
-#ifdef DEBUG
- post("%s: receive socket %d", objName, sockfd);
-#endif
+ DEBUG("%s: receive socket %d", objName, sockfd);
+
if (sockfd < 0)
{
sys_sockerror("tcpserver: socket");
+ // LATER allow creation even if port is in use
return (0);
}
+
server.sin_family = AF_INET;
+
+ /* LATER allow setting of inaddr */
server.sin_addr.s_addr = INADDR_ANY;
/* assign server port number */
@@ -398,9 +402,6 @@ static void *tcpserver_new(t_floatarg fportno)
sys_addpollfn(sockfd, (t_fdpollfn)tcpserver_connectpoll, x); // wait for new connections
}
-
-
-
x->x_connectsocket = sockfd;
x->x_nconnections = 0;
@@ -408,12 +409,6 @@ static void *tcpserver_new(t_floatarg fportno)
{
x->x_sr[i] = NULL;
}
- /* prepare to convert the bytes in the buffer to floats in a list */
- for (i = 0; i < 4; ++i)
- {
- x->x_addrbytes[i].a_type = A_FLOAT;
- x->x_addrbytes[i].a_w.w_float = 0;
- }
return (x);
}