mirror of
https://github.com/3cky/mbusd.git
synced 2025-02-15 00:51:35 +01:00
Add command-line and config options to set an TCP socket address (#53)
Still no IPv6 support though.
This commit is contained in:
parent
2465860496
commit
2aa063db79
@ -53,7 +53,7 @@ Usage:
|
|||||||
------
|
------
|
||||||
|
|
||||||
mbusd [-h] [-d] [-L logfile] [-v level] [-c cfgfile] [-p device] [-s speed] [-m mode]
|
mbusd [-h] [-d] [-L logfile] [-v level] [-c cfgfile] [-p device] [-s speed] [-m mode]
|
||||||
[-t] [-y file] [-Y file] [-P port] [-C maxconn] [-N retries]
|
[-t] [-y file] [-Y file] [-A address] [-P port] [-C maxconn] [-N retries]
|
||||||
[-R pause] [-W wait] [-T timeout]
|
[-R pause] [-W wait] [-T timeout]
|
||||||
|
|
||||||
-h Usage help.
|
-h Usage help.
|
||||||
@ -80,6 +80,8 @@ Usage:
|
|||||||
-Y file
|
-Y file
|
||||||
Enable RS-485 direction data direction control by writing '0' to file
|
Enable RS-485 direction data direction control by writing '0' to file
|
||||||
for transmitter enable and '1' to file for transmitter disable
|
for transmitter enable and '1' to file for transmitter disable
|
||||||
|
-A address
|
||||||
|
Specifies TCP address to bind (default 0.0.0.0).
|
||||||
-P port
|
-P port
|
||||||
Specifies TCP port number (default 502).
|
Specifies TCP port number (default 502).
|
||||||
-C maxconn
|
-C maxconn
|
||||||
|
@ -23,6 +23,9 @@ trx_control = addc
|
|||||||
|
|
||||||
############# TCP port settings #############
|
############# TCP port settings #############
|
||||||
|
|
||||||
|
# TCP server address to bind
|
||||||
|
address = 0.0.0.0
|
||||||
|
|
||||||
# TCP server port number
|
# TCP server port number
|
||||||
port = 502
|
port = 502
|
||||||
|
|
||||||
|
@ -22,6 +22,8 @@ mbusd \- MODBUS/TCP to MODBUS/RTU gateway.
|
|||||||
.IR file ]
|
.IR file ]
|
||||||
.RB [ -Y
|
.RB [ -Y
|
||||||
.IR file ]
|
.IR file ]
|
||||||
|
.RB [ -A
|
||||||
|
.IR address ]
|
||||||
.RB [ -P
|
.RB [ -P
|
||||||
.IR port ]
|
.IR port ]
|
||||||
.RB [ -C
|
.RB [ -C
|
||||||
@ -57,6 +59,8 @@ Specifies serial port device name.
|
|||||||
Specifies serial port speed.
|
Specifies serial port speed.
|
||||||
.IP "\fB-m \fImode\fR"
|
.IP "\fB-m \fImode\fR"
|
||||||
Specifies serial port mode (like 8N1).
|
Specifies serial port mode (like 8N1).
|
||||||
|
.IP "\fB-A \fIaddress\fR"
|
||||||
|
Specifies TCP address to bind.
|
||||||
.IP "\fB-P \fIport\fR"
|
.IP "\fB-P \fIport\fR"
|
||||||
Specifies TCP port number.
|
Specifies TCP port number.
|
||||||
.IP \fB-t\fR
|
.IP \fB-t\fR
|
||||||
|
@ -67,6 +67,7 @@ cfg_init(void)
|
|||||||
cfg.trxcntl = TRX_ADDC;
|
cfg.trxcntl = TRX_ADDC;
|
||||||
*cfg.trxcntl_file = '\0';
|
*cfg.trxcntl_file = '\0';
|
||||||
#endif
|
#endif
|
||||||
|
strncpy(cfg.serveraddr, DEFAULT_SERVERADDR, INTBUFSIZE);
|
||||||
cfg.serverport = DEFAULT_SERVERPORT;
|
cfg.serverport = DEFAULT_SERVERPORT;
|
||||||
cfg.maxconn = DEFAULT_MAXCONN;
|
cfg.maxconn = DEFAULT_MAXCONN;
|
||||||
cfg.maxtry = DEFAULT_MAXTRY;
|
cfg.maxtry = DEFAULT_MAXTRY;
|
||||||
@ -122,6 +123,10 @@ cfg_handle_param(char *name, char *value)
|
|||||||
}
|
}
|
||||||
strncpy(cfg.ttymode, value, INTBUFSIZE);
|
strncpy(cfg.ttymode, value, INTBUFSIZE);
|
||||||
}
|
}
|
||||||
|
else if (CFG_NAME_MATCH("address"))
|
||||||
|
{
|
||||||
|
strncpy(cfg.serveraddr, value, INTBUFSIZE);
|
||||||
|
}
|
||||||
else if (CFG_NAME_MATCH("port"))
|
else if (CFG_NAME_MATCH("port"))
|
||||||
{
|
{
|
||||||
cfg.serverport = strtoul(value, NULL, 0);
|
cfg.serverport = strtoul(value, NULL, 0);
|
||||||
|
@ -58,6 +58,8 @@ typedef struct
|
|||||||
int trxcntl;
|
int trxcntl;
|
||||||
/* trx control sysfs file */
|
/* trx control sysfs file */
|
||||||
char trxcntl_file[INTBUFSIZE + 1];
|
char trxcntl_file[INTBUFSIZE + 1];
|
||||||
|
/* TCP server address */
|
||||||
|
char serveraddr[INTBUFSIZE + 1];
|
||||||
/* TCP server port number */
|
/* TCP server port number */
|
||||||
int serverport;
|
int serverport;
|
||||||
/* maximum number of connections */
|
/* maximum number of connections */
|
||||||
|
@ -113,13 +113,12 @@ conn_init(void)
|
|||||||
state_tty_set(&tty, TTY_PAUSE);
|
state_tty_set(&tty, TTY_PAUSE);
|
||||||
|
|
||||||
/* create server socket */
|
/* create server socket */
|
||||||
if ((server_sd =
|
if ((server_sd = sock_create_server(cfg.serveraddr, cfg.serverport, TRUE)) < 0)
|
||||||
sock_create_server("", cfg.serverport, TRUE)) < 0)
|
|
||||||
{
|
{
|
||||||
#ifdef LOG
|
#ifdef LOG
|
||||||
logw(0, "conn_init():"
|
logw(0, "conn_init():"
|
||||||
" can't create listen() socket (%s)",
|
" can't create listen socket (%s)",
|
||||||
strerror(errno));
|
(errno != 0) ? strerror(errno) : "failed");
|
||||||
#endif
|
#endif
|
||||||
return RC_ERR;
|
return RC_ERR;
|
||||||
}
|
}
|
||||||
|
@ -46,6 +46,7 @@
|
|||||||
/*
|
/*
|
||||||
* Default values
|
* Default values
|
||||||
*/
|
*/
|
||||||
|
#define DEFAULT_SERVERADDR "0.0.0.0"
|
||||||
#define DEFAULT_SERVERPORT 502
|
#define DEFAULT_SERVERPORT 502
|
||||||
#define DEFAULT_MAXCONN 32
|
#define DEFAULT_MAXCONN 32
|
||||||
#define DEFAULT_MAXTRY 3
|
#define DEFAULT_MAXTRY 3
|
||||||
|
12
src/main.c
12
src/main.c
@ -111,7 +111,8 @@ usage(char *exename)
|
|||||||
#ifdef TRXCTL
|
#ifdef TRXCTL
|
||||||
" [-t] [-y sysfsfile] [-Y sysfsfile]\n"
|
" [-t] [-y sysfsfile] [-Y sysfsfile]\n"
|
||||||
#endif
|
#endif
|
||||||
" [-P port] [-C maxconn] [-N retries] [-R pause] [-W wait] [-T timeout]\n\n"
|
" [-A address] [-P port] [-C maxconn] [-N retries]\n"
|
||||||
|
" [-R pause] [-W wait] [-T timeout]\n\n"
|
||||||
"Options:\n"
|
"Options:\n"
|
||||||
" -h : this help\n"
|
" -h : this help\n"
|
||||||
" -d : don't daemonize\n"
|
" -d : don't daemonize\n"
|
||||||
@ -128,6 +129,7 @@ usage(char *exename)
|
|||||||
" -p device : set serial port device name (default %s)\n"
|
" -p device : set serial port device name (default %s)\n"
|
||||||
" -s speed : set serial port speed (default %d)\n"
|
" -s speed : set serial port speed (default %d)\n"
|
||||||
" -m mode : set serial port mode (default %s)\n"
|
" -m mode : set serial port mode (default %s)\n"
|
||||||
|
" -A address : set TCP server address to bind (default %s)\n"
|
||||||
" -P port : set TCP server port number (default %d)\n"
|
" -P port : set TCP server port number (default %d)\n"
|
||||||
#ifdef TRXCTL
|
#ifdef TRXCTL
|
||||||
" -t : enable RTS RS-485 data direction control using RTS\n"
|
" -t : enable RTS RS-485 data direction control using RTS\n"
|
||||||
@ -148,7 +150,8 @@ usage(char *exename)
|
|||||||
#ifdef LOG
|
#ifdef LOG
|
||||||
LOGPATH, LOGNAME, cfg.dbglvl,
|
LOGPATH, LOGNAME, cfg.dbglvl,
|
||||||
#endif
|
#endif
|
||||||
cfg.ttyport, cfg.ttyspeed, cfg.ttymode, cfg.serverport,
|
cfg.ttyport, cfg.ttyspeed, cfg.ttymode,
|
||||||
|
cfg.serveraddr, cfg.serverport,
|
||||||
MAX_MAXCONN, cfg.maxconn, MAX_MAXTRY, cfg.maxtry,
|
MAX_MAXCONN, cfg.maxconn, MAX_MAXTRY, cfg.maxtry,
|
||||||
MAX_RQSTPAUSE, cfg.rqstpause, MAX_RESPWAIT, cfg.respwait,
|
MAX_RQSTPAUSE, cfg.rqstpause, MAX_RESPWAIT, cfg.respwait,
|
||||||
MAX_CONNTIMEOUT, cfg.conntimeout);
|
MAX_CONNTIMEOUT, cfg.conntimeout);
|
||||||
@ -180,7 +183,7 @@ main(int argc, char *argv[])
|
|||||||
#ifdef LOG
|
#ifdef LOG
|
||||||
"v:L:"
|
"v:L:"
|
||||||
#endif
|
#endif
|
||||||
"p:s:m:P:C:N:R:W:T:c:")) != RC_ERR)
|
"p:s:m:A:P:C:N:R:W:T:c:")) != RC_ERR)
|
||||||
{
|
{
|
||||||
switch (rc)
|
switch (rc)
|
||||||
{
|
{
|
||||||
@ -290,6 +293,9 @@ main(int argc, char *argv[])
|
|||||||
exit(-1);
|
exit(-1);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case 'A':
|
||||||
|
strncpy(cfg.serveraddr, optarg, INTBUFSIZE);
|
||||||
|
break;
|
||||||
case 'P':
|
case 'P':
|
||||||
cfg.serverport = strtoul(optarg, NULL, 0);
|
cfg.serverport = strtoul(optarg, NULL, 0);
|
||||||
break;
|
break;
|
||||||
|
35
src/sock.c
35
src/sock.c
@ -94,13 +94,33 @@ sock_create(int blkmode)
|
|||||||
* Return: socket descriptor, otherwise RC_ERR if there some errors
|
* Return: socket descriptor, otherwise RC_ERR if there some errors
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
sock_create_server(char *server_ip,
|
sock_create_server(char *server_ip, unsigned short server_port, int blkmode)
|
||||||
unsigned short server_port, int blkmode)
|
|
||||||
{
|
{
|
||||||
struct sockaddr_in server_sockaddr;
|
struct sockaddr_in server_sockaddr;
|
||||||
int sock_opt = 1;
|
int sock_opt = 1;
|
||||||
int server_s;
|
int server_s;
|
||||||
|
|
||||||
|
memset(&server_sockaddr, 0, sizeof(server_sockaddr));
|
||||||
|
server_sockaddr.sin_family = AF_INET; // FIXME IPv6 support
|
||||||
|
|
||||||
|
/* parse address to bind socket */
|
||||||
|
if (server_ip != NULL)
|
||||||
|
{
|
||||||
|
if (inet_aton(server_ip, &server_sockaddr.sin_addr) == 0)
|
||||||
|
{
|
||||||
|
#ifdef LOG
|
||||||
|
logw(0, "sock_create_server():"
|
||||||
|
" can't parse address: %s",
|
||||||
|
server_ip);
|
||||||
|
#endif
|
||||||
|
return RC_ERR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
server_sockaddr.sin_addr.s_addr = htonl(INADDR_ANY);
|
||||||
|
|
||||||
|
server_sockaddr.sin_port = htons(server_port);
|
||||||
|
|
||||||
/* create socket in desired blocking mode */
|
/* create socket in desired blocking mode */
|
||||||
server_s = sock_create(blkmode);
|
server_s = sock_create(blkmode);
|
||||||
if (server_s < 0) return server_s;
|
if (server_s < 0) return server_s;
|
||||||
@ -144,16 +164,7 @@ sock_create_server(char *server_ip,
|
|||||||
return RC_ERR;
|
return RC_ERR;
|
||||||
}
|
}
|
||||||
|
|
||||||
memset(&server_sockaddr, 0, sizeof(server_sockaddr));
|
/* bind socket to given address and port */
|
||||||
server_sockaddr.sin_family = AF_INET;
|
|
||||||
|
|
||||||
if (server_ip != NULL)
|
|
||||||
inet_aton(server_ip, &server_sockaddr.sin_addr);
|
|
||||||
else
|
|
||||||
server_sockaddr.sin_addr.s_addr = htonl(INADDR_ANY);
|
|
||||||
|
|
||||||
server_sockaddr.sin_port = htons(server_port);
|
|
||||||
|
|
||||||
if (bind(server_s, (struct sockaddr *) & server_sockaddr,
|
if (bind(server_s, (struct sockaddr *) & server_sockaddr,
|
||||||
sizeof(server_sockaddr)) == -1)
|
sizeof(server_sockaddr)) == -1)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user