* ***************************************************** */
byte[] bintargetport = new byte[2];
socksClientStream. Read(bintargetport, 0, 2);
byte[] tmp_byteorder = new byte[2];
tmp_byteorder[0] = bintargetport[1];
tmp_byteorder[1] = bintargetport[0];
target_port = (int)BitConverter. ToUInt16(tmp_byteorder, 0);
Console. WriteLine("requesting " + connection_target + ":" + target_port. ToString());
serverClient = new TcpClient(connection_target, target_port);
/* *****************************************************
* reply part
* ***************************************************** */
if (serverClient. Connected)
{
// reply successful audience
byte[] reply = new byte[10];
//version
reply[0] = SOCKS_VERSION;
// replycode
reply[1] = SOCKS_REPLYSUCCESS;
//reserved and 0
reply[2] = 0;
// addresstype
reply[3] = 1;
string ip = serverClient. Client. LocalEndPoint. ToString().Split(':')[0];
IPAddress ipaddr = IPAddress. Parse(ip);
reply[4] = ipaddr. GetAddressBytes()[0];
reply[5] = ipaddr. GetAddressBytes()[1];
reply[6] = ipaddr. GetAddressBytes()[2];
reply[7] = ipaddr. GetAddressBytes()[3];
int port = int. Parse(serverClient. Client. LocalEndPoint. ToString().Split(':')[1]);
// read unsigned integer in networkoctet order
reply[8] = BitConverter. GetBytes((UInt16)port)[0];
reply[9] = BitConverter. GetBytes((UInt16)port)[1];
socksClientStream. Write(reply, 0, 10);
Console. WriteLine("writing reply");
Etc..
}
Ниже приведен простейшего HTTP прокси сервера на Python.
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
from SocketServer import ThreadingMixIn
import urllib2, sys, re, httplib, urlparse
class ProxyHandler( BaseHTTPRequestHandler ):
server_version = ''
sys_version = ''
def do_HEAD( self ):
print "HEAD"
def log_message(self, format,*args):
return
def do_POST( self ):
print '-------------------------------'
print "POST"
requested_url = self. requestline. split()[1]
parsed_url = urlparse. urlsplit( requested_url )
cutted_url = urlparse. urlunsplit( ( '', '', parsed_url. path, parsed_url. query, '' ) )
print parsed_url. hostname
print parsed_url. path
print parsed_url. query
print requested_url
port = 80 if None == parsed_url. port else parsed_url. port
req_headers = {}
for x in self. headers. items():
req_headers[x[0]] = x[1]
print req_headers
body = self. rfile. read(int(self. headers['content-length']))
print 'body -- ',body
conn = httplib. HTTPConnection( parsed_url. hostname, port )
conn. request( 'POST', cutted_url, body, headers = req_headers )
response = conn. getresponse()
print response. status
self. send_response( response. status )
#resp_headers = []
#if 'content-type' in response. msg. dict:
# resp_headers. append( ( 'content-type', response. msg. dict['content-type'] ) )
#if 'date' in response. msg. dict:
# resp_headers. append( ( 'date', response. msg. dict['date'] ) )
#if 'set-cookie' in response. msg. dict:
# resp_headers. append( ( 'set-cookie', response. msg. dict['set-cookie'] ) )
#if 'location' in response. msg. dict:
# resp_headers. append( ( 'location', response. msg. dict['location'] ) )
#for x in resp_headers:
# self. send_header( x[0], x[1] )
#self. end_headers()
for x in response. msg. items():
self. send_header( x[0], x[1] )
self. end_headers()
html = response. read()
self. wfile. write( html )
self. connection. close()
conn. close()
print 'End - post'
return
def do_GET( self ):
print '--------------------------------------'
print 'GET'
requested_url = self. requestline. split()[1]
parsed_url = urlparse. urlsplit( requested_url )
cutted_url = urlparse. urlunsplit( ( '', '', parsed_url. path, parsed_url. query, '' ) )
port = 80 if None == parsed_url. port else parsed_url. port
#if 'accept' in self. headers. dict:
# req_headers['accept'] = self. headers. dict['accept']
#if 'accept-charset' in self. headers. dict:
# req_headers['accept-charset'] = self. headers. dict['accept-charset']
#if 'accept-language' in self. headers. dict:
# req_headers['accept-language'] = self. headers. dict['accept-language']
#req_headers['cache-control'] = 'no-cache'
#req_headers['pragma'] = 'no-cache'
#req_headers['user-agent'] = 'Mozilla/5.0'
#if 'referer' in self. headers. dict:
# req_headers['referer'] = self. headers. dict['referer']
#if 'host' in self. headers. dict:
# req_headers['host'] = self. headers. dict['host']
#for x in self. headers. dict. keys():
# if len( x ) >= 6 and x[:6] == 'cookie':
# req_headers[x] = self. headers. dict[x]
#for x in self. headers. dict. keys():
# req_headers[x] = self. headers. headers[x]
req_headers = {}
for x in self. headers. items():
req_headers[x[0]] = x[1]
print req_headers
conn = httplib. HTTPConnection( parsed_url. hostname, port )
conn. request( 'GET', cutted_url,'' ,req_headers )
response = conn. getresponse()
#if response. status not in ( 200, 302, 301, 204 ):
# print requested_url + ' - ' + str( response. status )
# print self. headers. headers
# print response. msg. headers
# self. send_response( response. status )
# self. end_headers()
# self. connection. close()
# conn. close()
# return
#resp_headers = []
#if 'content-type' in response. msg. dict:
# resp_headers. append( ( 'content-type', response. msg. dict['content-type'] ) )
#if 'date' in response. msg. dict:
# resp_headers. append( ( 'date', response. msg. dict['date'] ) )
#if 'set-cookie' in response. msg. dict:
# resp_headers. append( ( 'set-cookie', response. msg. dict['set-cookie'] ) )
#if 'location' in response. msg. dict:
# resp_headers. append( ( 'location', response. msg. dict['location'] ) )
self. name = ''
self. send_response( response. status )
print response. status
print parsed_url. hostname, ':', port
print response. msg. items()
i=0
for x in response. msg. items():
i=i+1
if(x[0]!='transfer-encoding'):
print '--- ', x[0],' : ' ,x[1]
if(x[0]!='connection'):
self. send_header( x[0], x[1] )
else: self. send_header( 'connection', 'close' )
self. end_headers()
#self. wfile. write( response. status )
#self. wfile. write( ' content-type: text/html' )
html = response. read()
self. wfile. write( html )
#self. wfile. flush()
#self. wfile. close()
conn. close()
self. connection. close()
print 'END -- GET'
return 0
class ThreadedHTTPServer( ThreadingMixIn, HTTPServer ):
daemon_threads = True
if __name__ == '__main__':
proxy = ThreadedHTTPServer( ( 'localhost', 19277 ), ProxyHandler )
try:
proxy. serve_forever()
except KeyboardInterrupt:
print 'End of server'
proxy. server_close()
3.10 Лабораторная работа №9 распределенный UDP сервер/ UDP клиент
Цель работы: написать приложения клиент, сервер, эмитирующие работу протокола UDP, обеспечить надежность доставки, автоматическое обнаружение расчетчиков;
User Datagram Protocol
Транспортный протокол для передачи данных в сетях IP без установления соединения. Он является одним из самых простых протоколов транспортного уровня модели OSI.
В отличие от TCP, UDP не подтверждает доставку данных, не заботится о корректном порядке доставки и не делает повторов. Поэтому аббревиатуру UDP иногда расшифровывают как Unreliable Datagram Protocol (протокол ненадёжных датаграмм). Зато отсутствие соединения, дополнительного трафика и возможность широковещательных рассылок делают его удобным для применений, где малы потери, в массовых рассылках локальной подсети, в медиапротоколах и т. п.
Распределенный UDP сервер/ UDP клиент
Задача написать приложение раздающее задание, которое посылало бы данные на несколько приложений расчетчиков, затем все расчетчики производили бы какие-либо преобразования над данными и отсылали их обратно. В случае, если приложение раздающее задание не получило обработанные данные обратно, оно должно отправить начальные данные другому расчетчику.
Обеспечение надежности доставки
Для обеспечения надежности доставки можно использовать следующие методы: хэш-функции, кода Хэмминга или Рида Соломона, контрольные суммы. На примере хэш-функции:
Вычисляем хэш-функцию от данных, отправляем ее вместе с данными, получатель вычисляет свою хэш-функцию от полученных данных, сравнивает ее с полученной хэш-функцией, если все передалось успешно - они совпадут.
Автоматическое обнаружение расчетчиков
Например:
Создаем сервер с заранее известным портом. И несколько клиентов, один из которых будет раздавать задания, а остальные производить расчеты. Все клиенты регистрируются на сервере, как «расчетчики» и один, как «раздающий задания». Затем сервер передает данные о расчетчиках раздающему задания, тот в свою очередь посылает данные для расчета напрямую расчетчикам.
Данный вариант не является эталонным. Принимаются любые другие, лишь бы выполняли поставленную задачу.
Рекомендуемая литература:
http://helper10.narod. ru/i27.htm
http://tools. ietf. org/html/rfc768
http://docs. /javase/1.4.2/docs/api/java/net/DatagramSocket. html
http://docs. /javase/1.4.2/docs/api/java/net/DatagramPacket. html
Пример Java:
Для работы с датаграммными сокетами приложение должно создать сокет на базе класса DatagramSocket, а также подготовить объект класса DatagramPacket, в который будет записан принятый от партнера по сети блок данных. Канал, а также входные и выходные потоки создавать не нужно. Данные передаются и принимаются методами send и receive, определенными в классе DatagramSocket.
В классе DatagramSocket определены два конструктора, прототипы которых представлены ниже:
public DatagramSocket(int port);
public DatagramSocket();
Первый из этих конструкторов позволяет определить порт для сокета, второй предполагает использование любого свободного порта.
Обычно серверные приложения работают с использованием какого-то заранее определенного порта, номер которого известен клиентским приложениям. Поэтому для серверных приложений больше подходит первый из приведенных выше конструкторов.
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |


