Napisz program lub funkcję, która nasłuchuje przychodzącego ruchu TCP na porcie N. Oferuje prostą usługę: oblicza sumę pól adresu IP połączenia przychodzącego i zwraca.
Program lub funkcja odczytuje liczbę całkowitą N z argumentów lub standardowego wejścia. Nasłuchuje przychodzących połączeń TCP na porcie N. Gdy ktoś łączy się z tym portem, program oblicza sumę pól adresu IP i odsyła go z powrotem do klienta z nową linią i zamyka połączenie.
- Numer portu N jest prawidłowym portem, a 2 10 <N <2 15
- Doczepiany nowej linii może być
\n
albo\r\n
- Możesz użyć IPv4 lub IPv6. Ponieważ adresy IPv6 są zapisywane w formie szesnastkowej, należy również podać wynik w tym samym formacie, na przykład
2001:0db8:0000:0042:0000:8a2e:0370:7334 => 12ecd
.
To jest golf golfowy . Obowiązują standardowe zasady i luki.
Przykład
Uruchamiasz swój serwer za pomocą ./server 1234
. Serwer jest teraz uruchomiony i czeka na połączenia na porcie 1234. Następnie klient z 127.0.0.1
łączy się z serwerem. Serwer wykonuje proste obliczenia: 127+0+0+1 => 128
i wysyła wynik do klienta (ze spływu nowej linii) 128\n
. Następnie serwer zamyka połączenie i czeka na następnego klienta.
Tabela liderów
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>
źródło
Odpowiedzi:
Bash + netcat + ss +…,
6560 znakówNie było to poważne rozwiązanie, byłem tylko ciekawy tej możliwości.
Dzięki:
awk
opartego na filtrowaniu (-5 znaków)Przykładowy przebieg:
(Terminal 1)
(zacisk 2)
Na Ubuntu możesz pobrać
nc
z netcat-traditional (nie, netcat-openbsd nie jest dobry) iss
z iproute2 .źródło
C #,
284283282278274254 bajtówKlasyczny przykład podstawowego serwera C # TCP. Testowanie:
Terminal 1:
Terminal 2:
Firefox:
źródło
int Main
zamiastvoid Main
. Ponieważ program nigdy nie zwraca kompilatora, nie wymagareturn
instrukcji.Start
jest opcjonalny, zapisując inny znak.using
naTcpClient
, który pozwoli ci uratować trzy kolejne postacie (użyj{}
zfor
), i robienie tego samego z tymStreamWriter
powinno uratować jeszcze jedną.Flush
StreamWriter
Linux ELF / x86, 146 bajtów
Zawiera 52-bajtowy nagłówek ELF, 32-bajtowy nagłówek programu, 111 bajtów kodu programu + 3 bajty kodu do przeskakiwania wewnątrz nagłówków.
Informacje na temat sposobu tworzenia plików wykonywalnych ELF malutkie można znaleźć na Breadbox „s « wicher Kurs tworzenia Really teensy ELF wykonywalne dla systemu Linux » .
Linux / i386 korzysta z
socketcall(2)
multipleksowego wywołania systemowego, które przyjmujeebx
określone wywołanie gniazda (SYS_*
makra z/usr/include/linux/net.h
) orazecx
wskaźnik do obszaru argumentów oryginalnego wywołania biblioteki.Niektóre rzeczy zrobione, aby mały rozmiar pliku wykonywalnego:
EDX
wskazuje na funkcję finalizacji (przydatną dla plików wykonywalnych ładowanych przez dynamiczny linker) lub ma wartość NULL).argv[0]
).bind(2)
,listen(2)
iaccept(2)
.phentsize
iphnum
, poprzedzany jest bajt, który zamienia się wCMP
operację, która natychmiast przyjmuje polaphentsize
iphnum
(sztuczka bezwstydnie skradziona z rozwiązania breadbox do 123 w anarchicznym golfie ).LODS
(ładowanie do akumulatora i indeks źródła inkrementacji / dekrementacji) orazSTOS
(zapisywanie z akumulatora i indeksu docelowego inkrementacji / dekrementacji) są dobre dla krótkiego kodu.XCHG EAX, reg
jest 1-bajtowy, w porównaniu doMOV EAX, reg
, który zajmuje 2 bajty.CDQ/CLTD
(znak-przedłużenieEAX
doEDX:EAX
) może być używany jako 1-bajtowy sposób zerowaniaEDX
rejestru.BSWAP
jest przydatny do wdrożeniahtons()
.Źródło Nasm:
źródło
NodeJS,
146134127 bajtówW końcu mogę opublikować odpowiedź NodeJS! Tylko teraz IPv4.
Wykonanie próbki:
node script.js 1024
. Z innego terminala:źródło
'\n'
ciągiem szablonu zawierającym dosłowny znak nowej linii.Tcl, 92
Dość oczywiste:
socket -server s $argv
tworzy gniazdo nasłuchujące na porcie określonym w argumentach.Za każdym razem, gdy pojawia się nowe połączenie,
proc s
jest ono wywoływane z parametrem kanał, adres źródłowy i port źródłowy.string map
zastępuje.
na+
adres źródłowy iexpr
arytmetycznie ocenia się wynik, który jest następnieputs
z powrotem do kanału połączeniowegoc
.vwait
uruchamia pętlę zdarzeń, aby przechwycić przychodzące zdarzenia połączenia.Kredyt dla @DonalFellows za:
Oto wersja, która obsługuje IPv6 (wymaga Tcl 8.6; większość dodatkowej długości wynika z generowania odpowiedzi szesnastkowej):
Tcl, 109
źródło
apply
wydaje się niczego nie oszczędzać. Nie możesz też użyć,tcl::mathop::+ {*}[split $a .]
ponieważ jest to nieco dłużej. Nie możesz też ogolić niczego z nazw opcji. Jednak obsługa IPv6 jest dość trywialna do dodania i kosztuje tylko kilka bajtów kodu więcej (a wtedyregsub
podejście oparte na bazie danych jest równie długie).proc s {c a p}
czy naprawdę potrzebujesz całej tej białej spacji?Groovy
133,125,93, 89Prawdopodobnie tylko IPv4.
Nie golfowany:
Testowanie:
źródło
.toInteger()
→as int
is.inetAddress.address*.toInteger()
→(s.inetAddress.address as int[])
. I po tym jest dodatkowa przestrzeń.with
.Python 3,
170166147 bajtówWłącza port
stdin
, tylko IPv4. Działa na GNU / Linux (i, jak przypuszczam, na większości innych jednorożców), który automatycznie rozwija „” do „0.0.0.0”, choć nie jestem pewien co do systemu Windows.źródło
import *
i, SOCK_STREAM
są niepotrzebne. Również linia wysyłania może być napisana bardziej efektywnie jakoc.send(b"%d\n"%eval(a[0].replace(".","+")))
.s=socket(2)
.int(input())
staje się,input()
a część wysyłająca staje sięc.send(`eval(a[0].replace(".","+"))`)
Java,
371368350344333310295282 bajtówGrał w golfa
Nie golfił
Wynik
źródło
int k=
i zamień k na wszystkie c wInteger.toString(k)
. Aby zapisać kilka bajtów.interface
naclass
powinien zyskać jeszcze kilka bajtówa.getOutputStream().write((c[0] + c[1] + c[2] + c[3]+"\n").getBytes());
zamiastnew DataOutputStream(a.getOutputStream()).writeBytes(c[0] + c[1] + c[2] + c[3] + "\n")
try(Socket a=...){}
krótszy niża.close();
? Wymaga Java 7, ale może zyskać bajty.PowerShell v2 +,
303268257227 bajtówZaoszczędziłem 35 bajtów dzięki Mattowi ... Zaoszczędziłem kolejne 11 bajtów przez aliasing
New-Object
i drobne poprawki ... Zaoszczędziłem 30 bajtów więcej, domyślnie używającany
adresu localhost zamiast adresu IP, i poprawiłem pod kątem ciągłego używania zgodnie z pierwotnym opisem i spóźniłem sięNaprawdę podobny do odpowiedzi w C # , ponieważ to .NET leży u podstaw obu. Zapisujemy tutaj kilka bajtów nad odpowiedzią C #, mogąc wykorzystać zwracaną funkcjonalność programu PowerShell (otaczanie naszej deklaracji / przypisania w parenach, a następnie natychmiast wywoływać metody.), Ale strasznie dużo tracimy przez konieczność sformułowania podsumowania . Fakt, że mamy nieco krótsze nazwy / połączenia klas, jest naprawdę powodem, dla którego ta odpowiedź pokonuje C #.
Wyjaśnienie
Najpierw tworzymy
New-Alias
(znal
aliasem), aby zaoszczędzić na ponownym pisaniuNew-Object
później. Reszta pierwszego wiersza to konfiguracja detektora TCP. Podajemy wiersz poleceń$args[0]
jako dane wejściowe do utworzenia nowegoSystem.Net.Sockets.TcpListener
, zapisanego jako$l
. Ten obiekt jest zamknięty w parenach i natychmiast wywoływany za pomocą,.Start()
aby aktywnie otwierał gniazdo.Wchodząc w nieskończoną
for
pętlę, ustawiamy następnie nasłuchiwanie$l
na blokowanie, za pomocąAcceptTcpClient()
którego będzie czekać na połączenie. Odwołanie do tego połączenia (po jego ustanowieniu) jest przechowywane$c
, enkapsulowane w parens i natychmiast wywoływane,GetStream()
aby uzyskać strumień danych. Ten strumień danych jest przekazywany do nowegoSystem.IO.StreamWriter
konstruktora,$w
abyśmy mogli nim manipulować. Sam konstruktor jest zamknięty w parens i natychmiast wywoływanyWrite(...)
.W ramach
Write(...)
połączenia bierzemy uchwyt klienta$c
i uzyskujemy jegoRemoteEndPoint
własność. Jest to jedyny (jak dotąd znalazłem) sposób uzyskania zdalnego adresu IP. Następnie musimy ponownie rzutować to jako[System.Net.IPEndPoint]
obiekt, aby było poprawnie sformatowane, obudowane w parens i wyciągnąć tylko.Address
właściwość. Mamy wtedy-replace
dosłowne okresy ze znakami plus, a następnie przesuwamy doInvoke-Expression
(podobnie jakeval
), aby uzyskać nasze podsumowanie.Po napisaniu We /
.Dispose()
Wy musimy zadzwonić, aby upewnić się, że strumień danych jest opróżniany do klienta i zamykany. Serwer TCP odrzuca połączenie klienta bez ostrzeżenia, więc w zależności od używanego klienta może w tym momencie zawiesić się na chwilę. Następnie przechodzi przezfor
pętlę bez prawidłowego zamykania połączeń. Oznacza to również, że przecieka pamięć i system zachowuje się jak szalony, ale nie obchodzi nas to, prawda? Może być jednak konieczne użycie Menedżera zadań, aby zabić proces po zakończeniu uruchamiania serwera. :RERównież tylko IPv4, ponieważ barki sumowania spektakularnie próbują obsłużyć adres IPv6, ponieważ
:
nie jest poprawnym operatorem algebraicznymiex
do analizy.źródło
free()
po nich masz ?delete[]
, może? : P.close()
i.dispose()
metod, których tu nie nazywamy, i które sprawiłyby, że ludzie w Code Review mieliby problemy.[Net.ipaddress]::Any
. działa.PHP, 161 (56?)
To jest mój pierwszy post tutaj. Mam nadzieję, że wszystko pójdzie dobrze :)
Nie golfowany:
Terminal:
Działa to tylko w przypadku IPV4
Edycja : Właśnie zauważyłem, że php obsługuje podstawowy serwer:
zdecydowałem trzymać się oryginalnej liczby znaków, chyba że ktoś potwierdzi, czy dozwolone jest śledzenie :)
test2.php: (możliwe rozwiązanie 56-bajtowe)
A następnie rozpocznij obsługę z:
Chrome jako klient
Edycja 2: wget jako klient
źródło
test2.php
? Jeśli tak, myślę, że musiałbyś zapytać PO, czy uznaliby, że tego rodzaju wbudowane rozwiązanie jest akceptowalne w przypadku tego wyzwania. To jednak nie jest luka.Idź ,
359311To mój pierwszy program w Go - pozwolił mi odkryć jedną rzecz: zdecydowanie nie jest to dobry język golfowy!
(Uznanie dla @steve, który grał większość w golfa!)
źródło
"strings"
staje sięs "strings"
tak, że późniejstrings.Split
staje się sprawiedliwys.Split
.import(."pkgname")
wszystkich funkcji, zostaną zaimportowane do bieżącej przestrzeni nazw, możesz następnie usunąć prefiks. na przykład.import ."fmt"; Println("foo")
Jeśli użyjeszSscanf
zfmt
pakietu do parsowania adresu zamiast wyrażenia regularnego, zaoszczędzi ci to kilka kolejnych bajtów, co daje niezłą premięFprintln
za zwracanie sumy zamiast importowaniastrconv
.Common Lisp, 110 bajtów
Detale
źródło
q, 88 bajtów
system raze"p ",1_.z.x
: Bierze drugi argument wiersza poleceń (pierwszy"-"
mówi, żebyq
nie interpretowaćN
jako skrypt / plik) i otwiera port ("p "
).q -p N
ustawia port jakoN
automatycznie, ale ponieważ pytanie wydaje się sugerować, żeN
powinien to być argument dla programu, a nie samego pliku wykonywalnego, poszedłem dalej..z.pg
funkcji, która obsługuje przychodzące żądania,.z.a
przechowuje adres IP jako 32-bitową liczbę całkowitą."i"$0x0 vs
dzieli go na liczby całkowite „składniki” isum
dokonuje sumowania.string
koniec wynik liczbowy i dołącz"\n"
do niego, aby powrócić do klienta..z.ph
to kolejna funkcja dla żądań HTTP GET, z dodatkową obsługą do konwersji ciągu wyjściowego na prawidłową odpowiedź HTTP.Demo - serwer:
Demo - klient (z innej
q
uruchomionej sesji127.0.0.1
):Demo - Klient (od
curl
):źródło
LiveScript,
107105 bajtówNic wielkiego do dodania, to tylko podstawowe rzeczy z NodeJS. Punkty stylu dla
&1
(drugi argument),<|
(F # piping, podobnie jak$
w Haskell) i biop:(+)
w LS jest jak sekcje operatora w Haskell: curry funkcja binarna (która dodaje swoje operandy). Również trochę brudny:/
jeśli otrzyma dosłowny ciąg po prawej stronie, podzieli się.źródło
Perl,
141132 + 1 = 133 bajtyGrał w golfa
Nie golfił
Przykład
źródło
s/\./+/g
→y/./+/
.while(1){…}
→{…;redo}
zgodnie ze wspaniałą wskazówką user130144 . I z wyjątkiem wezwania, wszystkie inne nawiasy są niepotrzebne.->send()
Python 2, 180 bajtów
Przenosi port na standardowe wejście.
źródło
NodeJS (ES6),
129118107 bajtówDziała dla IPv4. Uruchom jako
node server.js <port>
źródło
c.remoteAddress
wtedy byłoby::ffff:127.0.0.1
. (Testowałem na Node v5.9.1)..listen()
najpierw domyślnie ustawiony na IPv4, ale wydaje się, że to błąd lub projekt, że to się zmieniło. Przesyłanie będzie nadal działać poprawnie w nowszych wersjach węzła, gdy protokół IPv6 jest wyłączony na komputerze hosta.Idź, 211 bajtów
Prawdopodobnie można grać w golfa dalej, nie jestem do końca zadowolony ze sposobu, w jaki muszę przeanalizować adres IP, na przykład wygląda to na okropny hack.
Nasłuchuje na IPv4 na porcie podanym jako argument.
źródło
PowerShell,
208206192152 bajtówinformacje o wersji:
Dzięki TimmyD za uratowanie mnie 14 bajtów!
Ogromne podziękowania dla TessellatingHeckler za zaoszczędzenie mi 40 bajtów
źródło
($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()}
- co testowałem tylko szybko z łączeniem z netcat, ale wydaje się, że działa tak samo - łącząc się z localhost.8086 kod maszynowy (16-bit DOS),
163 156 148 148142 bajtówRównoważny kod zespołu:
Zakłada się, że
ntcpdrv
jest ładowany oINT 0x61
(i dowolny odpowiedni sterownik pakietu o0x60
). Kompiluj zfasm tcpserv.asm
.Ma jednak pewne problemy:
źródło
xor r,r
zamiastmov r,0
.CR LF
, więc po prostu poszedłem z tym. Tak czy inaczej, nie ma sensu liczyć teraz rozmiaru asma, równie dobrze można go trochę wyczyścić i dodać kilka komentarzy.int 0x61
zwraca losowy port lokalny wax
. Ale zmienia również nasłuchujący adres IP na jakiś śmieciowy numer (4.2.0.0
iirc)Haskell, 216 bajtów
Korzystanie z pakietu „sieci prostego” (
cabal install network-simple
). Potrzebuje kilku rozszerzeń języka (-XOverloadedStrings -XNoMonomorphismRestriction
) do pracy.Istnieje kilka możliwych uproszczeń, w tym zmiana
w
funkcji, aby zwracać sumę bezpośrednio zamiast listy, oraz używanie funkcji zamiast programu, dzięki czemu można podać numer portu jako argument. Nie sądzę jednak, żeby to znacznie zmniejszyło rozmiar. Może 20 bajtów?źródło
w
do#
, więcw h n
staje sięh#n
dla oszczędności na 2 bajtów na wykorzystanie.Świnka,
114115 bajtówGra w golfa:
Nie golfowany:
To jest wersja Mumps InterSystems Caché - jeśli istnieje wersja, która może uzyskać adres TCP krótszy niż
##class(%SYSTEM.TCPDevice).PeerAddr()
(ponieważ jest to prawie 1/3 całego programu) , może mieć większą szansę na niektóre z już opublikowanych języków ... ;-)Edycja: Dzięki @TimmyD - przegapiłem odczyt portu ze STDIN lub argumentów zamiast zostać zakodowanym na stałe. Edytowane; dodał 1 bajt do programu.
źródło
C, 535 bajtów
Cóż, ktoś musiał to zrobić.
Dodałem podział jednego wiersza, więc opublikowany kod ma w rzeczywistości 536 znaków.
Połącz z
gcc [file_name] -o server
Biegnij z
./server [port]
połączyć się z
telnet localhost [port]
źródło
Java, 210 bajtów
Gra w golfa:
Rozszerzony:
Jest to zbiór wszystkich wskazówek, które podałem w innych odpowiedziach Java, a także pisania jako funkcji zamiast pełnego programu, który zyskuje około 70 bajtów w porównaniu do programu.
źródło
Haskell, 326 bajtów
Niestety musiałem użyć,
Network.Socket
aby uzyskać dostęp do zdalnego adresu IP jako liczby całkowitej zamiast ciągu. Byłoby zapisane dziesiątki znaków, czy mogę po prostu zrobićs <- listenOn (PortNumber n)
, zamiast jawnie wywołaćsocket
,bind
ilisten
indywidualnie. Ale niestetyNetwork.accept
daje mi ciąg hosta , a nie liczbę całkowitą adresu IP , więc musiałem się uciekaćNetwork.Socket.accept
i przyjaciół.Ta funkcja
f
przyjmuje numer portu jako argument i tworzys
nasłuch serwerowy ( ) na tym porcie. Następnie wywołuje funkcjęg
z gniazdem serwera.g
zapętla się na zawsze, akceptując połączenia. Funkcjab
pobiera rzeczywisty adres IPv4 i oblicza sumę swoich cyfr.Jestem pewien, że ktoś może to zrobić lepiej niż ja. Chciałem pochwalić się, jak cholernie łatwe są gniazda w Haskell ... ale potem zawiodłem, ponieważ potrzebuję dostępu do adresu IP, co zwykle nie jest łatwe.
źródło
withSocketsDo
jest to konieczne tylko w systemie Windows, więc jeśli działa w systemie Linux, można je zignorować; (2) 0xFF to znak dłuższy niż 255; (3) konwersja gniazda na uchwyt i używanie zwykłego IO jest znacznie dłuższe niż używanieNetwork.Socket.send
. Tak,send
jest przestarzałe, ale przyczyna nie jest istotna dla tego scenariusza (dotyczy tylko tekstu spoza ASCII lub danych binarnych), więc użycie go wydaje się uzasadnione.Network.accept gives me a host string, not an IP address integer
Nie można po prostu podzielić ciąg IP na"."
,map
funkcja Haskell jest string-to-numeru nad ciągiem Split i podsumować wyniki?Lua
169162160153151148138129 bajtówWersja golfowa
Wymaga zainstalowania Luasocket i interpretera obsługującego etykiety. Przetestowałem to z Luajit i mogę również potwierdzić, że kod nie działa z Lua 5.1.
Wersja bez golfa
Edycja 1:
Zmieniono
i=({c:getpeername()})[1]
na justi=c:getpeername()
Edycja 2:
Usunięto nawiasy klamrowe z instrukcji request.
Edycja 3:
Usunięto nawiasy klamrowe wokół vararg, nieco zmniejszono liczbę bajtów.
Edycja 4:
Usunięto nawias wokół „% d +”, krótszy o 2 bajty.
Edycja 5:
Usunięto niepotrzebną zmienną i.
Edycja 6:
Zmieniono ip z „127.0.0.1” na 0. (Dzięki xyzzy na #lua)
Edycja 7:
Usunięto wywołanie funkcji do liczby tonowej, ponieważ ciągi są automatycznie rzutowane na liczby (dzięki Trebuchette za sugestię, nie wiedziałem o tym)
źródło
+
operatorem, abyś mógł je wyjąćtonumber
.Haskell, 185 (+ 19 = 204)? bajty
Pobiera numer portu jako jedną linię na standardowym wejściu; wymaga
network-simple
od Cabala.Jak zwykle w przypadku odpowiedzi Haskell, które nie ograniczają się do czystych funkcji,
imports
zajmują o wiele za dużo bajtów. Końcowy znak nowej linii jest również wart 9 bajtów ...Nieco podobny do odpowiedzi @ Julesa, ale używam manipulacji ciągiem zamiast operacji bajtowych. I
ukradłużywane-XOverloadedStrings
rozszerzenia, a także, co jest prawdopodobnie wart 19 bajtów extra.źródło
C,
243188 bajtów (lub może217162 bajtów)V2: wyjaśnienia poniżej.
188 bajtów:
Nieco ostrożnie 162 bajty:
Prawdopodobnie jutro rano więcej golfa. Po tych aktualizacjach posprzątam ten post.
V1:
Ten był naprawdę fajny do gry w golfa.
Działa dla IPv4. Przeważnie jest to prosta implementacja. Trzy główne elementy to
Tworzenie gniazda:
Używamy różnych jawnych form stałych AF_INET itp. I wykorzystujemy fakt, że gdy struktura jest inicjowana w C w ten sposób, nieokreślone elementy są ustawiane na zero.
Słuchaj klientów, akceptuj ich i zamykaj ich połączenia:
Wreszcie, aby wysłać każdemu klientowi dane:
Adres IP jest przechowywany
C.sin_addr.s_addr
jako 32-bitowa liczba całkowita, gdzie każdy oktet jest reprezentowany przez jeden z czterech bajtów. Sumujemy te bajty za pomocą pętli for, a następnie drukujemy je do strumienia za pomocą fprintf.Mam krótsze 217 bajtowe rozwiązanie, ale nie jestem do końca pewien, czy nie narusza to standardowych luk, ponieważ wymaga podania portu jako jednoargumentowego w sieciowej kolejności bajtów jako argumentów wiersza poleceń. Oznacza to, że aby uruchomić serwer na porcie 12345, należy zadzwonić
gdzie całkowita liczba
1
s wynosi 14640. Mówiąc co najmniej, jest to trochę ... kłopotliwe. Ale tutaj jest tak:źródło
Rakieta, 265 bajtów
Nie golfowany:
źródło
Współczynnik,
155146131206 206190 bajtówWłaśnie się wiele nauczyłem o programowaniu gniazd niskopoziomowych. I nie sądzę, bym kiedykolwiek chcesz zrobić to jeszcze raz, bo moja
Thrgłowa boli.O tak, nawleczone i nie wraca, prawda.
źródło
10 base>
zamiaststring>number
?10 >base
dla łańcucha> liczba również.