Напишите программу или функцию, которая прослушивает входящий TCP-трафик через порт N. Он предлагает простую услугу: он вычисляет сумму полей IP-адресов входящего соединения и возвращает.
Программа или функция читает целое число N из аргументов или стандартного ввода. Он прослушивает входящие TCP-соединения через порт N. Когда кто-то подключается к этому порту, программа вычисляет сумму полей своего IP-адреса и отправляет ее обратно клиенту с завершающим символом новой строки и закрывает соединение.
- Номер порта N является допустимым, и 2 10 <N <2 15
- Скользящие новая строка может быть
\n
или\r\n
- Вы можете использовать IPv4 или IPv6. Поскольку адреса IPv6 записываются в шестнадцатеричной форме, вы также должны предоставить результат в том же формате, например
2001:0db8:0000:0042:0000:8a2e:0370:7334 => 12ecd
.
Это код-гольф . Применяются стандартные правила и лазейки.
пример
Вы запускаете свой сервер с ./server 1234
. Теперь сервер работает и ожидает подключения через порт 1234. Затем клиент 127.0.0.1
подключается к вашему серверу. Сервер выполняет простой расчет: 127+0+0+1 => 128
и посылает результат к клиенту (с задней новой строки): 128\n
. Затем сервер закрывает соединение и ждет следующего клиента.
Leaderboard
var QUESTION_ID=76379,OVERRIDE_USER=20569;function answersUrl(e){return"https://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"https://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table>
источник
Ответы:
Bash + netcat + ss +…,
6560 символовНе серьезное решение, просто было любопытно об этой возможности.
Благодаря:
awk
фильтрации на основе (-5 символов)Образец прогона:
(Терминал 1)
(терминал 2)
В Ubuntu вы можете получить
nc
из netcat-традиционных (нет, netcat-openbsd не очень хорошо) иss
из iproute2 .источник
C #,
284283282278274254 байтаКлассический пример базового C # TCP-сервера. Тестирование:
Терминал 1:
Терминал 2:
Fire Fox:
источник
int Main
вместоvoid Main
. Поскольку программа никогда не возвращает, компилятор не требуетreturn
утверждения.Start
является необязательным, сохраняя другой символ.using
наTcpClient
, который спасет вас еще три символа (используйте{}
из отfor
), и делать то же самое сStreamWriter
должен сохранить еще один.Flush
StreamWriter
Linux ELF / x86, 146 байт
Включает 52-байтовый заголовок ELF, 32-байтовый программный заголовок, 111 байтов программного кода + 3 байта кода для пропуска внутри заголовков.
Информация о том , как создавать крошечные ELF исполняемых файлов можно найти на сайте Breadbox «s „ вихре Учебник по созданию Really крохотный ELF Исполняемые для Linux “ .
Linux / i386 использует
socketcall(2)
мультиплексный системный вызов, который принимаетebx
конкретный вызов сокета (SYS_*
макросы из/usr/include/linux/net.h
) иecx
указатель на область аргументов исходного вызова библиотеки.Некоторые вещи сделаны, чтобы сохранить маленький исполняемый файл:
EDX
точек входа требуется функция финализации (полезно для исполняемых файлов, загружаемых динамическим компоновщиком) или значение NULL).argv[0]
).bind(2)
,listen(2)
иaccept(2)
.phentsize
иphnum
поле, байты предваряются, превращается вCMP
операцию , которая принимаетphentsize
иphnum
поле , как непосредственные (трюк бесстыдно украдено из раствора Breadbox к 123 в анархии гольфах ).LODS
(загрузка в аккумулятор и исходный индекс увеличения / уменьшения) иSTOS
(сохранение из аккумулятора и целевой индекс увеличения / уменьшения) хороши для короткого кода.XCHG EAX, reg
1 байт, по сравнению сMOV EAX, reg
которым занимает 2 байта.CDQ/CLTD
(знак расширенияEAX
вEDX:EAX
) может использоваться как 1-байтовый способ обнуленияEDX
регистра.BSWAP
полезно для реализацииhtons()
.Источник носа:
источник
NodeJS,
146134127 байтЯ наконец получил возможность опубликовать ответ NodeJS! IPv4 только сейчас.
Пример исполнения:
node script.js 1024
. Из другого терминала:источник
'\n'
шаблонную строку, содержащую буквальный перевод строки.Tcl, 92
Довольно понятно,
socket -server s $argv
создает прослушивающий сокет на порту, указанном в аргументах.Каждый раз, когда приходит новое соединение,
proc s
вызывается, с каналом, адресом источника и портом источника в качестве параметров.string map
заменяет.
для+
в адрес источника, иexpr
арифметически оценивает результат, который затемputs
обратно к каналу связиc
.vwait
запускает цикл обработки событий для перехвата входящих событий подключения.Благодарим @DonalFellows за следующее:
Вот версия, которая обрабатывает IPv6 (требуется Tcl 8.6; большая часть дополнительной длины связана с получением шестнадцатеричного ответа):
Tcl, 109
источник
apply
, похоже, ничего не спасает. И вы не можете использовать, такtcl::mathop::+ {*}[split $a .]
как это немного дольше. Вы также не можете побрить что-либо из названий опций. Но добавить поддержку IPv6 довольно просто, и стоит всего лишь несколько байтов кода (и тогдаregsub
подход на основе такой же длины).proc s {c a p}
тебе действительно нужны все эти пробелы?Groovy
133,125,93, 89Только IPv4, наверное.
Ungolfed:
Тестирование:
источник
.toInteger()
→as int
иs.inetAddress.address*.toInteger()
→(s.inetAddress.address as int[])
. И есть дополнительное место после.with
.Python 3,
170166147 байтПринимает порт
stdin
, только IPv4. Работает в GNU / Linux (и, как я полагаю, в большинстве других версий), который автоматически расширяет "" до "0.0.0.0", хотя не уверен насчет Windows.источник
import *
и, SOCK_STREAM
не нужны. Кроме того, строка отправки может быть записана более эффективно, какc.send(b"%d\n"%eval(a[0].replace(".","+")))
.s=socket(2)
.int(input())
становитсяinput()
и отправляется частьc.send(`eval(a[0].replace(".","+"))`)
Java,
371368350344333310295282 байтаGolfed
Ungolfed
Выход
источник
int k=
и замените k со всеми вещами вInteger.toString(k)
. Чтобы сэкономить несколько байтов.interface
вclass
должны получить еще несколько байтa.getOutputStream().write((c[0] + c[1] + c[2] + c[3]+"\n").getBytes());
вместоnew DataOutputStream(a.getOutputStream()).writeBytes(c[0] + c[1] + c[2] + c[3] + "\n")
try(Socket a=...){}
короче чемa.close();
? Требуется Java 7, но может получать байты.PowerShell v2 +,
303268257227 байтСэкономили 35 байтов благодаря Мэтту ... Еще 11 байтов сохранили с помощью псевдонимов
New-Object
и незначительных изменений ... Еще 30 байтов неявно использовали localhost, а неany
IP-адрес, и исправили, чтобы учесть непрерывное использование, как было указано изначально, и я пропустилДействительно похоже на ответ C # , поскольку это .NET лежит в основе обоих. Мы сохраняем несколько байтов здесь по сравнению с ответом на C #, используя возможность возврата функциональности PowerShell (окружая нашу декларацию / присваивание в скобках, а затем немедленно вызывая методы.), Но мы теряем очень много из-за необходимости формулировать суммирование , Тот факт, что у нас есть несколько более короткие имена классов / вызовов, действительно объясняет, почему этот ответ превосходит C #.
объяснение
Сначала мы создаем
New-Alias
(сnal
псевдонимом), чтобы сэкономить при повторном вводеNew-Object
позже. В остальной части первой строки настраивается прослушиватель TCP. Мы передаем командную строку$args[0]
как вход для создания новогоSystem.Net.Sockets.TcpListener
, сохраняемого как$l
. Этот объект инкапсулируется в parens и немедленно вызывается,.Start()
чтобы он активно открыл сокет.Войдя в бесконечный
for
цикл, мы затем устанавливаем наш слушатель$l
на блокировку, сAcceptTcpClient()
которой будет ждать соединения. Ссылка на это соединение (после того, как оно установлено) сохраняется в$c
инкапсулированном виде в скобках и немедленно вызываетсяGetStream()
для получения потока данных. Этот поток данных передается новомуSystem.IO.StreamWriter
конструктору$w
, поэтому мы можем им манипулировать. Этот конструктор сам заключен в скобки и сразу вызываетсяWrite(...)
.Внутри
Write(...)
вызова мы берем наш дескриптор клиента$c
и получаем егоRemoteEndPoint
собственность. Это единственный способ (который я нашел) получить удаленный IP-адрес. Затем нам нужно повторно привести его как[System.Net.IPEndPoint]
объект, чтобы он правильно отформатирован, инкапсулировать это в скобках и извлечь только.Address
свойство. Затем мы-replace
записываем буквальные периоды со знаком плюс, а затем направляем егоInvoke-Expression
(аналогичноeval
) для получения нашего суммирования.После записи ввода / вывода нам нужно позвонить,
.Dispose()
чтобы убедиться, что поток данных сброшен на клиент и закрыт. TCP-сервер прерывает соединение с клиентом без предупреждения, поэтому в зависимости от используемого клиента он может зависнуть на некоторое время. Затем он продолжаетfor
цикл без надлежащего закрытия соединений. Это также означает, что он теряет память и системные дескрипторы как сумасшедшие, но нас это не волнует, верно? Тем не менее, вам может понадобиться использовать диспетчер задач, чтобы завершить процесс, когда вы закончите работу сервера. : DКроме того, только IPv4, так как суммирование barfs впечатляюще пытается обработать IPv6-адрес, поскольку
:
не является допустимым алгебраическим оператором дляiex
анализа.источник
free()
им после?delete[]
, может быть? : P.close()
и.dispose()
методов, которые мы здесь не называем, которые могли бы привести людей в Code Review в порядок.[Net.ipaddress]::Any
работает.PHP, 161 (56?)
Это мой первый пост здесь. Я надеюсь, что это идет правильно :)
Ungolfed:
Терминал:
Это работает только для IPV4
Редактировать : я только что заметил, что php поддерживает базовый сервер:
я решил придерживаться первоначального количества символов, если кто-то не подтвердит, разрешено ли следующее :)
test2.php: (возможно 56-байтовое решение)
И затем начните обслуживание с:
Chrome как клиент
Редактировать 2: wget как клиент
источник
test2.php
? Если это так, я думаю, вам нужно будет спросить у ОП, считают ли они, что встроенные устройства приемлемы для этой задачи. Это не лазейка, хотя.Go ,
359311Это моя первая программа на Go - она позволила мне понять одну вещь: это определенно не очень хороший язык для игры в гольф!
(Престижность @steve, который сделал большую часть игры в гольф!)
источник
"strings"
становитсяs "strings"
так, что позднееstrings.Split
становится справедливымs.Split
.import(."pkgname")
все функции, которые будут импортированы в текущее пространство имен, вы можете удалить префикс. например.import ."fmt"; Println("foo")
Если вы используете пакетSscanf
изfmt
пакета для анализа адреса вместо регулярных выражений, это сэкономит вам еще несколько байтов, предоставив вам приятный бонусFprintln
за возврат суммы вместо импортаstrconv
.Common Lisp, 110 байт
подробности
источник
q, 88 байтов
system raze"p ",1_.z.x
: Принимает второй аргумент командной строки (первый"-"
для запретаq
интерпретироватьN
как скрипт / файл) и открывает с ним порт ("p "
).q -p N
порт устанавливаетсяN
автоматически, но, поскольку вопрос, по-видимому, предполагает, что этоN
должен быть аргумент программы, а не сам исполняемый файл, я пошел более длинным путем..z.pg
функции, которая обрабатывает входящие запросы,.z.a
IP-адрес хранится в виде 32-разрядного целого числа."i"$0x0 vs
разбивает его на целочисленные «составляющие» иsum
выполняет суммирование.string
числовой результат и добавление"\n"
к нему для возврата клиенту..z.ph
это еще одна функция для запросов HTTP GET, с дополнительной обработкой для преобразования вывода строки в действительный ответ HTTP.Демо-сервер:
Демо-клиент (из другого
q
запущенного сеанса127.0.0.1
):Демо - Клиент (с
curl
):источник
LiveScript,
107105 байтБольше нечего добавить, это просто базовые вещи NodeJS. Точки стиля для
&1
(второй аргумент),<|
(трубопровод F #, похожий на$
Haskell) и biop:(+)
в LS подобны секциям операторов в Haskell: бинарная карри-функция (которая добавляет свои операнды). Также немного грязно:/
если задана литеральная строка справа, будет делиться.источник
Perl,
141132 + 1 = 133 байтаGolfed
Ungolfed
пример
источник
s/\./+/g
→y/./+/
.while(1){…}
→{…;redo}
согласно user130144 большой «ы наконечник . И, кроме->send()
вызова, все остальные скобки не нужны.Python 2, 180 байт
Принимает порт через стандартный ввод.
источник
NodeJS (ES6),
129118107 байтовРаботает на IPv4. Беги как
node server.js <port>
источник
c.remoteAddress
как тогда будет::ffff:127.0.0.1
. (Я тестировал на Node v5.9.1)..listen()
сначала используется по умолчанию IPv4, но похоже, что по ошибке или по дизайну это изменилось. Отправка будет по-прежнему функционировать должным образом в более новых версиях узла, когда IPv6 отключен на хост-компьютере.Go, 211 байт
Возможно, дальше можно играть в гольф, я не совсем удовлетворен тем, как мне, например, приходится разбирать IP-адрес, это выглядит как ужасный взлом.
Прослушивает IPv4 на порту, указанном в качестве аргумента.
источник
PowerShell,
208206192152 байтаинформация о версии:
Спасибо TimmyD за то, что сэкономили мне 14 байтов!
Огромное спасибо TessellatingHeckler за спасение мне 40 байт
источник
($t=new-object net.sockets.tcplistener($args[0])).start();for(){($z=$t.acceptsocket()).send(($x=[byte[]][char[]](""+($z.remoteendpoint.address-replace"\.","+"|iex))+32),$x.count,0);$z.close()}
($t=[net.sockets.tcplistener]$args[0]).start();for(){($z=$t.acceptsocket()).send([char[]]"$($z.remoteendpoint.address-replace"\.","+"|iex)");$z.close()}
- что я только быстро протестировал с подключением netcat, но, похоже, работает так же - подключение с localhost в любом случае.Машинный код 8086 (16-битный DOS),
163 156 148 148142 байтаЭквивалентный код сборки:
Это предполагает,
ntcpdrv
что загружен вINT 0x61
(и любой подходящий драйвер пакета в0x60
). Компилировать сfasm tcpserv.asm
.У него есть некоторые проблемы:
источник
xor r,r
вместоmov r,0
.CR LF
, поэтому я просто пошел с этим. В любом случае посчитать размер ассемблера сейчас бессмысленно, с тем же успехом можно немного его очистить и добавить несколько комментариев.int 0x61
возвращает случайный локальный порт вax
. Но это также изменяет прослушивающий IP на какой-то мусорный номер (4.2.0.0
iirc)Haskell, 216 байт
Использование пакета "network-simple" (
cabal install network-simple
). Требуется пара языковых расширений (-XOverloadedStrings -XNoMonomorphismRestriction
) для работы.Есть несколько возможных упрощений, включая изменение
w
функции для непосредственного возврата суммы, а не списка, и использование функции, а не программы, чтобы в качестве аргумента можно было указать номер порта. Я не думаю, что это сильно уменьшит размер. 20 байтов что ли?источник
w
к#
, такw h n
становитсяh#n
для экономии в 2 байта на использование.Свинка
114115 байтGolfed:
Ungolfed:
Это версия Mumps InterSystems Caché - если есть версия, которая может получить адрес TCP короче
##class(%SYSTEM.TCPDevice).PeerAddr()
(так как это почти 1/3 всей программы), у нее может быть больше шансов против некоторых других опубликованных языков. ... ;-)Редактировать: Благодаря @TimmyD - я пропустил чтение порта из STDIN или аргументов вместо того, чтобы быть жестко закодированным. Под редакцией; это добавило 1 байт к программе.
источник
C 535 байтов
Ну, кто-то должен был сделать это.
Я добавил один разрыв строки, чтобы опубликованный код на самом деле содержал 536 символов.
компилировать с
gcc [file_name] -o server
бежать с
./server [port]
соединить с
telnet localhost [port]
источник
Java, 210 байт
Golfed:
Expanded:
Это собрание всех советов, которые я дал в других ответах на Java, плюс написание в виде функции вместо полной программы, которая получает примерно 70 байт по сравнению с программой.
источник
Haskell, 326 байт
К сожалению, мне пришлось использовать,
Network.Socket
чтобы получить доступ к удаленному IP-адресу в виде целого числа, а не строки. Это спасло бы десятки персонажей , если я мог бы просто сделатьs <- listenOn (PortNumber n)
, вместо того , чтобы явно вызыватьsocket
,bind
и вlisten
индивидуальном порядке . Но, к сожалению,Network.accept
выдает мне строку хоста , а не целое число IP-адресов , поэтому мне пришлось прибегнутьNetwork.Socket.accept
и к друзьям.Функция
f
принимает номер порта в качестве аргумента и создает сокет сервера (s
), прослушивающий этот порт. Затем он вызывает функциюg
с сокетом сервера.g
петли навсегда, принимая соединения. Функцияb
берет фактический адрес IPv4 и вычисляет сумму его цифр.Я уверен, что кто-то может сделать это лучше меня. Я хотел показать, насколько чертовски просты сокеты в Haskell ... но потом с треском провалился, потому что мне нужен доступ к IP-адресу, который обычно нелегко получить.
источник
withSocketsDo
это необходимо только в Windows, поэтому при работе в Linux это можно игнорировать; (2) 0xFF - символ длиннее 255; (3) преобразование сокета в дескриптор и использование обычного ввода-вывода намного дольше, чем использованиеNetwork.Socket.send
. Да,send
не рекомендуется, но причина не имеет отношения к этому сценарию (это относится только к тексту или двоичным данным, не относящимся к ASCII), поэтому представляется разумным использовать его.Network.accept gives me a host string, not an IP address integer
Разве вы не можете просто разделить строку IP на"."
,map
функции в Haskell строка-к-номеру над разделенной строки и подвести итоги?Lua,
169162160153151148138129 байтГольф версия
Для этого требуется установить Luasocket и интерпретатор, поддерживающий метки. Я протестировал его с Luajit, и я также могу подтвердить, что код не работает с Lua 5.1.
Неуправляемая версия
Изменить 1:
Изменено
i=({c:getpeername()})[1]
на простоi=c:getpeername()
Изменить 2:
Удалены фигурные скобки из оператора require.
Изменить 3:
Убраны скобки вокруг vararg, немного уменьшено количество байтов.
Изменить 4:
Убрана скобка вокруг "% d +", короче на 2 байта.
Изменить 5:
Убрал ненужную переменную i.
Изменить 6:
Изменен ip с "127.0.0.1" на 0. (Спасибо xyzzy на #lua)
Изменить 7:
Удален вызов функции для tonumber, поскольку строки автоматически приводятся к числам (спасибо Trebuchette за предложение, я этого не знал)
источник
+
оператором, так что вы можете вынутьtonumber
.Хаскелл, 185 (+ 19 = 204)? байтов
Принимает номер порта как одну строку на стандартном вводе; требует
network-simple
от Кабала.Как обычно с ответами на Haskell, которые не ограничиваются чисто функциями, они
imports
занимают слишком много байтов. Конечный перевод строки также стоит 9 байт ...Несколько похоже на ответ @ Jules, но я использую манипуляции со строками вместо байтовых операций. Я
воровалиспользовал-XOverloadedStrings
расширение , а также, что, вероятно , стоит 19 байт дополнительно.источник
C
243188 байт (или, возможно,217162 байт)V2: см. Ниже для объяснения.
188 байт:
Слегка осмотрительный 162 байта:
Возможно, завтра утром возможно еще больше игры в гольф. Я приведу этот пост в порядок после этих обновлений.
V1:
Этот был действительно довольно забавен для гольфа.
Это работает для IPv4. В основном это простая реализация. Три основных компонента
Создание сокета:
Мы используем различные явные формы констант AF_INET и т. Д., И используем тот факт, что когда структура инициализируется в C таким способом, неуказанные элементы устанавливаются в ноль.
Слушайте клиентов, принимайте их и закрывайте их соединения:
Наконец, чтобы отправить каждому клиенту данные:
IP хранится в
C.sin_addr.s_addr
виде 32-разрядного целого числа, где каждый октет представлен одним из четырех байтов. Мы суммируем эти байты с циклом for и затем печатаем их в поток, используя fprintf.У меня есть более короткое 217-байтовое решение, но я не совсем уверен, что оно не нарушает стандартные лазейки, поскольку требует, чтобы порт был задан в одинарном порядке в байтах сети в качестве аргументов командной строки. То есть для запуска сервера через порт 12345 нужно было бы позвонить
где общее число
1
s составляет 14640. По меньшей мере, это немного ... громоздко. Но вот это все равно:источник
Ракетка, 265 байтов
Ungolfed:
источник
Фактор
155146131206190 байтНу, я только что многое узнал о низкоуровневом программировании сокетов. Я не думаю , что когда - нибудь хочу сделать это снова, потому что мой
Четболит голова.Ах да, с резьбой, и не возвращается, верно.
источник
10 base>
вместоstring>number
?10 >base
для числа> строка тоже.