📄 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 <winsock2.h>
#include <windows.h>
#include <stdio.h>
#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);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -