aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIOhannes m zmölnig <zmoelnig@users.sourceforge.net>2010-03-31 08:04:04 +0000
committerIOhannes m zmölnig <zmoelnig@users.sourceforge.net>2010-03-31 08:04:04 +0000
commit2803fe4ea2ce43903e9d0fa65fafb16aa43872c9 (patch)
tree574ab570ddc4041d72658aa11d751e39de09621b
parentabce3c4b1b6a04399e85a4a1a92736a426ba8d62 (diff)
query the server port
especially useful when autoassigning ports (port=0) svn path=/trunk/externals/iem/iemnet/; revision=13319
-rw-r--r--tcpserver.c36
1 files changed, 30 insertions, 6 deletions
diff --git a/tcpserver.c b/tcpserver.c
index 88feb0e..e611551 100644
--- a/tcpserver.c
+++ b/tcpserver.c
@@ -191,8 +191,29 @@ static void tcpserver_info_client(t_tcpserver *x, int client)
static void tcpserver_info(t_tcpserver *x) {
static t_atom output_atom[4];
+ int sockfd=x->x_connectsocket;
- SETFLOAT (output_atom+0, x->x_port);
+
+ int port=x->x_port;
+
+ if(sockfd<0) {
+ // no open port
+ post("no valid sock");
+ }
+
+
+ if(x->x_port<=0) {
+ struct sockaddr_in server;
+ socklen_t serversize=sizeof(server);
+ if(!getsockname(sockfd, (struct sockaddr *)&server, &serversize)) {
+ x->x_port=ntohs(server.sin_port);
+ port=x->x_port;
+ } else {
+ post("gesockname failed for %d", sockfd);
+ }
+ }
+
+ SETFLOAT (output_atom+0, port);
outlet_anything( x->x_statout, gensym("port"), 1, output_atom);
}
@@ -471,6 +492,7 @@ static void tcpserver_port(t_tcpserver*x, t_floatarg fportno)
static t_atom ap[1];
int portno = fportno;
struct sockaddr_in server;
+ socklen_t serversize=sizeof(server);
int sockfd = x->x_connectsocket;
SETFLOAT(ap, -1);
if(x->x_port == portno) {
@@ -497,7 +519,7 @@ static void tcpserver_port(t_tcpserver*x, t_floatarg fportno)
/* assign server port number */
server.sin_port = htons((u_short)portno);
/* name the socket */
- if (bind(sockfd, (struct sockaddr *)&server, sizeof(server)) < 0)
+ if (bind(sockfd, (struct sockaddr *)&server, serversize) < 0)
{
sys_sockerror("tcpserver: bind");
sys_closesocket(sockfd);
@@ -505,9 +527,6 @@ static void tcpserver_port(t_tcpserver*x, t_floatarg fportno)
return;
}
- // LATER find out which port is used (useful when assigning "0")
- portno=ntohs((uint16_t)server.sin_port);
-
/* streaming protocol */
if (listen(sockfd, 5) < 0)
{
@@ -526,9 +545,14 @@ static void tcpserver_port(t_tcpserver*x, t_floatarg fportno)
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);
-
}
static void *tcpserver_new(t_floatarg fportno)