aboutsummaryrefslogtreecommitdiff
path: root/tcpserver.c
diff options
context:
space:
mode:
Diffstat (limited to 'tcpserver.c')
-rw-r--r--tcpserver.c104
1 files changed, 42 insertions, 62 deletions
diff --git a/tcpserver.c b/tcpserver.c
index ca4f38e..218b6ba 100644
--- a/tcpserver.c
+++ b/tcpserver.c
@@ -1,5 +1,5 @@
/* tcpserver.c
- * copyright (c) 2010 IOhannes m zmölnig, IEM
+ * copyright © 2010-2015 IOhannes m zmölnig, IEM
* copyright (c) 2006-2010 Martin Peach
* copyright (c) 2004 Olaf Matthes
*/
@@ -71,6 +71,7 @@ typedef struct _tcpserver {
t_iemnet_floatlist *x_floatlist;
} t_tcpserver;
+/* forward declarations */
static void tcpserver_receive_callback(void*x, t_iemnet_chunk*);
static t_tcpserver_socketreceiver *tcpserver_socketreceiver_new(
@@ -79,21 +80,19 @@ static t_tcpserver_socketreceiver *tcpserver_socketreceiver_new(
t_tcpserver_socketreceiver *x = (t_tcpserver_socketreceiver *)getbytes(
sizeof(*x));
if(NULL==x) {
- error("%s_socketreceiver: unable to allocate %d bytes", objName,
- (int)sizeof(*x));
+ iemnet_log(x, IEMNET_FATAL, "unable to allocate %d bytes", (int)sizeof(*x));
return NULL;
- } else {
- x->sr_owner=owner;
+ }
+ x->sr_owner=owner;
- x->sr_fd=sockfd;
+ x->sr_fd=sockfd;
- x->sr_host=ntohl(addr->sin_addr.s_addr);
- x->sr_port=ntohs(addr->sin_port);
+ x->sr_host=ntohl(addr->sin_addr.s_addr);
+ x->sr_port=ntohs(addr->sin_port);
- x->sr_sender=iemnet__sender_create(sockfd, NULL, NULL, 0);
- x->sr_receiver=iemnet__receiver_create(sockfd, x,
- tcpserver_receive_callback, 0);
- }
+ x->sr_sender=iemnet__sender_create(sockfd, NULL, NULL, 0);
+ x->sr_receiver=iemnet__receiver_create(sockfd, x,
+ tcpserver_receive_callback, 0);
return (x);
}
@@ -111,7 +110,6 @@ static void tcpserver_socketreceiver_free(t_tcpserver_socketreceiver *x)
x->sr_fd=-1;
-
if(sender) {
iemnet__sender_destroy(sender, 0);
}
@@ -121,10 +119,9 @@ static void tcpserver_socketreceiver_free(t_tcpserver_socketreceiver *x)
iemnet__closesocket(sockfd);
-
freebytes(x, sizeof(*x));
}
- DEBUG("freeed %x", x);
+ DEBUG("freed %x", x);
}
static int tcpserver_socket2index(t_tcpserver*x, int sockfd)
@@ -145,19 +142,19 @@ static int tcpserver_socket2index(t_tcpserver*x, int sockfd)
static int tcpserver_fixindex(t_tcpserver*x, int client)
{
if(x->x_nconnections <= 0) {
- pd_error(x, "[%s]: no clients connected", objName);
+ iemnet_log(x, IEMNET_ERROR, "no clients connected");
return -1;
}
- if (!((client > 0) && (client <= x->x_nconnections))) {
- pd_error(x, "[%s] client %d out of range [1..%d]", objName, client,
- (int)(x->x_nconnections));
+ if (!((client > 0) && ((unsigned int)client <= x->x_nconnections))) {
+ iemnet_log(x, IEMNET_ERROR,
+ "client:%d out of range [1..%d]",
+ client, (int)(x->x_nconnections));
return -1;
}
return (client-1);
}
-
/* ---------------- tcpserver info ---------------------------- */
static void tcpserver_info_client(t_tcpserver *x, unsigned int client)
{
@@ -194,18 +191,16 @@ static void tcpserver_info_client(t_tcpserver *x, unsigned int client)
}
}
-
static void tcpserver_info(t_tcpserver *x)
{
static t_atom output_atom[4];
int sockfd=x->x_connectsocket;
-
int port=x->x_port;
if(sockfd<0) {
- // no open port
- post("no valid sock");
+ iemnet_log(x, IEMNET_ERROR, "no open socket");
+ return;
}
if(x->x_port<=0) {
@@ -215,7 +210,9 @@ static void tcpserver_info(t_tcpserver *x)
x->x_port=ntohs(server.sin_port);
port=x->x_port;
} else {
- post("gesockname failed for %d", sockfd);
+ iemnet_log(x, IEMNET_ERROR, "unable to get socket name for %d", sockfd);
+ sys_sockerror("getsockname");
+ return;
}
}
@@ -223,7 +220,6 @@ static void tcpserver_info(t_tcpserver *x)
outlet_anything( x->x_statout, gensym("port"), 1, output_atom);
}
-
static void tcpserver_info_connection(t_tcpserver *x,
t_tcpserver_socketreceiver*y)
{
@@ -375,9 +371,6 @@ static void tcpserver_broadcastbut(t_tcpserver *x, t_symbol *s, int argc,
t_atom *argv)
{
int but=-1;
- //int client=0;
- // t_iemnet_chunk*chunk=NULL;
-
if(argc<2) {
return;
}
@@ -398,8 +391,7 @@ static void tcpserver_defaultsend(t_tcpserver *x, t_symbol *s, int argc,
tcpserver_send_toclient(x, client, argc, argv);
return;
}
- pd_error(x, "[%s] illegal socket %d, switching to broadcast mode", objName,
- sockfd);
+ iemnet_log(x, IEMNET_ERROR, "illegal socket:%d, switching to broadcast mode", sockfd);
x->x_defaulttarget=0;
} else if(sockfd<0) {
client=tcpserver_socket2index(x, -sockfd);
@@ -407,8 +399,7 @@ static void tcpserver_defaultsend(t_tcpserver *x, t_symbol *s, int argc,
tcpserver_send_butclient(x, client, argc, argv);
return;
}
- pd_error(x, "[%s] illegal !ocket %d, switching to broadcast mode", objName,
- sockfd);
+ iemnet_log(x, IEMNET_ERROR, "illegal socket:%d excluded, switching to broadcast mode", sockfd);
x->x_defaulttarget=0;
}
@@ -421,8 +412,9 @@ static void tcpserver_defaulttarget(t_tcpserver *x, t_floatarg f)
unsigned int client=(rawclient<0)?(-rawclient):rawclient;
if(client > x->x_nconnections) {
- error("[%s] target %d out of range [0..%d]", objName, client,
- (int)(x->x_nconnections));
+ iemnet_log(x, IEMNET_ERROR,
+ "target %d out of range [0..%d]",
+ client, (int)(x->x_nconnections));
return;
}
@@ -443,8 +435,6 @@ static void tcpserver_targetsocket(t_tcpserver *x, t_floatarg f)
x->x_defaulttarget=sockfd;
}
-
-
/* send message to client using socket number */
static void tcpserver_send_socket(t_tcpserver *x, t_symbol *s, int argc,
t_atom *argv)
@@ -457,7 +447,7 @@ static void tcpserver_send_socket(t_tcpserver *x, t_symbol *s, int argc,
return;
}
} else {
- pd_error(x, "%s_send: no socket specified", objName);
+ iemnet_log(x, IEMNET_ERROR, "no socket specified");
return;
}
@@ -466,11 +456,11 @@ static void tcpserver_send_socket(t_tcpserver *x, t_symbol *s, int argc,
int sockfd=atom_getint(argv);
client = tcpserver_socket2index(x, sockfd);
if(client < 0) {
- post("%s_send: no connection on socket %d", objName, sockfd);
+ iemnet_log(x, IEMNET_ERROR, "no connection on socket %d", sockfd);
return;
}
} else {
- post("%s_send: no socket specified", objName);
+ iemnet_log(x, IEMNET_ERROR, "only numeric sockets allowed");
return;
}
@@ -495,11 +485,9 @@ static void tcpserver_disconnect(t_tcpserver *x, unsigned int client)
x->x_sr[k + 1]=NULL;
x->x_nconnections--;
-
outlet_float(x->x_connectout, x->x_nconnections);
}
-
/* disconnect a client by number */
static void tcpserver_disconnect_client(t_tcpserver *x, t_floatarg fclient)
{
@@ -511,7 +499,6 @@ static void tcpserver_disconnect_client(t_tcpserver *x, t_floatarg fclient)
tcpserver_disconnect(x, client);
}
-
/* disconnect a client by socket */
static void tcpserver_disconnect_socket(t_tcpserver *x, t_floatarg fsocket)
{
@@ -521,8 +508,6 @@ static void tcpserver_disconnect_socket(t_tcpserver *x, t_floatarg fsocket)
}
}
-
-
/* disconnect a client by socket */
static void tcpserver_disconnect_all(t_tcpserver *x)
{
@@ -551,11 +536,9 @@ static void tcpserver_receive_callback(void *y0,
} else {
// disconnected
int sockfd=y->sr_fd;
- verbose(1, "[%s] got disconnection for socket:%d", objName, sockfd);
+ iemnet_log(x, IEMNET_VERBOSE, "got disconnection for socket:%d", sockfd);
tcpserver_disconnect_socket(x, sockfd);
}
-
- // post("tcpserver: %d bytes in %d packets", bytecount, packetcount);
}
static void tcpserver_connectpoll(t_tcpserver *x)
@@ -571,12 +554,12 @@ static void tcpserver_connectpoll(t_tcpserver *x)
} else {
t_tcpserver_socketreceiver *y = NULL;
if(x->x_nconnections>=MAX_CONNECT) {
- pd_error(x, "%s: cannot handle more than %d connections, dropping",
- objName, x->x_nconnections);
+ iemnet_log(x, IEMNET_ERROR,
+ "cannot handle more than %d connections, dropping!",
+ x->x_nconnections);
iemnet__closesocket(fd);
}
-
y = tcpserver_socketreceiver_new((void *)x, fd, &incomer_address);
if (!y) {
iemnet__closesocket(fd);
@@ -616,7 +599,8 @@ static void tcpserver_port(t_tcpserver*x, t_floatarg fportno)
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if(sockfd<0) {
- sys_sockerror("[tcpserver]: cannot create TCP/IP socket");
+ iemnet_log(x, IEMNET_ERROR, "unable to create TCP/IP socket");
+ sys_sockerror("socket");
return;
}
@@ -629,7 +613,8 @@ static void tcpserver_port(t_tcpserver*x, t_floatarg fportno)
server.sin_port = htons((u_short)portno);
/* name the socket */
if (bind(sockfd, (struct sockaddr *)&server, serversize) < 0) {
- sys_sockerror("tcpserver: bind");
+ iemnet_log(x, IEMNET_ERROR, "unable to bind to TCP/IP socket");
+ sys_sockerror("bind");
iemnet__closesocket(sockfd);
outlet_anything(x->x_statout, gensym("port"), 1, ap);
return;
@@ -637,26 +622,25 @@ static void tcpserver_port(t_tcpserver*x, t_floatarg fportno)
/* streaming protocol */
if (listen(sockfd, 5) < 0) {
- sys_sockerror("tcpserver: listen");
+ iemnet_log(x, IEMNET_ERROR, "unable to listen on TCP/IP socket");
+ sys_sockerror("listen");
iemnet__closesocket(sockfd);
sockfd = -1;
outlet_anything(x->x_statout, gensym("port"), 1, ap);
return;
} else {
- sys_addpollfn(sockfd, (t_fdpollfn)tcpserver_connectpoll,
- x); // wait for new connections
+ /* wait for new connections */
+ sys_addpollfn(sockfd, (t_fdpollfn)tcpserver_connectpoll, x);
}
x->x_connectsocket = sockfd;
x->x_port = portno;
-
// find out which port is actually used (useful when assigning "0")
if(!getsockname(sockfd, (struct sockaddr *)&server, &serversize)) {
x->x_port=ntohs(server.sin_port);
}
-
SETFLOAT(ap, x->x_port);
outlet_anything(x->x_statout, gensym("port"), 1, ap);
}
@@ -693,8 +677,6 @@ static void *tcpserver_new(t_floatarg fportno)
}
x->x_defaulttarget=0;
-
-
x->x_floatlist=iemnet__floatlist_create(1024);
tcpserver_port(x, fportno);
@@ -753,7 +735,6 @@ IEMNET_EXTERN void tcpserver_setup(void)
gensym("targetsocket"), A_DEFFLOAT, 0);
class_addlist (tcpserver_class, (t_method)tcpserver_defaultsend);
-
class_addmethod(tcpserver_class, (t_method)tcpserver_serialize,
gensym("serialize"), A_FLOAT, 0);
@@ -767,5 +748,4 @@ IEMNET_EXTERN void tcpserver_setup(void)
IEMNET_INITIALIZER(tcpserver_setup);
-
/* end of tcpserver.c */