1
0
mirror of https://github.com/open-simh/simh.git synced 2026-04-26 04:07:23 +00:00

SOCKETS: Cleanup, simplify and extend the sim_sock API set.

Cleanup/Simplification by:
	1) removing irrelevant master flag variable from sim_close_sock and thus sim_err_sock
	2) change previous boolean feature arguments (datagram, nodelay, reuseaddr) to flag bits in a single option argument.  This allows for features to be added by new flag bits which don't change the calling signatures.
	3) changed all status returns to be int (vs t_stat) with success being 0 and error being -1
	4) removed unneeded simh specific type references to allow sim_sock to be used by n
Extended API by providing flags to influence socket setup/behavior:
	SIM_SOCK_OPT_REUSEADDR	Retains prior behavior when sim_switches had -U set
	SIM_SOCK_OPT_DATAGRAM	UDP socket setup provided for when prior datagram argument was specified
	SIM_SOCK_OPT_NODELAY		TCP Nagle disable provided for when prior nodelay argument was specified
	SIM_SOCK_OPT_BLOCKING	Blocking socket mode (detault is non blocking)
This commit is contained in:
Mark Pizzolato
2015-02-11 09:41:18 -08:00
parent 5b4e9d5891
commit 1fb209c275
8 changed files with 192 additions and 180 deletions

View File

@@ -154,8 +154,7 @@ static t_stat net_attach(UNIT *uptr, char *cptr) {
char host[CBUFSIZE], port[CBUFSIZE];
t_stat r;
r = sim_parse_addr (cptr, host, sizeof(host), "localhost", port, sizeof(port), "3000", NULL);
if (r != SCPE_OK)
if (sim_parse_addr (cptr, host, sizeof(host), "localhost", port, sizeof(port), "3000", NULL))
return SCPE_ARG;
net_reset(&net_dev);
for (i = 0; i <= MAX_CONNECTIONS; i++)
@@ -185,10 +184,10 @@ static t_stat net_detach(UNIT *uptr) {
if (!(net_unit.flags & UNIT_ATT))
return SCPE_OK; /* if not attached simply return */
if (net_unit.flags & UNIT_SERVER)
sim_close_sock(serviceDescriptor[1].masterSocket, TRUE);
sim_close_sock(serviceDescriptor[1].masterSocket);
for (i = 0; i <= MAX_CONNECTIONS; i++)
if (serviceDescriptor[i].ioSocket)
sim_close_sock(serviceDescriptor[i].ioSocket, FALSE);
sim_close_sock(serviceDescriptor[i].ioSocket);
free(net_unit.filename); /* free port string */
net_unit.filename = NULL;
net_unit.flags &= ~UNIT_ATT; /* not attached */
@@ -226,7 +225,7 @@ static t_stat net_svc(UNIT *uptr) {
BUFFER_LENGTH - serviceDescriptor[i].inputSize);
if (r == -1) {
sim_debug(DROP_MSG, &net_dev, "NET: " ADDRESS_FORMAT " Drop connection %i with socket %i.\n", PCX, i, serviceDescriptor[i].ioSocket);
sim_close_sock(serviceDescriptor[i].ioSocket, FALSE);
sim_close_sock(serviceDescriptor[i].ioSocket);
serviceDescriptor[i].ioSocket = 0;
serviceDescriptor_reset(i);
continue;