/** make socket and first see if ifname contains port override info */ static int make_sock_port(int stype, const char* ifname, const char* port, struct addrinfo *hints, int v6only, int* noip6, size_t rcv, size_t snd) { char* s = strchr(ifname, '@'); if(s) { /* override port with ifspec@port */ char p[16]; char newif[128]; if((size_t)(s-ifname) >= sizeof(newif)) { log_err("ifname too long: %s", ifname); *noip6 = 0; return -1; } if(strlen(s+1) >= sizeof(p)) { log_err("portnumber too long: %s", ifname); *noip6 = 0; return -1; } strncpy(newif, ifname, sizeof(newif)); newif[s-ifname] = 0; strncpy(p, s+1, sizeof(p)); p[strlen(s+1)]=0; return make_sock(stype, newif, p, hints, v6only, noip6, rcv, snd); } return make_sock(stype, ifname, port, hints, v6only, noip6, rcv, snd); }
int main() { int ret; #ifdef _WIN32 WSADATA wsa_data; ret = WSAStartup(MAKEWORD(2, 2), &wsa_data); #endif int server_sock = make_sock(); struct sockaddr_storage client_addr; socklen_t addr_size = sizeof(client_addr); char buf[ECHO_LEN]; char hbuf[NI_MAXHOST], sbuf[NI_MAXSERV]; for(;;) { error: ret = recvfrom(server_sock, buf, ECHO_LEN - 1, 0, (struct sockaddr *)&client_addr, &addr_size); check(ret > 0, "recvfrom error"); buf[ret] = '\0'; int len = ret; ret = getnameinfo((struct sockaddr *)&client_addr, addr_size, hbuf, sizeof(hbuf), \ sbuf, sizeof(sbuf), NI_NUMERICHOST | NI_NUMERICSERV); check(ret == 0, "getnameinfo"); printf("recvfrom client [%s:%s] : %s\n", hbuf, sbuf, buf); ret = sendto(server_sock, buf, len, 0, (struct sockaddr *)&client_addr, addr_size); } }
int make_data_connection(context_t *cxt) { int ret; ret = make_sock(&cxt->socks[DATA_SOCK], SERVER_IP, DATA_PORT); if (ret < 0) { return ret; } return data_rx_handler(&cxt->socks[DATA_SOCK]); }
int bsc_ussd_init(struct bsc_nat *nat) { struct in_addr addr; addr.s_addr = INADDR_ANY; if (nat->ussd_local) inet_aton(nat->ussd_local, &addr); nat->ussd_listen.data = nat; return make_sock(&nat->ussd_listen, IPPROTO_TCP, ntohl(addr.s_addr), 5001, 0, ussd_listen_cb, nat); }
int control_open(void) { int len; if ((len = make_sock()) == -1) return -1; #ifdef DEBUG_MEMORY atexit(cleanup); #endif return connect(fd, (struct sockaddr *)&sun, len); }
int main() { client_sock = make_sock("127.0.0.1"); ikcpcb *kcp = ikcp_create(0x11223344, (void*)0); kcp->output = udp_output; ikcp_wndsize(kcp, 128, 128); ikcp_nodelay(kcp, 0, 10, 0, 0); char buf[ECHO_LEN]; char *buf_in; char *msg = "hello"; int i=0; int current; int ret; for(;;) { ++i; isleep(1); current = iclock(); ikcp_update(kcp, current); if (i % 1000 == 0) { sprintf(buf, "%s:%d, %u", msg, i, current); ret = ikcp_send(kcp, buf, strlen(buf)); check(ret >= 0, "send"); printf("send [%s]\n", buf); } ret = recv(client_sock, buf, ECHO_LEN-1, 0); check_silently(ret > 0); ikcp_input(kcp, buf, ret); printf("\nrecv from server raw: %s\n", buf); ret = ikcp_recv(kcp, buf, ECHO_LEN-1); check_silently(ret > 0); buf[ret] = '\0'; printf("\nrecv from server: %s\n", buf); error: continue; } }
int control_start(void) { int len; if ((len = make_sock()) == -1) return -1; unlink(CONTROLSOCKET); if (bind(fd, (struct sockaddr *)&sun, len) == -1 || chmod(CONTROLSOCKET, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP) == -1 || set_cloexec(fd) == -1 || set_nonblock(fd) == -1 || listen(fd, sizeof(control_fds)) == -1) { close(fd); return -1; } eloop_event_add(fd, control_handle, NULL); return fd; }
int main(int argc, char **argv) { int ret; context_t context; if (zero_context(&context) < 0) { return EXIT_FAILURE; } ret = make_sock(&context.socks[CTL_SOCK], SERVER_IP, CTL_PORT); if (ret < 0) { destroy_context(&context); return EXIT_FAILURE; } proc_ebs(&context); destroy_context(&context); return EXIT_SUCCESS; }
int rdt_connect(struct in_addr dst, int scid, int dcid) { int n, fd; pid_t pid; struct sockaddr_un un; struct in_addr src; struct conn_info conn_info; if (signal(SIGINT, sig_hand) == SIG_ERR || signal(SIGHUP, sig_hand) == SIG_ERR || signal(SIGQUIT, sig_hand) == SIG_ERR) { err_sys("signal() error"); } src = get_addr(dst); pid = getpid(); /* allocate share area for send * and recv process. */ conn_alloc(); conn_info.cact = ACTIVE; conn_info.pid = pid; conn_info.src = conn_user->src = src; conn_info.dst = conn_user->dst = dst; conn_info.scid = conn_user->scid = scid; conn_info.dcid = conn_user->dcid = dcid; conn_user->sndfd = make_fifo(pid, "snd"); conn_user->rcvfd = make_fifo(pid, "rcv"); conn_user->sfd = make_sock(); conn_user->seq = conn_user->ack = 0; if (!mtu) { if (dev[0] == 0 && !get_dev(src, dev)) err_quit("can't get dev name"); mtu = get_mtu(dev); } n = min(mtu, 1500); conn_user->mss = n; if ((conn_user->sndpkt = malloc(n)) == NULL) err_sys("malloc() sndpkt error"); if ((conn_user->rcvpkt = malloc(n)) == NULL) err_sys("malloc() rcvpkt error"); if ((fd = ux_cli(RDT_UX_SOCK, &un)) < 0) err_sys("ux_cli() error"); n = sizeof(struct conn_info); if (sendto(fd, &conn_info, n, 0, (struct sockaddr *)&un, sizeof(struct sockaddr_un)) != n) { err_sys("sendto() error"); } get_pkt(conn_user->sndfd, &conn_info, NULL, 0); conn_user->scid = conn_info.scid; if (rexmt_pkt(conn_user, RDT_REQ, NULL, 0) < 0) err_sys("rexmt_pkt() error"); fprintf(stderr, "rdt_connect() succeed\n"); pkt_debug((struct rdthdr *)conn_user->sndpkt); return(0); }