Schreiben Sie ein Programm oder eine Funktion, die auf eingehenden TCP-Verkehr an Port N wartet. Es bietet einen einfachen Dienst: Es berechnet die Summe der IP-Adressfelder der eingehenden Verbindung und kehrt zurück.
Programm oder Funktion liest Integer N aus Argumenten oder stdin. Es lauscht eingehenden TCP-Verbindungen an Port N. Wenn jemand eine Verbindung zu diesem Port herstellt, berechnet das Programm die Summe seiner IP-Adressfelder und sendet sie mit nachfolgendem Zeilenumbruch an den Client zurück und schließt die Verbindung.
- Portnummer N ist ein gültiger Port und 2 10 <N <2 15
- Der abschließende Zeilenumbruch kann entweder
\n
oder sein\r\n
- Sie können entweder IPv4 oder IPv6 verwenden. Da IPv6-Adressen hexadezimal geschrieben sind, müssen Sie beispielsweise auch das Ergebnis in demselben Format angeben
2001:0db8:0000:0042:0000:8a2e:0370:7334 => 12ecd
.
Das ist Code-Golf . Es gelten Standardregeln und Regelungslücken.
Beispiel
Sie betreiben Ihren Server mit ./server 1234
. Der Server wird jetzt ausgeführt und wartet auf Verbindungen an Port 1234. Dann stellt ein Client von eine 127.0.0.1
Verbindung zu Ihrem Server her. Der Server führt eine einfache Rechnung: 127+0+0+1 => 128
und sendet das Ergebnis an den Client (mit Newline nachgestellt): 128\n
. Dann schließt der Server die Verbindung und wartet auf den nächsten Client.
Bestenliste
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>
quelle
Antworten:
Bash + netcat + ss +…,
6560 ZeichenKeine ernsthafte Lösung, war nur neugierig auf diese Möglichkeit.
Dank an:
awk
basierten Filterung (-5 Zeichen)Probelauf:
(Schalter 1)
(Terminal 2)
Auf Ubuntu kann man
nc
von Netcat-Traditional (nein, Netcat-OpenBSD ist nicht gut) undss
von iproute2 bekommen .quelle
C #,
284283282278274254 BytesKlassisches Beispiel eines einfachen C # TCP-Servers. Testen:
Schalter 1:
Terminal 2:
Feuerfuchs:
quelle
int Main
anstelle von verwendenvoid Main
. Da das Programm niemals zurückgibt, benötigt der Compiler keinereturn
Anweisung.Start
ist optional und speichert ein anderes Zeichen.using
auf dasTcpClient
, was Sie drei weitere Zeichen sparen (verwenden Sie die{}
von denfor
), und tut das gleiche mit demStreamWriter
sollte man mehr sparen.Flush
dieStreamWriter
damit es richtig funktioniert.Linux ELF / x86, 146 Bytes
Beinhaltet einen 52-Byte-ELF-Header, einen 32-Byte-Programmheader, 111 Byte Programmcode + 3 Byte Code zum Überspringen in den Headern.
Informationen darüber , wie kleines ELF - Executables erstellen finden Sie unter breadbox ‚s ‚ Ein Whirlwind Tutorial zum Erstellen von Really Teensy ELF ausführbaren Dateien für Linux ‘ .
Linux / i386 verwendet den
socketcall(2)
Multiplex-Systemaufruf, derebx
den spezifischen Socket-Aufruf (dieSYS_*
Makros von/usr/include/linux/net.h
) undecx
einen Zeiger auf den Argumentbereich des ursprünglichen Bibliotheksaufrufs aufnimmt.Einige Maßnahmen, um die ausführbare Datei klein zu halten:
EDX
auf eine Finalisierungsfunktion verwiesen wird (nützlich für ausführbare Dateien, die vom dynamischen Linker geladen werden) oder NULL ist).argv[0]
).bind(2)
,listen(2)
undaccept(2)
.phentsize
undphnum
Felder, ein Byte vorangestellt wird, in eineCMP
Drehoperation , die die Takesphentsize
undphnum
Felder als unmittelbares (Trick aus schamlos gestohlen breadbox-Lösung auf 123 in Anarchie Golf ).LODS
(Laden in den Akkumulator und Inkrementieren / Dekrementieren des Quellindex) undSTOS
(Speichern aus dem Akkumulator und Inkrementieren / Dekrementieren des Zielindex) eignen sich gut für Funktionscode.XCHG EAX, reg
ist 1 Byte im Vergleich zuMOV EAX, reg
2 Byte.CDQ/CLTD
(VorzeichenerweiterungEAX
inEDX:EAX
) kann als 1-Byte-Methode zum Nullsetzen desEDX
Registers verwendet werden.BSWAP
ist nützlich für die Implementierunghtons()
.Nasm-Quelle:
quelle
NodeJS,
146134127 BytesIch kann endlich eine NodeJS-Antwort schreiben! IPv4 nur jetzt.
Beispielausführung:
node script.js 1024
. Von einem anderen Terminal:quelle
'\n'
reduzieren können, indem Sie es mit einem Template-String austauschen, der eine wörtliche Newline enthält.Tcl, 92
Ziemlich selbsterklärend:
socket -server s $argv
Erstellt einen Listening-Socket an dem in den Argumenten angegebenen Port.Bei jedem neuen Verbindungsaufbau wird der
proc s
mit Kanal, Quelladresse und Quellport als Parameter aufgerufen.string map
ersetzt.
für+
die Quelladresse undexpr
wertet arithmetisch das Ergebnis, das dannputs
zurück zu dem Verbindungskanalc
.vwait
führt eine Ereignisschleife aus, um die eingehenden Verbindungsereignisse abzufangen.Gutschrift an @DonalFellows für Folgendes:
Hier ist eine Version, die IPv6 unterstützt (erfordert Tcl 8.6; der größte Teil der zusätzlichen Länge ergibt sich aus der Erzeugung einer Hex-Antwort):
Tcl, 109
quelle
apply
scheint nichts zu retten. Sie können es auch nicht verwenden,tcl::mathop::+ {*}[split $a .]
da es etwas länger ist. Sie können auch nichts von Optionsnamen rasieren. Die Unterstützung von IPv6 ist jedoch ziemlichregsub
einfach hinzuzufügen und kostet nur ein paar Bytes mehr Code (und dann ist ein auf IPv6 basierender Ansatz genauso lang).proc s {c a p}
Brauchen Sie wirklich all das Leerzeichen?Groovy
133,125,93, 89Wahrscheinlich nur IPv4.
Ungolfed:
Testen:
quelle
.toInteger()
→as int
unds.inetAddress.address*.toInteger()
→(s.inetAddress.address as int[])
. Und es gibt einen zusätzlichen Raum danach.with
.Python 3,
170166147 BytesNimmt Port an
stdin
, nur IPv4. Funktioniert unter GNU / Linux (und, wie ich annehme, den meisten anderen Unices), das sich "" automatisch zu "0.0.0.0" erweitert, wobei Windows nicht sicher ist.quelle
import *
und, SOCK_STREAM
unnötig. Auch die Sendeleitung könnte so effizienter geschrieben werdenc.send(b"%d\n"%eval(a[0].replace(".","+")))
.s=socket(2)
.int(input())
wirdinput()
und der Sendeteil wirdc.send(`eval(a[0].replace(".","+"))`)
Java,
371368350344333310295282 BytesGolf gespielt
Ungolfed
Ausgabe
quelle
int k=
und ersetzen Sie die k mit allen Dingen inInteger.toString(k)
. Um ein paar Bytes zu sparen.interface
zuclass
müssen gewinnen paar Bytea.getOutputStream().write((c[0] + c[1] + c[2] + c[3]+"\n").getBytes());
anstelle vonnew DataOutputStream(a.getOutputStream()).writeBytes(c[0] + c[1] + c[2] + c[3] + "\n")
try(Socket a=...){}
kürzer alsa.close();
? Benötigt Java 7, kann aber Bytes gewinnen.PowerShell v2 +,
303268257227 Bytes35 Bytes dank Matt gespeichert ... Weitere 11 Bytes durch Aliasing
New-Object
und kleinere Änderungen gespeichert ... Weitere 30 Bytes durch implizite Verwendung von localhost anstelle derany
IP-Adresse gespeichert und korrigiert, um die ursprünglich angegebene fortgesetzte Verwendung zu berücksichtigen, und ich habe sie verpasstWirklich ähnlich wie die C # -Antwort , da es sich um .NET handelt, das beiden zugrunde liegt. Wir sparen hier ein paar Bytes gegenüber der C # -Antwort, indem wir die Rückgabefunktionalität von PowerShell (um unsere Deklaration / Zuweisung in Parens und den sofortigen Aufruf der. -Methoden) nutzen können . Die Tatsache, dass wir etwas kürzere Klassennamen / -aufrufe haben, ist wirklich der Grund, warum diese Antwort C # schlägt.
Erläuterung
Wir erstellen zuerst ein
New-Alias
(mit demnal
Alias), um zu einemNew-Object
späteren Zeitpunkt die erneute Eingabe zu speichern . Der Rest der ersten Zeile richtet einen TCP-Listener ein. Wir übergeben die Befehlszeile$args[0]
als Eingabe für die Erstellung eines neuenSystem.Net.Sockets.TcpListener
, gespeicherten As$l
. Dieses Objekt wird in Parens eingekapselt und sofort mit aufgerufen.Start()
, damit es den Socket aktiv öffnet.for
Wir treten in eine Endlosschleife ein und setzen unseren Listener$l
auf Blocking, mitAcceptTcpClient()
dem auf eine Verbindung gewartet wird. Ein Verweis auf diese Verbindung (sobald sie hergestellt ist) wird in gespeichert$c
, in Parens gekapselt und sofort aufgerufenGetStream()
, um den Datenstrom abzurufen. Dieser Datenstrom wird an einen neuenSystem.IO.StreamWriter
Konstruktor übergeben$w
, damit wir ihn bearbeiten können. Dieser Konstruktor ist selbst in parens gekapselt und wird sofort aufgerufenWrite(...)
.Innerhalb des
Write(...)
Anrufs übernehmen wir unseren Kundenhandle$c
und erhalten dasRemoteEndPoint
Eigentum des Kunden . Dies ist der einzige Weg (den ich bisher gefunden habe), um die entfernte IP-Adresse zu erhalten. Als nächstes müssen wir das als[System.Net.IPEndPoint]
Objekt umwandeln, damit es korrekt formatiert ist, das in Parens einkapseln und nur die.Address
Eigenschaft ziehen. Wir geben dann-replace
die wörtlichen Punkte mit Pluszeichen ein und leiten sie anInvoke-Expression
(ähnlich wieeval
) weiter, um unsere Summe zu erhalten.Nach dem E / A-Schreibvorgang müssen wir einen Aufruf
.Dispose()
ausführen, um sicherzustellen, dass der Datenstrom an den Client gesendet und geschlossen wird. Der TCP-Server unterbricht die Client-Verbindung ohne Vorwarnung. Abhängig vom verwendeten Client kann es daher zu einem bestimmten Zeitpunkt zu einem Absturz kommen. Anschließend wird diefor
Schleife durchlaufen , ohne die Verbindungen ordnungsgemäß zu schließen. Dies bedeutet auch, dass es Speicher und Systemhandles wie verrückt verliert, aber das interessiert uns nicht, oder? Möglicherweise müssen Sie den Task-Manager verwenden, um den Prozess abzubrechen, nachdem Sie den Server ausgeführt haben. : DAuch nur IPv4, da die Summierungsleiste spektakulär versucht, eine IPv6-Adresse zu verarbeiten, da dies
:
kein gültiger algebraischer Operatoriex
zum Parsen ist.quelle
free()
sie danach?delete[]
, vielleicht? : P.close()
und.dispose()
Methoden wir hier nicht nennen , dass die Menschen auf Code Review verursachen würde einen Sitz haben.[Net.ipaddress]::Any
funktioniert.PHP 161 (56?)
Dies ist mein erster Beitrag hier. Ich hoffe das geht richtig :)
Ungolfed:
Terminal:
Dies funktioniert nur bei IPV4
Bearbeiten : Ich habe gerade bemerkt, dass PHP Basic Server unterstützt:
Ich habe beschlossen, mich an die ursprüngliche Zeichenanzahl zu halten, es sei denn, jemand bestätigt, ob Folgendes zulässig ist :)
test2.php: (mögliche 56-Byte-Lösung)
Und starten Sie den Service mit:
Chrome als Client
Edit 2: wget als Client
quelle
test2.php
? Wenn ja, müssten Sie das OP fragen, ob diese Art von integriertem System für diese Herausforderung akzeptabel ist. Es ist jedoch keine Lücke.Los ,
359311Dies ist mein erstes Programm in Go - es erlaubt mir eines zu entdecken: Dies ist definitiv keine gute Golfsprache!
(Ein großes Lob an @ Steve, der den größten Teil des Golfspiels gemacht hat!)
quelle
"strings"
wirds "strings"
so, dass der späterestrings.Split
gerecht wirds.Split
.import(."pkgname")
alle Funktionen verwenden, die in den aktuellen Namespace importiert werden, können Sie das Präfix löschen. z.B.import ."fmt"; Println("foo")
Wenn SieSscanf
aus demfmt
Paket die Adresse anstelle von regulären Ausdrücken analysieren, sparen Sie einige weitere Bytes, was Ihnen den netten Vorteil gibt, dass SieFprintln
die Gesamtsumme zurückgeben müssen, anstatt sie zu importierenstrconv
.Common Lisp, 110 Bytes
Einzelheiten
quelle
q 88 Bytes
system raze"p ",1_.z.x
: Nimmt das zweite Befehlszeilenargument (das erste"-"
sollq
nichtN
als Skript / Datei interpretieren ) und öffnet damit einen port ("p "
).q -p N
der Port alsN
automatisch festgelegt. Da die Frage jedoch darauf hinzudeuten scheint, dass diesN
eher ein Argument für das Programm als für die ausführbare Datei selbst sein sollte, bin ich den längeren Weg gegangen..z.pg
Funktion, die eingehende Anforderungen verarbeitet,.z.a
die IP-Adresse als 32-Bit-Ganzzahl."i"$0x0 vs
teilt es in seine ganzzahligen 'Bestandteile' auf undsum
führt die Summierung durch.string
das numerische Ergebnis und hängen Sie"\n"
es an, um zum Client zurückzukehren..z.ph
ist eine weitere Funktion für HTTP-GET-Anforderungen mit zusätzlicher Behandlung zum Konvertieren der Zeichenfolgenausgabe in eine gültige HTTP-Antwort.Demo - Server:
Demo - Client (von einer anderen
q
Sitzung aus127.0.0.1
):Demo - Kunde (von
curl
):quelle
LiveScript,
107105 BytesEs gibt nicht viel hinzuzufügen, es ist nur grundlegendes NodeJS-Zeug. Stilpunkte für
&1
(zweites Argument),<|
(F #$
-Piping , ähnlich wie in Haskell) und biop:(+)
In LS sind sie wie Operatorabschnitte in Haskell: eine binäre Curry-Funktion (die ihre Operanden hinzufügt). Auch ein bisschen schmutzig:/
Wenn rechts davon eine wörtliche Zeichenfolge angegeben wird, wird sie geteilt.quelle
Perl,
141132 + 1 = 133 BytesGolf gespielt
Ungolfed
Beispiel
quelle
s/\./+/g
→ änderny/./+/
.while(1){…}
→{…;redo}
nach user130144 ‚s großer Spitze . Mit Ausnahme des->send()
Aufrufs sind keine weiteren Klammern erforderlich.Python 2, 180 Bytes
Übernimmt den Hafen über stdin.
quelle
NodeJS (ES6),
129118107 BytesFunktioniert für IPv4. Rennen wie
node server.js <port>
quelle
c.remoteAddress
dies dann der Fall wäre::ffff:127.0.0.1
. (Ich habe auf Node v5.9.1 getestet)..listen()
Wird standardmäßig zuerst für IPv4 verwendet, aber es scheint, dass sich dies entweder aufgrund eines Fehlers oder aufgrund des Designs geändert hat. Die Übermittlung funktioniert auf neueren Knotenversionen weiterhin ordnungsgemäß, wenn IPv6 auf dem Hostcomputer deaktiviert ist.Go, 211 Bytes
Kann wahrscheinlich weiter golfen werden, ich bin nicht ganz zufrieden mit der Art und Weise, wie ich die IP-Adresse zum Beispiel analysieren muss, es sieht aus wie ein schrecklicher Hack.
Lauscht IPv4 auf dem als Argument angegebenen Port.
quelle
PowerShell,
208206192152 ByteVersionsinformation:
Vielen Dank an TimmyD für die Rettung von 14 Bytes!
Ein großes Dankeschön an TessellatingHeckler, der mir 40 Bytes gespart hat
quelle
($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()}
- was ich erst schnell mit netcat verbindung getestet habe, aber es scheint genauso zu funktionieren - trotzdem verbindung von localhost.8086-Maschinencode (16-Bit-DOS),
163 156 148 148142 BytesÄquivalenter Montagecode:
Dies setzt voraus
ntcpdrv
, dass beiINT 0x61
(und einem geeigneten Pakettreiber bei0x60
) geladen wird . Kompilieren mitfasm tcpserv.asm
.Es gibt jedoch einige Probleme:
quelle
xor r,r
anstelle vonmov r,0
.CR LF
, also habe ich mich einfach daran gemacht. So oder so ist es irgendwie sinnlos, die ASM-Größe jetzt zu zählen, sie ein wenig aufzuräumen und einige Kommentare hinzuzufügen.int 0x61
Gibt einen zufälligen lokalen Port in zurückax
. Aber es ändert sich auch die Abhör-IP auf eine4.2.0.0
Müllnummer ( iirc)Haskell, 216 Bytes
Verwenden Sie das Paket "network-simple" (
cabal install network-simple
). Benötigt ein paar Spracherweiterungen (-XOverloadedStrings -XNoMonomorphismRestriction
), um zu funktionieren.Es gibt einige mögliche Vereinfachungen, einschließlich der Änderung der
w
Funktion, um die Summe direkt anstelle einer Liste zurückzugeben, und der Verwendung einer Funktion anstelle eines Programms, damit die Portnummer als Argument angegeben werden kann. Ich kann mir allerdings nicht vorstellen, dass dies die Größe stark reduzieren würde. 20 Bytes vielleicht?quelle
w
in noch ein paar Bytes sparen können#
, wasw h n
zuh#n
einer Einsparung von 2 Bytes pro Nutzung führt.Mumps,
114115 BytesGolf gespielt:
Ungolfed:
Dies ist die InterSystems Caché-Version von Mumps - wenn es eine Version gibt, die die TCP-Adresse kürzer als
##class(%SYSTEM.TCPDevice).PeerAddr()
(da es fast ein Drittel des gesamten Programms ist) erwerben kann, hat sie möglicherweise eine bessere Chance gegenüber einigen anderen bereits veröffentlichten Sprachen ... ;-)Edit: Danke an @TimmyD - Ich habe das Lesen des Ports von STDIN oder Argumenten verpasst, anstatt hartcodiert zu werden. Bearbeitet; es fügte dem Programm 1 Byte hinzu.
quelle
C 535 Bytes
Nun, jemand musste das tun.
Ich habe einen einzelnen Zeilenumbruch hinzugefügt, damit der bereitgestellte Code tatsächlich 536 Zeichen enthält.
kompilieren mit
gcc [file_name] -o server
renn mit
./server [port]
verbinden mit
telnet localhost [port]
quelle
Java, 210 Bytes
Golf gespielt:
Erweitert:
Dies ist eine Zusammenstellung aller Tipps, die ich in anderen Java-Antworten gegeben habe, plus das Schreiben als Funktion anstelle eines vollständigen Programms, das im Vergleich zum Programm ungefähr 70 Byte an Umfang gewinnt.
quelle
Haskell, 326 Bytes
Leider musste ich verwenden
Network.Socket
, um auf die entfernte IP-Adresse als Ganzzahl anstatt als Zeichenfolge zuzugreifen. Es hätte Dutzende von Charakteren gerettet, wenn ich es nur getan hättes <- listenOn (PortNumber n)
, anstatt explizit und individuell anrufen zusocket
müssen . Aber leider gibt mir eine Host- Zeichenfolge , keine Ganzzahl für die IP-Adresse , sodass ich auf und Freunde zurückgreifen musste .bind
listen
Network.accept
Network.Socket.accept
Die Funktion verwendet
f
eine Portnummer als Argument und erstellt einen Server-Socket (s
), der diesen Port überwacht. Anschließend ruft es die Funktiong
mit dem Server-Socket auf.g
Schleifen für immer, Verbindungen annehmen. Die Funktion verwendetb
eine tatsächliche IPv4-Adresse und berechnet die Summe ihrer Ziffern.Ich bin mir sicher, dass irgendjemand das besser kann als ich. Ich wollte zeigen, wie verdammt einfach Socket Zeug in Haskell ist ... aber dann kläglich gescheitert, weil ich Zugriff auf die IP-Adresse, die in der Regel nicht einfach zu bekommen ist.
quelle
withSocketsDo
nur unter Windows erforderlich ist. Wenn Sie also unter Linux laufen, kann es ignoriert werden. (2) 0xFF ist ein längeres Zeichen als 255; (3) Das Konvertieren des Sockets in ein Handle und die Verwendung von normaler E / A ist viel länger als die VerwendungNetwork.Socket.send
. Ja,send
ist veraltet, aber der Grund ist für dieses Szenario nicht relevant (er bezieht sich nur auf Nicht-ASCII-Text oder Binärdaten), daher erscheint es sinnvoll, ihn zu verwenden.Network.accept gives me a host string, not an IP address integer
Können nicht spalten Sie den IP - String nur auf das"."
,map
die Ergebnisse Haskells String-to-number - Funktion über den Split - String und zusammenzufassen?Lua,
169162160153151148138129 BytesGolf Version
Dazu muss Luasocket installiert sein und ein Interpreter, der Labels unterstützt. Ich habe es mit Luajit getestet und kann auch bestätigen, dass der Code mit Lua 5.1 nicht funktioniert.
Ungolfed-Version
Bearbeiten 1:
Geändert
i=({c:getpeername()})[1]
zu nuri=c:getpeername()
Bearbeiten 2:
Klammern aus der require-Anweisung entfernt.
Edit 3:
Entfernte die geschweiften Klammern um den Vararg und verringerte die Byteanzahl ein wenig.
Bearbeiten 4:
Die Klammer um "% d +", kürzer um 2 Bytes, wurde entfernt.
Edit 5:
Die unnötige Variable i wurde entfernt.
Bearbeiten 6:
Änderte die IP von "127.0.0.1" auf 0. (Danke an xyzzy auf #lua)
Bearbeiten 7:
Der Funktionsaufruf für tonumber wurde entfernt, da Zeichenfolgen automatisch in Zahlen umgewandelt werden. (Vielen Dank an Trebuchette für den Vorschlag, das wusste ich nicht.)
quelle
+
Operator automatisch Zeichenfolgen in Zahlen um , sodass Sie sie entfernen könnentonumber
.Haskell, 185 (+ 19 = 204)? Bytes
Nimmt die Portnummer als eine Zeile auf stdin; benötigt
network-simple
von Cabal.Wie bei Haskell-Antworten üblich, die sich nicht auf reine Funktionen beschränken,
imports
belegen sie viel zu viele Bytes. Die abschließende Newline ist ebenfalls 9 Bytes wert ...Etwas ähnlich der Antwort von @ Jules, aber ich verwende eine Zeichenkettenmanipulation anstelle von Byteoperationen. Ich
habeauch die-XOverloadedStrings
Erweiterung benutzt, die wahrscheinlich 19 Bytes mehr wert ist.quelle
C,
243188 Bytes (oder vielleicht217162 Bytes)V2: Erläuterungen siehe unten.
188 Bytes:
162 Bytes leicht überschauen:
Möglicherweise ist morgen früh mehr Golf möglich. Ich werde diesen Beitrag nach diesen Updates aufräumen.
V1:
Dieser hat wirklich Spaß gemacht, Golf zu spielen.
Es funktioniert für IPv4. Meist ist es eine einfache Implementierung. Die drei Hauptkomponenten sind
Socket erstellen:
Wir verwenden die verschiedenen expliziten Formen der Konstanten AF_INET usw. und machen uns die Tatsache zunutze, dass bei einer solchen Initialisierung einer Struktur in C die nicht spezifizierten Elemente auf Null gesetzt werden.
Hören Sie auf Kunden, akzeptieren Sie sie und schließen Sie ihre Verbindungen:
Zum Schluss senden Sie jedem Kunden die Daten:
Die IP wird
C.sin_addr.s_addr
als 32-Bit-Ganzzahl gespeichert, wobei jedes Oktett durch eines der vier Bytes dargestellt wird. Wir addieren diese Bytes mit der for-Schleife und drucken sie dann mit fprintf in den Stream.Ich habe eine kürzere 217-Byte-Lösung, bin mir aber nicht ganz sicher, ob sie nicht gegen die Standard-Regelungslücken verstößt, da der Port in der Reihenfolge der Netzwerkbytes als Befehlszeilenargumente unär angegeben werden muss. Das heißt, um den Server auf Port 12345 auszuführen, müsste man anrufen
wo die Gesamtzahl von
1
s 14640 ist. Um es gelinde auszudrücken, ist es ein wenig ... umständlich. Aber hier ist es trotzdem:quelle
Schläger, 265 Bytes
Ungolfed:
quelle
Faktor
155146131206190 BytesNun, ich habe gerade viel über Low-Level-Socket-Programmierung gelernt. Ich glaube nicht , dass ich jemals tun wollen , dass wieder, weil mein
thrKopf tut weh.Oh ja, Threaded, und kommt nicht zurück, richtig.
quelle
10 base>
anstelle von verwendenstring>number
?10 >base
für number> string auch.