/* * serveraccept: * Accept a server socket from the named port */ long serveraccept(char *pname, struct sockaddr_in *ha) { struct sockaddr_in sin; long ha_len = sizeof(*ha); int s, sa; long port; struct servent *sp; long on = 1; /* Create address corresponding our service */ bzero((caddr_t)&sin, sizeof(sin)); sin.sin_len = sizeof(struct sockaddr_in); sin.sin_family = AF_INET; /* A port must be in the range 1 - 65535 */ if (StrToLong(pname, &port) > 0 && port < 65536 ) sin.sin_port = port; else if (sp = getservbyname(pname, "tcp")) sin.sin_port = sp->s_port; else { return -1; } sin.sin_addr.s_addr = INADDR_ANY; if ((s = socket(AF_INET, SOCK_STREAM, 0)) < 0) { PrintNetFault(Errno(), "socket"); return -1; } /* Reuse this port */ if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof(on)) < 0) { PrintNetFault(Errno(), "setsockopt"); sa = -1; goto Return; } /* Bind it to socket */ if (bind(s, (struct sockaddr *)&sin, sizeof(sin)) < 0 ) { PrintNetFault(Errno(), "bind"); sa = -1; goto Return; } if (listen(s, 1) < 0) { PrintNetFault(Errno(), "listen"); sa = -1; goto Return; } if ((sa = accept(s, (struct sockaddr *)ha, &ha_len)) < 0){ PrintNetFault(Errno(), "accept"); } Return: CloseSocket(s); return sa; }
int Sys_Net_Receive(struct SysNetData *netdata, struct SysSocket *socket, void *data, int datalen, struct netaddr *address) { int r; if (address) { LONG fromlen; struct sockaddr_in addr; fromlen = sizeof(addr); r = recvfrom(socket->s, data, datalen, 0, (struct sockaddr *)&addr, &fromlen); if (fromlen != sizeof(addr)) return -1; address->type = NA_IPV4; address->addr.ipv4.port = htons(addr.sin_port); *(unsigned int *)address->addr.ipv4.address = *(unsigned int *)&addr.sin_addr.s_addr; } else r = recv(socket->s, data, datalen, 0); if (r == -1) { if (Errno() == EWOULDBLOCK) return 0; } return r; }
int Sys_Net_Send(struct SysNetData *netdata, struct SysSocket *socket, const void *data, int datalen, const struct netaddr *address) { int r; if (address) { struct sockaddr_in addr; addr.sin_family = AF_INET; addr.sin_port = htons(address->addr.ipv4.port); *(unsigned int *)&addr.sin_addr.s_addr = *(unsigned int *)address->addr.ipv4.address; r = sendto(socket->s, data, datalen, 0, (struct sockaddr *)&addr, sizeof(addr)); } else r = send(socket->s, data, datalen, 0); if (r == -1) { if (Errno() == EWOULDBLOCK) return 0; } return r; }
long tcp_errno(void) { return Errno(); }