www.pudn.com > 使用IP网络聊天的VOIP源码.zip > socks.cpp
/* Talker - A small program which utilizes the Layer-3 codec (ACM) in windows for voice-over-IP Copyright (C) 1999 Dino Klein This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. email: dinoklein@hotmail.com */ #define WIN32_LEAN_AND_MEAN #include#include #include #include "defines.h" void ErrB (char*, int=0, HWND=0); // external variables extern unsigned long my_addr, dst_addr; extern SOCKET ssin, sout; extern char my_addr_txt [16]; extern char listen_mode; char set_host_addr (void) { LPHOSTENT h; char name [128]; long r; r = gethostname (name, 128); if (!r) { h = gethostbyname (name); if (h) { if (h -> h_addrtype == AF_INET) { my_addr = *((u_long *) (h->h_addr_list[0])); memset (my_addr_txt, 0, 16); sprintf (my_addr_txt, "%u.%u.%u.%u", (unsigned char) h->h_addr_list[0][0], (unsigned char) h->h_addr_list[0][1], (unsigned char) h->h_addr_list[0][2], (unsigned char) h->h_addr_list[0][3]); return (1); } else ErrB ("invalid address familiy returned"); } else ErrB ("unable to resolve name to adress"); } else ErrB ("unable to retreive host name"); return (0); } char init_input_socket (void) { SOCKADDR_IN sai; long r; DWORD t; ssin = socket (AF_INET, SOCK_DGRAM, IPPROTO_UDP); if (ssin != INVALID_SOCKET) { t = 1; r = ioctlsocket (ssin, FIONBIO, &t); if (!r) { sai.sin_family = AF_INET; sai.sin_port = htons(IN_PORT); sai.sin_addr.s_addr = my_addr; for (int i=0; i<8; i++) sai.sin_zero[i] = 0; r = bind (ssin, (SOCKADDR *) &sai, sizeof (SOCKADDR_IN)); if (!r) { if (!listen_mode) { sai.sin_family = AF_INET; sai.sin_port = htons(OUT_PORT); sai.sin_addr.s_addr = dst_addr; for (int i=0; i<8; i++) sai.sin_zero[i] = 0; //memset (sai.sin_zero, 0, 8); r = connect (ssin, (SOCKADDR *) &sai, sizeof (SOCKADDR_IN)); } if (!r) return (1); } } closesocket (ssin); } return (0); } char init_output_socket (void) { SOCKADDR_IN sai; long r; DWORD t; sout = socket (AF_INET, SOCK_DGRAM, IPPROTO_UDP); if (sout != INVALID_SOCKET) { t = 1; r = ioctlsocket (sout, FIONBIO, &t); if (!r) { sai.sin_family = AF_INET; sai.sin_port = htons(OUT_PORT); sai.sin_addr.s_addr = my_addr; memset (sai.sin_zero, 0, 8); r = bind (sout, (SOCKADDR *) &sai, sizeof (SOCKADDR_IN)); if (!r) { if (!listen_mode) { sai.sin_family = AF_INET; sai.sin_port = htons(IN_PORT); sai.sin_addr.s_addr = dst_addr; memset (sai.sin_zero, 0, 8); r = connect (sout, (SOCKADDR *) &sai, sizeof (SOCKADDR_IN)); } if (!r) return (1); } } closesocket (sout); } return (0); } void close_output_socket (void) { closesocket (sout); } void close_input_socket (void) { closesocket (ssin); } void close_sockets (void) { close_output_socket (); close_input_socket (); WSACleanup (); } char init_sockets (void) { WSADATA wd; long r; r = WSAStartup (0x0002, &wd); if (!r) { // r = set_host_addr (); r = 1; if (r) { r = init_input_socket (); if (r) { r = init_output_socket (); if (r) return (1); close_input_socket (); } } WSACleanup (); } return (0); }