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); 
}