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
\no\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.1conecta a su servidor. El servidor realiza un cálculo simple: 127+0+0+1 => 128y 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:
awkfiltrado basado (-5 caracteres)Ejecución de muestra:
(terminal 1)
(terminal 2)
En Ubuntu puede obtener
ncde netcat-traditional (no, netcat-openbsd no es bueno) yssde iproute2 .fuente
C #,
284283282278274254 bytesEjemplo clásico de un servidor básico C # TCP. Pruebas:
Terminal 1:
Terminal 2:
Firefox
fuente
int Mainlugar devoid Main. Como el programa nunca regresa, el compilador no requiere unareturndeclaración.Startes opcional, guardando otro carácter.usingen elTcpClient, que le ahorrará tres caracteres más (use el{}defor), y hacer lo mismo con elStreamWriterdebería guardar uno más.FlushelStreamWriterde 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 tomaebxla llamada de socket específica (lasSYS_*macros de/usr/include/linux/net.h), y enecxun puntero al área de argumento de la llamada a la biblioteca original.Algunas cosas hechas para mantener el ejecutable pequeño:
EDXpuntos 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).phentsizeyphnum, se antepone un byte, que se convierte en unaCMPoperación que toma los camposphentsizeyphnumcomo 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, reges de 1 byte, en comparación conMOV EAX, reg, que toma 2 bytes.CDQ/CLTD(sign-extendEAXintoEDX:EAX) puede usarse como una forma de 1 byte para poner a cero elEDXregistro.BSWAPes ú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 $argvcrea un socket de escucha en el puerto especificado en los argumentos.Cada vez que llega una nueva conexión,
proc sse llama al, con el canal, la dirección de origen y el puerto de origen como parámetros.string mapsustituye.a+en la dirección de origen yexprevalúa aritméticamente el resultado, que luegoputsvuelve al canal de conexiónc.vwaitejecuta 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
applyno 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 unregsubenfoque 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 intys.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_STREAMson 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.interfaceaclassdeberí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-Objecty pequeños ajustes ... Ahorré 30 bytes más al usar implícitamente localhost en lugar deanyla 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 elnalalias) para ahorrar en volver a escribirNew-Objectmá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
forbucle infinito , configuramos nuestro oyente$lpara 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.StreamWriterconstructor$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$cy obtenemosRemoteEndPointpropiedad . 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.Addresspropiedad. Luego,-replacelos 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 delforbucle 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 paraiexanalizar.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]::Anyfunciona.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.Splitvuelve 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 usaSscanfelfmtpaquete para analizar la dirección en lugar de regex, le ahorrará otros pocos bytes, lo que le dará la ventaja adicional de tenerFprintlnque 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 queqno interpreteNcomo un script / archivo) y abre un puerto ("p ") con él.q -p Nconfiguran el puerto de formaNautomática, pero como la pregunta parece sugerir queNdebería ser un argumento para el programa en lugar del ejecutable en sí, he tomado el camino más largo..z.pgfunción que maneja las solicitudes entrantes,.z.acontiene la dirección IP como un entero de 32 bits."i"$0x0 vslo divide en sus 'constituyentes' enteros ysumrealiza la suma.stringel resultado numérico y anexar"\n"para volver al cliente..z.phes 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
qsesió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.remoteAddressque 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
ntcpdrvse carga enINT 0x61(y cualquier controlador de paquete adecuado en0x60). Compilar confasm tcpserv.asm.Sin embargo, tiene algunos problemas:
fuente
xor r,rlugar 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 0x61devuelve un puerto local aleatorio enax. Pero también cambia la IP de escucha a algún número de basura (4.2.0.0iirc)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
wfunció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
wa#, así quew h nseh#nahorra 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 servercorre 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.Socketpara 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,bindelistenindividualmente. Pero, lamentablemente,Network.acceptme da una cadena de host , no un entero de dirección IP , así que tuve que recurrir aNetwork.Socket.acceptamigos.La función
ftoma un número de puerto como argumento y crea un socket de servidor (s) que escucha en ese puerto. Luego llama a la funcióngcon el socket del servidor.gbucles para siempre, aceptando conexiones. La funciónbtoma 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
withSocketsDosolo 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í,sendestá 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".",mapde 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-simplede Cabal.Como es habitual con las respuestas de Haskell que no se limitan a funciones puras,
importsocupan 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-XOverloadedStringsextensió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:
struct sockaddr_in S = {2, htons (atoi (v [1]))}, C; bind (s = socket (2,1,0), & S, g = 16);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_addrcomo 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
1s 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 >basepara número> cadena, también.