/** NOTE: both IP address and port are in host byte order */ STATIC File * SocketOpen2(IPaddr addr, Port port) { Socket sock = INVALID_SOCKET; if (SOCKET_GetTcp(0,&sock)) { if (SOCKET_Connect(sock, addr, port)) { SocketFile * s = MEM_New(SocketFile); if (s) { Bool ok; StrBuf32 nameBuf; STRBUF_InitBufXXX(&nameBuf); STRBUF_Format(&nameBuf.sb, TEXT(IPADDR_FORMAT)TEXT_(":%hu"), HOST_IPADDR_FORMAT_ARG(addr),port); memset(s, 0, sizeof(*s)); ok = FILE_Init(&s->file, nameBuf.sb.s, False, &SocketIO); STRBUF_Destroy(&nameBuf.sb); if (ok) { s->sock = sock; s->eof = False; return &s->file; } } shutdown(sock, SHUT_RDWR); } closesocket(sock); } return NULL; }
/** * Connects to the specified IP address/port. * Both port and IP address are in host byte order */ Bool SOCKET_Connect(Socket s, IPaddr ipaddr, Port port) { int err; struct sockaddr_in sa; /* initialize sockaddr_in */ memset(&sa, 0, sizeof(sa)); sa.sin_family = AF_INET; sa.sin_port = htons(port); sa.sin_addr.s_addr = htonl(ipaddr); /* connect */ err = connect(s,(struct sockaddr*)&sa,sizeof(sa)); if (err) { Verbose(TEXT("ERROR: cannot connect to ") TEXT(IPADDR_FORMAT) TEXT(":%hu\n"), HOST_IPADDR_FORMAT_ARG(ipaddr), port); return False; } else { return True; } }