* ***************************************************** */

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