static void test_tcp_client(void) { int sd; int re; struct sockaddr_in sa; printf("[tcp(client)] start\n"); sd = so_socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); DEBUG_PRINT(("so_socket = %d(%d, %d)\n", sd, MERCD(sd), SERCD(sd))); if ( sd < 0 ) { goto error2; } bzero(&sa, sizeof sa); sa.sin_family = AF_INET; sa.sin_addr.s_addr = htonl(INADDR_LOOPBACK); sa.sin_port = htons(12345); re = so_connect(sd, (struct sockaddr*)&sa, sizeof sa); printf("so_connect = %d(%d, %d)\n", re, MERCD(re), SERCD(re)); if ( re < 0 ) { goto error2; } re = so_write(sd, "1234", 4); DEBUG_PRINT(("so_write = %d(%d, %d)\n", re, MERCD(re), SERCD(re))); if ( re < 0 ) { goto error2; } re = so_send(sd, "a", 1, MSG_OOB); DEBUG_PRINT(("so_send = %d(%d, %d)\n", re, MERCD(re), SERCD(re))); if ( re < 0 ) { goto error2; } so_close(sd); tk_wai_sem(semid2, 1, TMO_FEVR); re = so_break(server_tskid); DEBUG_PRINT(("so_break = %d(%d, %d)\n", re, MERCD(re), SERCD(re))); if ( re < 0 ) { goto error2; } printf("[tcp(client)] OK\n"); return; error2: if ( sd > 0 ) { so_close(sd); } so_break(server_tskid); printf("[tcp(client)] FAILED\n"); }
int host_connect(const char *hostname, int port) { struct in_addr addr; errno = 0; if (!so_resolv(&addr, hostname)) { //if (debug) // printf("so_resolv: %s failed (%d: %s)\n", hostname, h_errno, hstrerror(h_errno)); return -1; } return so_connect(addr, port); }
static void connectctlmsg(Proto *x, Conv *c, Cmdbuf *cb) { char *p; USED(x); if(c->state != Idle) error(Econinuse); c->state = Connecting; c->cerr[0] = '\0'; switch(cb->nf) { default: error("bad args to connect"); case 2: p = setraddrport(c, cb->f[1]); if(p != nil) error(p); break; case 3: p = setraddrport(c, cb->f[1]); if(p != nil) error(p); c->lport = portno(cb->f[2]); setlport(c); break; } qunlock(&c->l); if(waserror()){ qlock(&c->l); c->state = Connected; /* sic */ nexterror(); } /* p = x->connect(c, cb->f, cb->nf); */ so_connect(c->sfd, c->raddr, c->rport); qlock(&c->l); poperror(); setladdr(c); c->state = Connected; }
BOOL cg_socket_connect(CgSocket *sock, char *addr, int port) { #if defined(BTRON) || (defined(TENGINE) && !defined(CG_TENGINE_NET_KASAGO)) ERR ret; struct sockaddr_in sockaddr; if (cg_socket_tosockaddrin(addr, port, &sockaddr, TRUE) == FALSE) return FALSE; if (cg_socket_isbound(sock) == FALSE) cg_socket_setid(sock, so_socket(PF_INET, cg_socket_getrawtype(sock), 0)); ret = so_connect(sock->id, (SOCKADDR *)&sockaddr, sizeof(struct sockaddr_in)); #elif defined(TENGINE) && defined(CG_TENGINE_NET_KASAGO) ERR ret; struct sockaddr_in sockaddr; if (cg_socket_tosockaddrin(addr, port, &sockaddr, TRUE) == FALSE) return FALSE; if (cg_socket_isbound(sock) == FALSE) cg_socket_setid(sock, ka_socket(PF_INET, cg_socket_getrawtype(sock), cg_socket_getprototype(sock))); ret = ka_connect(sock->id, (struct sockaddr *)&sockaddr, sizeof(struct sockaddr_in)); #elif defined(ITRON) T_TCP_CCEP tcpccep = { 0, sock->sendWinBuf, CG_NET_SOCKET_WINDOW_BUFSIZE, sock->recvWinBuf, CG_NET_SOCKET_WINDOW_BUFSIZE, (FP)cg_socket_tcp_callback }; T_IPV4EP localAddr; T_IPV4EP dstAddr; ER ret; if (cg_socket_getavailablelocaladdress(&localAddr) == FALSE) return FALSE; if (cg_socket_isbound(sock) == FALSE) { cg_socket_initwindowbuffer(sock); cg_socket_setid(sock, cg_socket_getavailableid(cg_socket_issocketstream(sock))); if (tcp_cre_cep(sock->id, &tcpccep) != E_OK) return FALSE; } dstAddr.ipaddr = ascii_to_ipaddr(addr); dstAddr.portno = htons(port); ret = tcp_con_cep(sock->id, &localAddr, &dstAddr, TMO_FEVR); if (ret == E_OK) { cg_socket_setaddress(sock, ""/*ipaddr_to_ascii(localAddr.ipaddr)*/); cg_socket_setport(sock, ntohs(localAddr.portno)); ret = 0; } else ret = -1; #else struct addrinfo *toaddrInfo; int ret; if (cg_socket_tosockaddrinfo(cg_socket_getrawtype(sock), addr, port, &toaddrInfo, TRUE) == FALSE) return FALSE; if (cg_socket_isbound(sock) == FALSE) cg_socket_setid(sock, socket(toaddrInfo->ai_family, toaddrInfo->ai_socktype, 0)); ret = connect(sock->id, toaddrInfo->ai_addr, toaddrInfo->ai_addrlen); freeaddrinfo(toaddrInfo); #endif cg_log_debug_l4("Entering...\n"); cg_socket_setdirection(sock, CG_NET_SOCKET_CLIENT); #if defined(CG_USE_OPENSSL) if (cg_socket_isssl(sock) == TRUE) { sock->ctx = SSL_CTX_new( SSLv23_client_method()); sock->ssl = SSL_new(sock->ctx); if (SSL_set_fd(sock->ssl, cg_socket_getid(sock)) == 0) { cg_socket_close(sock); return FALSE; } if (SSL_connect(sock->ssl) < 1) { cg_socket_close(sock); return FALSE; } } #endif cg_log_debug_l4("Leaving...\n"); return (ret == 0) ? TRUE : FALSE; }
long ipwrite(Chan *ch, void *a, long n, vlong offset) { Conv *c; Proto *x; int r, nf; char *p, *fields[3], buf[128]; switch(TYPE(ch->qid)) { default: error(Eperm); case Qcs: return cswrite(ch, a, n, offset); case Qctl: x = &proto[PROTO(ch->qid)]; c = x->conv[CONV(ch->qid)]; if(n > sizeof(buf)-1) n = sizeof(buf)-1; memmove(buf, a, n); buf[n] = '\0'; nf = tokenize(buf, fields, 3); if(strcmp(fields[0], "connect") == 0){ switch(nf) { default: error("bad args to connect"); case 2: p = setraddrport(c, fields[1]); if(p != 0) error(p); break; case 3: p = setraddrport(c, fields[1]); if(p != 0) error(p); c->lport = atoi(fields[2]); setlport(c); break; } so_connect(c->sfd, c->raddr, c->rport); setladdr(c); c->state = "Established"; return n; } if(strcmp(fields[0], "announce") == 0) { switch(nf){ default: error("bad args to announce"); case 2: setladdrport(c, fields[1]); break; } so_listen(c->sfd); c->state = "Announced"; return n; } if(strcmp(fields[0], "bind") == 0){ switch(nf){ default: error("bad args to bind"); case 2: c->lport = atoi(fields[1]); break; } setlport(c); return n; } error("bad control message"); case Qdata: x = &proto[PROTO(ch->qid)]; c = x->conv[CONV(ch->qid)]; r = so_send(c->sfd, a, n, 0); if(r < 0){ oserrstr(); nexterror(); } return r; } return n; }