SOCKET TcpConnect (LPCSTR szHost, LPCSTR szService, unsigned short nPort) { int Rc; struct sockaddr_in saSockAddr; struct servent * lpServEnt; SOCKET connect_skt; /* --- 1er champ de saSockAddr : Port */ lpServEnt = (szService==NULL) ? NULL : getservbyname (szService, "tcp") ; saSockAddr.sin_port = lpServEnt!=NULL ? lpServEnt->s_port : htons(nPort); /* --- 2eme champ de saSockAddr : Addresse serveur */ saSockAddr.sin_addr = Tcp4uGetIPAddr (szHost); if (saSockAddr.sin_addr.s_addr==INADDR_NONE) return INVALID_SOCKET; /* --- Dernier champ : liaison connectie */ saSockAddr.sin_family = AF_INET; /* on utilise le mode connecte TCP */ /* --- creation de la socket */ if ( (connect_skt = socket (PF_INET, SOCK_STREAM, 0))==SOCKET_ERROR) return SOCKET_ERROR; /* --- connect retourne INVALID_SOCKET ou numero valide */ Rc = connect (connect_skt,(struct sockaddr *) & saSockAddr, sizeof saSockAddr); /* --- enregistrement dans notre table */ return Rc==0 ? connect_skt : SOCKET_ERROR; } /* TcpConnect */
/* ------------------------------------------------------------------------- */ int API4U UdpInit (LPUDPSOCK far *pUdp, LPCSTR szHost, unsigned short uRemotePort, unsigned short uLocalPort) { int Rc; SOCKET UdpSock = INVALID_SOCKET; struct sockaddr_in saSendAddr; /* structure identifiant le destinataire */ struct sockaddr_in saBindAddr; /* structure limitant les clients */ Tcp4uLog (LOG4U_PROC, "UdpInit, host %s", szHost); memset (& saBindAddr, 0, sizeof saBindAddr); memset (& saSendAddr, 0, sizeof saSendAddr); /* --- 1. calcul de saSendAddr : RemoteService et szHost */ saSendAddr.sin_family = AF_INET; saSendAddr.sin_port = htons (uRemotePort) ; if (szHost!=NULL) { saSendAddr.sin_addr = Tcp4uGetIPAddr (szHost); if (saSendAddr.sin_addr.s_addr==INADDR_NONE) { Tcp4uLog (LOG4U_ERROR, "UdpInit: host Unknown"); return TCP4U_HOSTUNKNOWN; } } /* szHost is specified */ /* --- autres champs de saBindAddr */ saBindAddr.sin_port = htons (uLocalPort); saBindAddr.sin_family = AF_INET; saBindAddr.sin_addr.s_addr = INADDR_ANY; /* --- Allocation de la socket */ Tcp4uLog (LOG4U_CALL, "socket PF_INET SOCK_DGRAM"); UdpSock = socket (PF_INET, SOCK_DGRAM, 0); if (UdpSock<0) { Tcp4uLog (LOG4U_ERROR, "socket PF_INET SOCK_DGRAM"); return TCP4U_NOMORESOCKET; } /* --- do a bind, thus all packets to be received will come on given port */ Tcp4uLog (LOG4U_CALL, "bind to %s", inet_ntoa (saBindAddr.sin_addr)); Rc = bind (UdpSock, (struct sockaddr far *) & saBindAddr, sizeof(struct sockaddr)); if (Rc<0) { Tcp4uLog (LOG4U_ERROR, "bind to %s", inet_ntoa (saBindAddr.sin_addr)); CloseSocket (UdpSock); return TCP4U_BINDERROR; } /* --- Allocation de la structure */ *pUdp = Calloc (sizeof (UDPSOCK), 1); if (*pUdp==NULL) { CloseSocket (UdpSock); return TCP4U_INSMEMORY; } (*pUdp)->UdpSock = UdpSock; (*pUdp)->saSendAddr = saSendAddr; (*pUdp)->bSemiConnected = FALSE; /* can receive data from any host */ Tcp4uLog (LOG4U_EXIT, "UdpInit"); return TCP4U_SUCCESS; } /* UdpInit */