Escriba un programa o función que escuche el tráfico TCP entrante en el puerto N. Ofrece un servicio simple: calcula la suma de los campos de dirección IP de la conexión entrante y los retornos.
El programa o la función lee el entero N de argumentos o stdin. Escucha las conexiones TCP entrantes en el puerto N. Cuando alguien se conecta a ese puerto, el programa calcula la suma de sus campos de dirección IP y lo envía de vuelta al cliente con la nueva línea final y cierra la conexión.
- El número de puerto N es un puerto válido y 2 10 <N <2 15
- La nueva línea final puede ser
\n
o\r\n
- Puede usar IPv4 o IPv6. Dado que las direcciones IPv6 están escritas en forma hexadecimal, también debe proporcionar el resultado en el mismo formato, por ejemplo
2001:0db8:0000:0042:0000:8a2e:0370:7334 => 12ecd
.
Este es el código de golf . Se aplican reglas estándar y lagunas.
Ejemplo
Ejecutas tu servidor con ./server 1234
. El servidor ahora se está ejecutando y esperando conexiones en el puerto 1234. Luego, un cliente de se 127.0.0.1
conecta a su servidor. El servidor realiza un cálculo simple: 127+0+0+1 => 128
y envía el resultado al cliente (con arrastrarse nueva línea): 128\n
. Luego el servidor cierra la conexión y espera al próximo cliente.
Tabla de clasificación
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>
fuente
Respuestas:
Bash + netcat + ss + ...,
6560 caracteresNo es una solución seria, solo sentía curiosidad por esta posibilidad.
Gracias a:
awk
filtrado basado (-5 caracteres)Ejecución de muestra:
(terminal 1)
(terminal 2)
En Ubuntu puede obtener
nc
de netcat-traditional (no, netcat-openbsd no es bueno) yss
de iproute2 .fuente
C #,
284283282278274254 bytesEjemplo clásico de un servidor básico C # TCP. Pruebas:
Terminal 1:
Terminal 2:
Firefox
fuente
int Main
lugar devoid Main
. Como el programa nunca regresa, el compilador no requiere unareturn
declaración.Start
es opcional, guardando otro carácter.using
en elTcpClient
, que le ahorrará tres caracteres más (use el{}
defor
), y hacer lo mismo con elStreamWriter
debería guardar uno más.Flush
elStreamWriter
de hacer que funcione correctamente.Linux ELF / x86, 146 bytes
Incluye un encabezado ELF de 52 bytes, un encabezado de programa de 32 bytes, 111 bytes de código de programa + 3 bytes de código para saltar dentro de los encabezados.
Puede encontrar información sobre cómo crear pequeños ejecutables ELF en el " A Whirlwind Tutorial de breadbox " sobre cómo crear ejecutables ELF realmente para Teensy para Linux " .
Linux / i386 usa la
socketcall(2)
llamada al sistema multiplex, que tomaebx
la llamada de socket específica (lasSYS_*
macros de/usr/include/linux/net.h
), y enecx
un puntero al área de argumento de la llamada a la biblioteca original.Algunas cosas hechas para mantener el ejecutable pequeño:
EDX
puntos de entrada a una función de finalización (útil para ejecutables cargados por el enlazador dinámico) o sea NULL).argv[0]
).bind(2)
,listen(2)
yaccept(2)
.phentsize
yphnum
, se antepone un byte, que se convierte en unaCMP
operación que toma los camposphentsize
yphnum
como un inmediato (truco robado descaradamente de la solución de breadbox a 123 en anarchy golf ).LODS
(carga en el acumulador y el índice de origen de incremento / decremento) ySTOS
(almacenar desde el acumulador y el índice de destino de incremento / decremento) son buenas para el código corto.XCHG EAX, reg
es de 1 byte, en comparación conMOV EAX, reg
, que toma 2 bytes.CDQ/CLTD
(sign-extendEAX
intoEDX:EAX
) puede usarse como una forma de 1 byte para poner a cero elEDX
registro.BSWAP
es útil para la aplicaciónhtons()
.Fuente Nasm:
fuente
Nodejs,
146134127 bytes¡Finalmente puedo publicar una respuesta de NodeJS! IPv4 solo en este momento.
Ejecución de la muestra:
node script.js 1024
. Desde otra terminal:fuente
'\n'
con una cadena de plantilla que contiene una nueva línea literal.Tcl, 92
Bastante autoexplicativo:
socket -server s $argv
crea un socket de escucha en el puerto especificado en los argumentos.Cada vez que llega una nueva conexión,
proc s
se llama al, con el canal, la dirección de origen y el puerto de origen como parámetros.string map
sustituye.
a+
en la dirección de origen yexpr
evalúa aritméticamente el resultado, que luegoputs
vuelve al canal de conexiónc
.vwait
ejecuta un bucle de eventos para capturar los eventos de conexión entrantes.Crédito a @DonalFellows por lo siguiente:
Aquí hay una versión que maneja IPv6 (requiere Tcl 8.6; la mayor parte de la longitud adicional se debe a que produce una respuesta hexadecimal):
Tcl, 109
fuente
apply
no parece guardar nada. Tampoco puedes usarlo,tcl::mathop::+ {*}[split $a .]
ya que es un poco más largo. Tampoco puedes afeitar nada de los nombres de las opciones. Pero admitir IPv6 es bastante trivial de agregar, y solo cuesta unos pocos bytes de código más (y luego unregsub
enfoque basado en el mismo es igual de largo).proc s {c a p}
¿realmente necesitas todo ese espacio en blanco?Groovy
133,125,93, 89Solo IPv4, probablemente.
Sin golf:
Pruebas:
fuente
.toInteger()
→as int
ys.inetAddress.address*.toInteger()
→(s.inetAddress.address as int[])
. Y hay un espacio extra después.with
.Python 3,
170166147 bytesToma puerto
stdin
, solo IPv4. Funciona en GNU / Linux (y, supongo, la mayoría de los otros unices), que se expande automáticamente "" a "0.0.0.0", aunque no estoy seguro acerca de Windows.fuente
import *
y, SOCK_STREAM
son innecesarios. Además, la línea de envío podría escribirse de manera más eficiente comoc.send(b"%d\n"%eval(a[0].replace(".","+")))
.s=socket(2)
.int(input())
convierteinput()
y la parte de envío se conviertec.send(`eval(a[0].replace(".","+"))`)
Java,
371368350344333310295282 bytesGolfed
Sin golf
Salida
fuente
int k=
y reemplace el k con todas las cosas c enInteger.toString(k)
. Para guardar unos pocos bytes.interface
aclass
debería ganar algunos bytes mása.getOutputStream().write((c[0] + c[1] + c[2] + c[3]+"\n").getBytes());
lugar denew DataOutputStream(a.getOutputStream()).writeBytes(c[0] + c[1] + c[2] + c[3] + "\n")
try(Socket a=...){}
más corto quea.close();
? Requiere Java 7, pero puede ganar bytes.PowerShell v2 +,
303268257227 bytesAhorré 35 bytes gracias a Matt ... Ahorré otros 11 bytes aliasing
New-Object
y pequeños ajustes ... Ahorré 30 bytes más al usar implícitamente localhost en lugar deany
la dirección IP y corregí para tener en cuenta el uso continuo como se especificó originalmente y me perdíRealmente similar a la respuesta de C # , ya que es .NET subyacente a ambos. Ahorramos unos pocos bytes aquí sobre la respuesta de C # al poder aprovechar la funcionalidad de retorno de PowerShell (que rodea nuestra declaración / asignación en parens, y luego llamar inmediatamente a los métodos.), Pero perdemos mucho al necesitar formular el resumen. . El hecho de que tengamos nombres / llamadas de clase un poco más cortos es realmente por qué esta respuesta está superando a C #.
Explicación
Primero creamos un
New-Alias
(con elnal
alias) para ahorrar en volver a escribirNew-Object
más tarde. El resto de la primera línea está configurando un escucha TCP. Pasamos la línea de comandos$args[0]
como entrada para crear un nuevoSystem.Net.Sockets.TcpListener
, almacenado como$l
. Ese objeto se encapsula en parens y se llama inmediatamente.Start()
para que abra activamente el socket.Al ingresar a un
for
bucle infinito , configuramos nuestro oyente$l
para que bloquee conAcceptTcpClient()
lo que esperará una conexión. Una referencia a esa conexión (una vez que se realiza) se almacena$c
, se encapsula en parens e inmediatamente se llamaGetStream()
para obtener el flujo de datos. Ese flujo de datos se pasa a un nuevoSystem.IO.StreamWriter
constructor$w
, para que podamos manipularlo. Ese constructor se encapsula en parens y se llama de inmediatoWrite(...)
.Dentro de la
Write(...)
llamada, tomamos el identificador de nuestro cliente$c
y obtenemosRemoteEndPoint
propiedad . Esta es la única forma (que he encontrado hasta ahora) de obtener la dirección IP remota. A continuación, debemos volver a emitir eso como un[System.Net.IPEndPoint]
objeto para que esté formateado correctamente, encapsularlo en parens y extraer solo la.Address
propiedad. Luego,-replace
los períodos literales con signos más, luego lo canalizamos aInvoke-Expression
(similar aeval
) para obtener nuestra suma.Después de la escritura de IO, debemos llamar
.Dispose()
para asegurarnos de que el flujo de datos se vacíe al cliente y se cierre. El servidor TCP desconecta la conexión del cliente sin previo aviso, por lo que dependiendo del cliente utilizado, puede colgarse por un momento en este punto. Luego continúa a través delfor
bucle sin cerrar correctamente las conexiones. Esto también significa que pierde memoria y el sistema se maneja como loco, pero eso no nos importa, ¿verdad? Sin embargo, es posible que deba usar el Administrador de tareas para finalizar el proceso cuando haya terminado de ejecutar el servidor. :RETambién solo IPv4, ya que la sumatoria barfs intenta espectacularmente manejar una dirección IPv6, ya
:
que no es un operador algebraico válido paraiex
analizar.fuente
free()
después?delete[]
, ¿tal vez? : P.close()
y.dispose()
métodos que no estamos pidiendo aquí que haría que la gente en la revisión de código para tener un ajuste.[Net.ipaddress]::Any
funciona.PHP, 161 (56?)
Esta es mi primera publicación aquí. Espero que esto salga bien :)
Sin golf:
Terminal:
Esto solo funciona para IPV4
Editar : Acabo de notar que php es compatible con el servidor básico:
decidí mantener el recuento de caracteres original a menos que alguien confirme si se permite lo siguiente :)
test2.php: (posible solución de 56 bytes)
Y luego comience el servicio con:
Chrome como cliente
Edición 2: wget como cliente
fuente
test2.php
? Si es así, creo que tendría que preguntarle al OP si considerarían que ese tipo de incorporado es aceptable para este desafío. Sin embargo, no es una escapatoria.ir ,
359311Este es mi primer programa en Go. Me permitió descubrir una cosa: ¡este definitivamente no es un buen lenguaje de golf!
(¡Felicitaciones a @steve que hizo la mayor parte del golf!)
fuente
"strings"
convierte ens "strings"
lo que más tarde sestrings.Split
vuelve justos.Split
.import(."pkgname")
todas las funciones, se importarán al espacio de nombres actual, entonces puede soltar el prefijo. p.ej.import ."fmt"; Println("foo")
Si usaSscanf
elfmt
paquete para analizar la dirección en lugar de regex, le ahorrará otros pocos bytes, lo que le dará la ventaja adicional de tenerFprintln
que devolver el total en lugar de importarstrconv
.Lisp común, 110 bytes
Detalles
fuente
q, 88 bytes
system raze"p ",1_.z.x
: Toma el segundo argumento de línea de comandos (el primero"-"
es para decirle queq
no interpreteN
como un script / archivo) y abre un puerto ("p "
) con él.q -p N
configuran el puerto de formaN
automática, pero como la pregunta parece sugerir queN
debería ser un argumento para el programa en lugar del ejecutable en sí, he tomado el camino más largo..z.pg
función que maneja las solicitudes entrantes,.z.a
contiene la dirección IP como un entero de 32 bits."i"$0x0 vs
lo divide en sus 'constituyentes' enteros ysum
realiza la suma.string
el resultado numérico y anexar"\n"
para volver al cliente..z.ph
es otra función para las solicitudes HTTP GET, con manejo adicional para convertir la salida de cadena en una respuesta HTTP válida.Demostración - Servidor:
Demostración - Cliente (de otra
q
sesión que se ejecuta en127.0.0.1
):Demostración - Cliente (desde
curl
):fuente
LiveScript,
107105 bytesNo hay mucho que agregar, solo son cosas básicas de NodeJS. Los puntos de estilo para
&1
(segundo argumento),<|
(tubería F #, similar a$
en Haskell) y biop:(+)
en LS es como secciones de operador en Haskell: una función binaria al curry (que agrega sus operandos). También un poco sucio:/
si se le da una cadena literal a su derecha, se dividirá.fuente
Perl
141132 + 1 = 133 bytesGolfed
Sin golf
Ejemplo
fuente
s/\./+/g
→y/./+/
.while(1){…}
→{…;redo}
según el gran consejo del usuario 130144 . Y exceptuando el->send()
llamada, todos los demás paréntesis son innecesarios.Python 2, 180 bytes
Toma el puerto sobre stdin.
fuente
NodoJS (ES6),
129118107 bytesFunciona para IPv4. Correr como
node server.js <port>
fuente
c.remoteAddress
que entonces lo sería::ffff:127.0.0.1
. (Probé en el Nodo v5.9.1)..listen()
solía ser el valor predeterminado de IPv4 primero, pero parece que, por error o diseño, esto ha cambiado. El envío seguirá funcionando correctamente en las versiones más nuevas del nodo cuando IPv6 esté desactivado en la máquina host.Go, 211 bytes
Probablemente se pueda jugar más, no estoy completamente satisfecho con la forma en que tengo que analizar la dirección IP, por ejemplo, parece un truco horrible.
Escucha IPv4 en el puerto dado como argumento.
fuente
PowerShell,
208206192152 bytesinformación de versión:
¡Gracias a TimmyD por salvarme 14 bytes!
Muchas gracias a TessellatingHeckler por salvarme 40 bytes
fuente
($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()}
, lo que solo he probado rápidamente con la conexión netcat, pero parece funcionar de la misma manera, conectarse desde localhost de todos modos.Código de máquina 8086 (DOS de 16 bits),
163156148148142bytesCódigo de ensamblaje equivalente:
Esto supone que
ntcpdrv
se carga enINT 0x61
(y cualquier controlador de paquete adecuado en0x60
). Compilar confasm tcpserv.asm
.Sin embargo, tiene algunos problemas:
fuente
xor r,r
lugar demov r,0
.CR LF
, así que simplemente fui con eso. De cualquier manera, no tiene sentido contar el tamaño de asm ahora, también podría limpiarlo un poco y agregar algunos comentarios.int 0x61
devuelve un puerto local aleatorio enax
. Pero también cambia la IP de escucha a algún número de basura (4.2.0.0
iirc)Haskell, 216 bytes
Usando el paquete "network-simple" (
cabal install network-simple
). Necesita un par de extensiones de lenguaje (-XOverloadedStrings -XNoMonomorphismRestriction
) para funcionar.Hay un par de posibles simplificaciones, que incluyen cambiar la
w
función para devolver la suma directamente en lugar de una lista, y usar una función en lugar de un programa para que el número de puerto se pueda especificar como argumento. Sin embargo, no imagino que esto reduciría mucho el tamaño. ¿20 bytes tal vez?fuente
w
a#
, así quew h n
seh#n
ahorra 2 bytes por uso.Paperas,
114115 BytesGolfizado:
Sin golf:
Esta es la versión de InterSystems Caché de Mumps, si hay una versión que puede adquirir la dirección TCP más corta que
##class(%SYSTEM.TCPDevice).PeerAddr()
(ya que es casi un 1/3 del programa completo) , podría tener una mejor oportunidad contra algunos de los otros idiomas publicados ya ... ;-)Editar: Gracias a @TimmyD: me perdí la lectura del puerto de STDIN o los argumentos en lugar de estar codificado. Editado; agregó 1 byte al programa.
fuente
C, 535 bytes
Bueno, alguien tuvo que hacer esto.
Agregué un solo salto de línea para que el código publicado tenga 536 caracteres.
compilar con
gcc [file_name] -o server
corre con
./server [port]
conectar con
telnet localhost [port]
fuente
Java, 210 bytes
Golfizado:
Expandido:
Esta es una reunión de todos los consejos que di en otras respuestas de Java, más la escritura como una función en lugar de un programa completo, que gana aproximadamente 70 bytes en comparación con el programa.
fuente
Haskell, 326 bytes
Lamentablemente, tuve que usar
Network.Socket
para obtener acceso a la dirección IP remota como un entero en lugar de una cadena. Hubiera salvado docenas de caracteres si pudiera hacerlos <- listenOn (PortNumber n)
, en lugar de tener que llamar explícitamentesocket
,bind
elisten
individualmente. Pero, lamentablemente,Network.accept
me da una cadena de host , no un entero de dirección IP , así que tuve que recurrir aNetwork.Socket.accept
amigos.La función
f
toma un número de puerto como argumento y crea un socket de servidor (s
) que escucha en ese puerto. Luego llama a la funcióng
con el socket del servidor.g
bucles para siempre, aceptando conexiones. La funciónb
toma una dirección IPv4 real y calcula la suma de sus dígitos.Estoy seguro de que alguien en algún lugar puede hacerlo mejor que yo. Quería mostrar cuán malditas son las cosas de socket fáciles en Haskell ... pero luego fallé miserablemente, porque necesito acceso a la dirección IP, que generalmente no es fácil de obtener.
fuente
withSocketsDo
solo es necesario en Windows, por lo que si se ejecuta en Linux puede ignorarse; (2) 0xFF es un personaje más largo que 255; (3) convertir el zócalo en un mango y usar IO regular es mucho más largo que usarloNetwork.Socket.send
. Sí,send
está en desuso, pero el motivo no es relevante para este escenario (solo se relaciona con texto o datos binarios que no son ASCII), por lo que parece razonable usarlo.Network.accept gives me a host string, not an IP address integer
¿No puedes dividir la cadena de IP en el"."
,map
de Haskell función cadena-a-serie sobre la cadena de dividir y sumar los resultados?Lua
169162160153151148138129 bytesVersión de golf
Requiere la instalación de Luasocket y un intérprete que admita etiquetas. Lo probé con Luajit y también puedo confirmar que el código no funciona con Lua 5.1.
Versión sin golf
Editar 1:
Cambiado
i=({c:getpeername()})[1]
a soloi=c:getpeername()
Edición 2:
Se eliminaron las llaves de la instrucción require.
Edición 3:
Se eliminaron las llaves alrededor del vararg, disminuyó un poco el recuento de bytes.
Edición 4:
Se eliminó el paréntesis alrededor de "% d +", más corto en 2 bytes.
Editar 5:
Se eliminó la variable innecesaria i.
Editar 6:
Cambió la ip de "127.0.0.1" a 0. (Gracias a xyzzy en #lua)
Editar 7:
Se eliminó la llamada de función a tonumber ya que las cadenas se convierten en números automáticamente (Gracias a Trebuchette por la sugerencia, no lo sabía)
fuente
+
operador, para que pueda sacartonumber
.Haskell, 185 (+ 19 = 204)? bytes
Toma el número de puerto como una línea en stdin; requiere
network-simple
de Cabal.Como es habitual con las respuestas de Haskell que no se limitan a funciones puras,
imports
ocupan demasiados bytes. La nueva línea final también vale 9 bytes ...Algo similar a la respuesta de @ Jules, pero uso manipulación de cadenas en lugar de operaciones de bytes. I
estolausado la-XOverloadedStrings
extensión, así, que es probablemente un valor de 19 bytes extra.fuente
C,
243188bytes (o quizás217162bytes)V2: ver abajo las explicaciones.
188 bytes:
Ligeramente circunspecto 162 bytes:
Probablemente más golf posible mañana por la mañana. Arreglaré esta publicación después de esas actualizaciones.
V1:
Este fue realmente muy divertido para el golf.
Funciona para IPv4. Principalmente es una implementación sencilla. Los tres componentes principales son
Crear el zócalo:
Utilizamos las diversas formas explícitas de las constantes AF_INET, etc., y hacemos uso del hecho de que cuando una estructura se inicializa en C de esta manera, los elementos no especificados se ponen a cero.
Escuche a los clientes, acéptelos y cierre sus conexiones:
Finalmente para enviar a cada cliente los datos:
La IP se almacena
C.sin_addr.s_addr
como un entero de 32 bits donde cada octeto está representado por uno de los cuatro bytes. Sumamos estos bytes con el bucle for y luego los imprimimos en la secuencia usando fprintf.Tengo una solución de 217 bytes más corta, pero no estoy completamente seguro de que no viole las lagunas estándar, ya que requiere que el puerto se dé en unario en orden de bytes de red como argumentos de línea de comandos. Es decir, para ejecutar el servidor en el puerto 12345 habría que llamar
donde el número total de
1
s es 14640. Por decir lo menos es un poco ... engorroso. Pero aquí está de todos modos:fuente
Raqueta, 265 bytes
Sin golf:
fuente
Factor,
155146131206190 bytesBueno, acabo de aprender mucho sobre la programación de sockets de bajo nivel. No creo que quiera volver a hacerlo porque me duele
lacabeza.Oh sí, roscado, y no regresa, correcto.
fuente
10 base>
lugar destring>number
?10 >base
para número> cadena, también.