aboutsummaryrefslogtreecommitdiff
path: root/udpserver.c
diff options
context:
space:
mode:
Diffstat (limited to 'udpserver.c')
-rw-r--r--udpserver.c92
1 files changed, 52 insertions, 40 deletions
diff --git a/udpserver.c b/udpserver.c
index 8ecfe90..900e0d7 100644
--- a/udpserver.c
+++ b/udpserver.c
@@ -45,32 +45,32 @@ typedef struct _udpserver_sender {
long sr_host;
unsigned short sr_port;
- t_int sr_fd;
+ int sr_fd;
t_iemnet_sender*sr_sender;
} t_udpserver_sender;
typedef struct _udpserver {
- t_object x_obj;
- t_outlet *x_msgout;
- t_outlet *x_connectout;
- t_outlet *x_sockout; // legacy
- t_outlet *x_addrout; // legacy
- t_outlet *x_statout;
-
- t_udpserver_sender *x_sr[MAX_CONNECT]; /* socket per connection */
- t_int x_nconnections;
-
- t_int
- x_connectsocket; /* socket waiting for new connections */
- t_int x_port;
- unsigned char
- x_accept; /* whether we accept new connections or not */
-
- /* the default connection to send to; 0=broadcast; >0 use this client; <0 exclude this client */
- int x_defaulttarget;
-
- t_iemnet_receiver *x_receiver;
- t_iemnet_floatlist *x_floatlist;
+ t_object x_obj;
+ t_outlet*x_msgout;
+ t_outlet*x_connectout;
+ t_outlet*x_sockout; // legacy
+ t_outlet*x_addrout; // legacy
+ t_outlet*x_statout;
+
+ t_udpserver_sender*x_sr[MAX_CONNECT]; /* socket per connection */
+ unsigned int x_nconnections;
+
+ int x_connectsocket; /* socket waiting for new connections */
+ unsigned short x_port;
+ unsigned char x_accept; /* whether we accept new connections or not */
+
+ /* the default connection to send to;
+ 0=broadcast; >0 use this client; <0 exclude this client
+ */
+ int x_defaulttarget;
+
+ t_iemnet_receiver*x_receiver;
+ t_iemnet_floatlist*x_floatlist;
} t_udpserver;
static t_udpserver_sender *udpserver_sender_new(t_udpserver *owner,
@@ -112,7 +112,7 @@ static void udpserver_sender_free(t_udpserver_sender *x)
iemnet__sender_destroy(sender, 0);
}
if(sockfd>=0) {
- iemnet__closesocket(sockfd);
+ iemnet__closesocket(sockfd, 1);
}
}
/* coverity[pass_freed_arg]: this is merely for debugging printout */
@@ -126,7 +126,7 @@ static t_udpserver_sender* udpserver_sender_copy(t_udpserver_sender*x)
static int udpserver_socket2index(t_udpserver*x, int sockfd)
{
- int i=0;
+ unsigned int i=0;
for(i = 0; i < x->x_nconnections; i++) { /* check if connection exists */
if(x->x_sr[i]->sr_fd == sockfd) {
return i;
@@ -139,14 +139,22 @@ static int udpserver_socket2index(t_udpserver*x, int sockfd)
* if the id is invalid, returns -1
* if the id is valid, return the 0-based index (client-1)
*/
-static int udpserver_fixindex(t_udpserver*x, int client)
+static int udpserver_fixindex(t_udpserver*x, int client_)
{
+ unsigned int client;
+ if(client_<1) {
+ iemnet_log(x, IEMNET_ERROR,
+ "client:%d out of range [1..%d]",
+ client_, (int)(x->x_nconnections));
+ return -1;
+ }
+ client = (unsigned int)client_;
if(x->x_nconnections <= 0) {
iemnet_log(x, IEMNET_ERROR, "no clients connected");
return -1;
}
- if (!((client > 0) && (client <= x->x_nconnections))) {
+ if (client > x->x_nconnections) {
iemnet_log(x, IEMNET_ERROR,
"client:%d out of range [1..%d]",
client, (int)(x->x_nconnections));
@@ -170,7 +178,7 @@ static int equal_addr(unsigned long host1, unsigned short port1,
static int udpserver__find_sender(t_udpserver*x, unsigned long host,
unsigned short port)
{
- int i=0;
+ unsigned int i=0;
for(i=0; i<x->x_nconnections; i++) {
if(NULL==x->x_sr[i]) {
return -1;
@@ -393,13 +401,14 @@ static void udpserver_send_toclient(t_udpserver *x, unsigned int client,
static void udpserver_send_client(t_udpserver *x, t_symbol *s, int argc,
t_atom *argv)
{
- int client=0;
+ unsigned int client=0;
if (argc > 0) {
- client=udpserver_fixindex(x, atom_getint(argv));
- if(client<0) {
+ int c=udpserver_fixindex(x, atom_getint(argv));
+ if(c<0) {
return;
}
+ client=(unsigned int)c;
if(argc==1) {
udpserver_info_client(x, client);
} else {
@@ -482,7 +491,7 @@ static void udpserver_defaulttarget(t_udpserver *x, t_floatarg f)
{
int sockfd=0;
int rawclient=f;
- int client=(rawclient<0)?(-rawclient):rawclient;
+ unsigned int client=(rawclient<0)?(-rawclient):rawclient;
if(client > x->x_nconnections) {
iemnet_log(x, IEMNET_ERROR,
@@ -613,7 +622,7 @@ static void udpserver_receive_callback(void *y, t_iemnet_chunk*c)
}
if(c) {
- int conns = x->x_nconnections;
+ unsigned int conns = x->x_nconnections;
t_udpserver_sender*sdr=NULL;
DEBUG("add new sender from %d", c->port);
sdr=udpserver_sender_add(x, c->addr, c->port);
@@ -632,7 +641,7 @@ static void udpserver_receive_callback(void *y, t_iemnet_chunk*c)
}
} else {
// disconnection never happens with a connectionless protocol like UDP
- iemnet_log(x, IEMNET_ERROR, "received disonnection event");
+ iemnet_log(x, IEMNET_ERROR, "received disconnection event");
}
}
@@ -660,7 +669,7 @@ static void udpserver_connectpoll(t_udpserver *x)
t_udpserver_sender *y = udpserver_sender_new(x, host, port);
if (!y) {
- iemnet__closesocket(fd);
+ iemnet__closesocket(fd, 1);
return;
}
x->x_nconnections++;
@@ -690,7 +699,7 @@ static void udpserver_port(t_udpserver*x, t_floatarg fportno)
/* cleanup any open ports */
if(sockfd>=0) {
//sys_rmpollfn(sockfd);
- iemnet__closesocket(sockfd);
+ iemnet__closesocket(sockfd, 0);
x->x_connectsocket=-1;
x->x_port=-1;
}
@@ -714,7 +723,7 @@ static void udpserver_port(t_udpserver*x, t_floatarg fportno)
if (bind(sockfd, (struct sockaddr *)&server, serversize) < 0) {
iemnet_log(x, IEMNET_ERROR, "unable to bind to socket");
sys_sockerror("bind");
- iemnet__closesocket(sockfd);
+ iemnet__closesocket(sockfd, 1);
outlet_anything(x->x_statout, gensym("port"), 1, ap);
return;
}
@@ -771,7 +780,6 @@ static void *udpserver_new(t_floatarg fportno)
static void udpserver_free(t_udpserver *x)
{
int i;
-
for(i = 0; i < MAX_CONNECT; i++) {
if (NULL!=x->x_sr[i]) {
DEBUG("[%s] free %x", objName, x);
@@ -779,14 +787,18 @@ static void udpserver_free(t_udpserver *x)
x->x_sr[i]=NULL;
}
}
+ if(x->x_receiver) {
+ iemnet__receiver_destroy(x->x_receiver, 0);
+ x->x_receiver=NULL;
+ }
if (x->x_connectsocket >= 0) {
- //sys_rmpollfn(x->x_connectsocket);
- iemnet__closesocket(x->x_connectsocket);
+ iemnet__closesocket(x->x_connectsocket, 0);
+ x->x_connectsocket = -1;
}
if(x->x_floatlist) {
iemnet__floatlist_destroy(x->x_floatlist);
+ x->x_floatlist=NULL;
}
- x->x_floatlist=NULL;
}
IEMNET_EXTERN void udpserver_setup(void)