Escreva um programa ou função que escute o tráfego TCP de entrada na porta N. Ele oferece um serviço simples: calcula a soma dos campos de endereço IP da conexão e retornos de entrada.
Programa ou função lê N inteiro a partir de argumentos ou stdin. Ele escuta as conexões TCP de entrada na porta N. Quando alguém se conecta a essa porta, o programa calcula a soma de seus campos de endereço IP e o envia de volta ao cliente com nova linha final e fecha a conexão.
- O número da porta N é uma porta válida e 2 10 <N <2 15
- A nova linha à direita pode ser
\n
ou\r\n
- Você pode usar IPv4 ou IPv6. Como os endereços IPv6 são gravados em formato hexadecimal, você também deve fornecer o resultado no mesmo formato, por exemplo
2001:0db8:0000:0042:0000:8a2e:0370:7334 => 12ecd
.
Isso é código-golfe . Aplicam-se regras e brechas padrão.
Exemplo
Você executa seu servidor com ./server 1234
. O servidor está agora em execução e aguardando conexões na porta 1234. Em seguida, um cliente se 127.0.0.1
conecta ao seu servidor. O servidor executa um cálculo simples: 127+0+0+1 => 128
e envia o resultado para o cliente (com caractere de nova linha): 128\n
. Em seguida, o servidor fecha a conexão e aguarda o próximo cliente.
Entre os melhores
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>
fonte
Respostas:
Bash + netcat + ss +…,
6560 caracteresNão é uma solução séria, estava apenas curioso sobre essa possibilidade.
Graças a:
awk
filtragem com base (-5 caracteres)Exemplo de execução:
(terminal 1)
(terminal 2)
No Ubuntu, você pode obter
nc
do netcat-traditional (não, o netcat-openbsd não é bom) ess
do iproute2 .fonte
C #,
284283282278274254 bytesExemplo clássico de um servidor C # TCP básico. Testando:
Terminal 1:
Terminal 2:
Raposa de fogo:
fonte
int Main
vez devoid Main
. Como o programa nunca retorna, o compilador não requer umareturn
declaração.Start
é opcional, salvando outro caractere.using
noTcpClient
, que salvará mais três caracteres (use o{}
defor
) e, fazendo o mesmo com oStreamWriter
salvará mais um.Flush
oStreamWriter
para fazê-lo funcionar corretamente.Linux ELF / x86, 146 bytes
Inclui um cabeçalho ELF de 52 bytes, um cabeçalho de programa de 32 bytes, 111 bytes de código de programa + 3 bytes de código para pular dentro dos cabeçalhos.
Informações sobre como criar pequenas executáveis ELF pode ser encontrada em breadbox 's ' A Whirlwind tutorial sobre como criar Realmente Teensy ELF executáveis para Linux ' .
O Linux / i386 usa a
socketcall(2)
chamada de sistema multiplex, que recebeebx
a chamada de soquete específica (asSYS_*
macros de/usr/include/linux/net.h
) eecx
um ponteiro para a área de argumento da chamada de biblioteca original.Algumas coisas feitas para manter o executável pequeno:
EDX
pontos de entrada, uma função de finalização (útil para executáveis carregados pelo vinculador dinâmico) ou seja NULL).argv[0]
).bind(2)
,listen(2)
eaccept(2)
.phentsize
ephnum
, um byte é anexado, transformando-se em umaCMP
operação que leva os camposphentsize
ephnum
como imediatos (truque descaradamente roubado da solução da breadbox para o 123 no anarchy golf ).LODS
(carregamento no acumulador e índice de origem de incremento / decremento) eSTOS
(armazenamento no acumulador e índice de destino de incremento / decréscimo) são boas para o código curto.XCHG EAX, reg
é de 1 byte, comparado aMOV EAX, reg
, que leva 2 bytes.CDQ/CLTD
(estender sinalEAX
paraEDX:EAX
) pode ser usado como uma forma de 1 byte para zerar oEDX
registro.BSWAP
é útil para implementarhtons()
.Nasm fonte:
fonte
NodeJS,
146134127 bytesFinalmente, posso postar uma resposta do NodeJS! IPv4 somente agora.
Execução da amostra:
node script.js 1024
. De outro terminal:fonte
'\n'
uma sequência de modelo que contém uma nova linha literal.Tcl, 92
Bastante auto-explicativo:
socket -server s $argv
cria um soquete de escuta na porta especificada nos argumentos.Toda vez que uma nova conexão chega, ela
proc s
é chamada, com canal, endereço de origem e porta de origem como parâmetros.string map
substitutos.
para+
o endereço de fonte, eexpr
aritmeticamente avalia o resultado, que é, em seguida,puts
de volta para o canal de conexãoc
.vwait
executa um loop de eventos para capturar os eventos de conexão recebidos.Crédito para @DonalFellows pelo seguinte:
Aqui está uma versão que lida com IPv6 (requer Tcl 8.6; a maior parte do comprimento extra é devido à produção de uma resposta hexadecimal):
Tcl, 109
fonte
apply
não parece salvar nada. Nem você pode usar,tcl::mathop::+ {*}[split $a .]
pois é um pouco mais longo. Você também não pode depilar nada com nomes de opções. Mas o suporte ao IPv6 é bastante trivial de se adicionar e custa apenas alguns bytes de código mais (e umaregsub
abordagem baseada no mesmo é o mesmo).proc s {c a p}
você realmente precisa de todo esse espaço em branco?Groovy
133,125,93, 89Somente IPv4, provavelmente.
Ungolfed:
Testando:
fonte
.toInteger()
→as int
es.inetAddress.address*.toInteger()
→(s.inetAddress.address as int[])
. E há um espaço extra depois.with
.Python 3,
170166147 bytesAtiva a porta
stdin
, apenas IPv4. Funciona no GNU / Linux (e, presumo, na maioria das outras unidades), que expande automaticamente "" para "0.0.0.0", embora não tenha certeza sobre o Windows.fonte
import *
e, SOCK_STREAM
são desnecessários. Além disso, a linha de envio pode ser escrita com mais eficiência comoc.send(b"%d\n"%eval(a[0].replace(".","+")))
.s=socket(2)
.int(input())
torna-seinput()
ea parte send tornac.send(`eval(a[0].replace(".","+"))`)
Java,
371368350344333310295282 bytesGolfe
Ungolfed
Resultado
fonte
int k=
e substitua ok por todas as c coisasInteger.toString(k)
. Para salvar alguns bytes.interface
paraclass
deve ganhar mais alguns bytesa.getOutputStream().write((c[0] + c[1] + c[2] + c[3]+"\n").getBytes());
vez denew DataOutputStream(a.getOutputStream()).writeBytes(c[0] + c[1] + c[2] + c[3] + "\n")
try(Socket a=...){}
mais curto quea.close();
? Requer Java 7, mas pode ganhar bytes.PowerShell v2 +,
303268257227 bytesEconomizei 35 bytes graças a Matt ... Economizei outros 11 bytes por alias
New-Object
e pequenos ajustes ... Economizei mais 30 bytes usando implicitamente o host local em vez doany
endereço IP e corrigido para levar em conta o uso contínuo conforme especificado originalmente e perdiRealmente semelhante à resposta do C # , já que o .NET está subjacente a ambos. Economizamos alguns bytes aqui na resposta em C #, aproveitando a funcionalidade de retorno do PowerShell (envolvendo nossa declaração / atribuição em parens e, em seguida, chamando imediatamente os métodos.), Mas perdemos muito por precisar formular a soma. . O fato de termos nomes / chamadas de classe um pouco mais curtos é o motivo pelo qual essa resposta está superando o C #.
Explicação
Primeiro, criamos um
New-Alias
(com onal
alias) para economizar ao digitarNew-Object
mais tarde. O restante da primeira linha está configurando um Ouvinte TCP. Passamos a linha de comando$args[0]
como entrada para criar um novoSystem.Net.Sockets.TcpListener
, armazenado como$l
. Esse objeto é encapsulado em parênteses e imediatamente chamado.Start()
para que ele abra ativamente o soquete.Entrando em um
for
loop infinito , configuramos nosso ouvinte$l
para bloquear com oAcceptTcpClient()
qual aguardará uma conexão. Uma referência a essa conexão (uma vez feita) é armazenada$c
, encapsulada em parênteses e imediatamente chamadaGetStream()
para obter o fluxo de dados. Esse fluxo de dados é passado para um novoSystem.IO.StreamWriter
construtor$w
, para que possamos manipulá-lo. Esse construtor é encapsulado em parens e imediatamente chamadoWrite(...)
.Dentro da
Write(...)
chamada, pegamos nosso identificador de cliente$c
e obtemos aRemoteEndPoint
propriedade do cliente . Esta é a única maneira (que eu encontrei até agora) de obter o endereço IP remoto. Em seguida, precisamos refazê-lo como um[System.Net.IPEndPoint]
objeto para que ele seja formatado corretamente, encapsule isso em parens e puxe apenas a.Address
propriedade. Em seguida,-replace
os períodos literais com sinais de adição e o canalizamosInvoke-Expression
(semelhante aeval
) para obter nosso somatório.Após a gravação do IO, precisamos ligar
.Dispose()
para garantir que o fluxo de dados seja liberado para o cliente e fechado. O servidor TCP interrompe a conexão do cliente sem aviso; portanto, dependendo do cliente usado, ele pode travar um pouco nesse momento. Em seguida, continua ofor
loop sem fechar corretamente as conexões. Isso também significa que vaza memória e o sistema lida como um louco, mas não nos importamos com isso, certo? Você pode precisar usar o Gerenciador de Tarefas para interromper o processo quando terminar de executar o servidor. : DTambém apenas IPv4, pois o somatório vomita tentando manipular um endereço IPv6 espetacularmente, já que
:
não é um operador algébrico válidoiex
para analisar.fonte
free()
eles depois?delete[]
, talvez? : P.close()
e.dispose()
métodos que não estamos chamando aqui que causariam problemas às pessoas na Code Review.[Net.ipaddress]::Any
funciona.PHP, 161 (56?)
Este é o meu primeiro post aqui. Espero que isso dê certo :)
Ungolfed:
Terminal:
Isso funciona apenas para IPV4
Edit : Acabei de notar que o php suporta servidor básico:
Decidi manter a contagem de caracteres original, a menos que alguém confirme se o seguinte é permitido :)
test2.php: (possível solução de 56 bytes)
E, em seguida, inicie o serviço com:
Chrome como cliente
Editar 2: wget como cliente
fonte
test2.php
? Nesse caso, acho que você teria que perguntar ao OP se eles considerariam esse tipo de built-in aceitável para esse desafio. Não é uma brecha.Go ,
359311Este é o meu primeiro programa no Go - ele me permitiu descobrir uma coisa: esta definitivamente não é uma boa linguagem para o golfe!
(Parabéns a @steve, que fez a maior parte do golfe!)
fonte
"strings"
tornas "strings"
- se para que o posteriorstrings.Split
se torne justos.Split
.import(."pkgname")
todas as funções serão importadas para o espaço para nome atual, poderá soltar o prefixo. por exemplo.import ."fmt"; Println("foo")
Se você usarSscanf
ofmt
pacote para analisar o endereço em vez de regex, você economizará mais alguns bytes, oferecendo o bônus deFprintln
devolver o total em vez de importarstrconv
.Lisp comum, 110 bytes
Detalhes
fonte
q, 88 bytes
system raze"p ",1_.z.x
: Pega o segundo argumento da linha de comando (o primeiro"-"
é para dizer paraq
não interpretarN
como um script / arquivo) e abre uma porta ("p "
) com ele.q -p N
define a porta comoN
automática, mas, como a pergunta parece sugerir queN
deveria ser um argumento para o programa, e não para o executável, eu já percorri o caminho mais longo..z.pg
função que lida com solicitações recebidas,.z.a
mantém o endereço IP como um número inteiro de 32 bits."i"$0x0 vs
divide-o em seu número inteiro 'constituintes' esum
faz a soma.string
o resultado numérico e anexado"\n"
a ele para retornar ao cliente..z.ph
é outra função para solicitações HTTP GET, com manipulação extra para converter a saída da string em uma resposta HTTP válida.Demo - Servidor:
Demo - Cliente (de outra
q
sessão em execução127.0.0.1
):Demonstração - Cliente (de
curl
):fonte
LiveScript,
107105 bytesNada a acrescentar, são apenas coisas básicas do NodeJS. Os pontos de estilo para
&1
(segundo argumento),<|
(tubulação F #, semelhante a$
Haskell) e biop:(+)
no LS são como seções do operador em Haskell: uma função binária com curry (que adiciona seus operandos). Também um pouco sujo:/
se for dada uma string literal à sua direita, será dividida.fonte
Perl,
141132 + 1 = 133 bytesGolfe
Ungolfed
Exemplo
fonte
s/\./+/g
→y/./+/
.while(1){…}
→ de{…;redo}
acordo com a ótima dica do usuário130144 . E, exceto a chamada, todos os outros parênteses são desnecessários.->send()
Python 2, 180 bytes
Assume o porto sobre stdin.
fonte
NodeJS (ES6),
129118107 bytesFunciona para IPv4. Correr como
node server.js <port>
fonte
c.remoteAddress
seria então::ffff:127.0.0.1
. (Eu testei no nó v5.9.1)..listen()
usado como padrão no IPv4 primeiro, mas parece que por bug ou design isso mudou. O envio ainda funcionará corretamente nas versões mais recentes do nó quando o IPv6 estiver desativado na máquina host.Vá, 211 bytes
Provavelmente pode ser jogado mais longe, não estou totalmente satisfeito com a maneira como tenho que analisar o endereço IP, por exemplo, parece um hack horrível.
Escuta no IPv4 na porta fornecida como argumento.
fonte
PowerShell,
208206192152 bytesversão informação:
Obrigado ao TimmyD por me salvar 14 bytes!
Agradecimentos massivos ao TessellatingHeckler por me salvar 40 bytes
fonte
($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()}
- se - que eu só testei rapidamente com a conexão netcat, mas parece funcionar da mesma maneira - conectando a partir do localhost de qualquer maneira.Código de máquina 8086 (DOS de 16 bits),
163 156 148 148142 bytesCódigo de montagem equivalente:
Isso pressupõe que
ntcpdrv
está carregado emINT 0x61
(e qualquer driver de pacote adequado em0x60
). Compile comfasm tcpserv.asm
.No entanto, existem alguns problemas:
fonte
xor r,r
vez demov r,0
.CR LF
, então eu apenas fui com isso. De qualquer maneira, é inútil contar o tamanho do ASM agora, é melhor limpá-lo um pouco e adicionar alguns comentários.int 0x61
retorna uma porta local aleatória emax
. Mas também muda o IP escuta para algum número de lixo (4.2.0.0
IIRC)Haskell, 216 bytes
Usando o pacote "simples de rede" (
cabal install network-simple
). Precisa de algumas extensões de idioma (-XOverloadedStrings -XNoMonomorphismRestriction
) para funcionar.Existem algumas simplificações possíveis, incluindo alterar a
w
função para retornar a soma diretamente em vez de uma lista e usar uma função em vez de um programa para que o número da porta possa ser especificado como argumento. Eu não imagino que isso reduziria muito o tamanho, no entanto. 20 bytes, talvez?fonte
w
para#
, entãow h n
torna-seh#n
para uma economia de 2 bytes por uso.Caxumba,
114115 BytesGolfe:
Ungolfed:
Esta é a versão do Mumps da InterSystems Caché - se houver uma versão por aí que possa adquirir o endereço TCP mais curto que
##class(%SYSTEM.TCPDevice).PeerAddr()
(já que é quase um 1/3 de todo o programa) , poderá ter uma chance melhor contra alguns dos outros idiomas já publicados ... ;-)Edit: Graças a @ TimmyD - perdi a leitura da porta do STDIN ou argumentos em vez de ser codificado. Editado; adicionou 1 byte ao programa.
fonte
C, 535 bytes
Bem, alguém tinha que fazer isso.
Eu adicionei uma quebra de linha única para que o código postado tenha 536 caracteres.
ajuntar com
gcc [file_name] -o server
correr com
./server [port]
Conectar com
telnet localhost [port]
fonte
Java, 210 bytes
Golfe:
Expandido:
Esta é uma reunião de todas as dicas que eu dei em outras respostas Java, além da escrita como uma função em vez de um programa completo, que ganha aproximadamente 70 bytes em comparação com o programa.
fonte
Haskell, 326 bytes
Infelizmente, eu tive que usar
Network.Socket
para obter acesso ao endereço IP remoto como um número inteiro e não como uma string. Teria economizado dezenas de caracteres se eu pudesses <- listenOn (PortNumber n)
, ao invés de ter que ligar explicitamentesocket
,bind
elisten
individualmente. Mas, infelizmente,Network.accept
me fornece uma string de host , não um número inteiro de endereço IP , então tive que recorrer aNetwork.Socket.accept
amigos.A função
f
usa um número de porta como argumento e cria um soquete de servidor (s
) escutando nessa porta. Em seguida, chama a funçãog
com o soquete do servidor.g
laços para sempre, aceitando conexões. A funçãob
pega um endereço IPv4 real e calcula a soma de seus dígitos.Tenho certeza de que alguém em algum lugar pode fazer isso melhor do que eu. Eu queria mostrar como as coisas de soquetes fáceis estão em Haskell ... mas depois falhei miseravelmente, porque preciso acessar o endereço IP, o que geralmente não é fácil de obter.
fonte
withSocketsDo
só é necessário no Windows; portanto, se estiver sendo executado no Linux, ele poderá ser ignorado; (2) 0xFF é um caractere maior que 255; (3) converter o soquete em um identificador e usar E / S regulares é muito mais demorado do que usarNetwork.Socket.send
. Sim,send
foi preterido, mas o motivo não é relevante para esse cenário (ele se refere apenas a texto não ASCII ou dados binários), portanto, parece razoável usá-lo.Network.accept gives me a host string, not an IP address integer
Você não pode simplesmente dividir a string IP na"."
,map
função string-to-número de Haskell sobre a seqüência de dividir e somar os resultados?Lua,
169162160153151148138129 bytesVersão Golfed
Requer que o Luasocket esteja instalado e um intérprete que suporte etiquetas. Eu testei com Luajit e também posso confirmar que o código não funciona com Lua 5.1.
Versão ungolfed
Editar 1:
Alterado
i=({c:getpeername()})[1]
para apenasi=c:getpeername()
Edição 2:
Chaves removidas da instrução require.
Edição 3:
Removidas as chaves ao redor do vararg, diminuindo a contagem de bytes um pouco.
Edição 4:
Removidos os parênteses em torno de "% d +", menores em 2 bytes.
Edição 5:
Removida a variável desnecessária i.
Edição 6:
O ip foi alterado de "127.0.0.1" para 0. (Graças a xyzzy em #lua)
Edição 7:
Foi removida a chamada de função para tonumber, pois as strings são convertidas em números automaticamente (obrigado a Trebuchette pela sugestão, eu não sabia disso)
fonte
+
operador, para que você possa removertonumber
.Haskell, 185 (+ 19 = 204)? bytes
Leva o número da porta como uma linha no stdin; requer
network-simple
da Cabal.Como sempre, com respostas de Haskell que não se restringem a funções puras, elas
imports
ocupam muitos bytes. A nova linha à direita também vale 9 bytes ...Um pouco semelhante à resposta de @ Jules, mas eu uso manipulação de strings em vez de operações de bytes. Eu também
roubeia-XOverloadedStrings
extensão, que provavelmente vale 19 bytes extra.fonte
C,
243188 bytes (ou talvez217162 bytes)V2: veja abaixo as explicações.
188 bytes:
Circunspeite ligeiramente 162 bytes:
Provavelmente mais golfe possível amanhã de manhã. Vou arrumar este post depois dessas atualizações.
V1:
Este foi realmente muito divertido de jogar golfe.
Funciona para IPv4. Principalmente, é uma implementação direta. Os três componentes principais são
Criando o soquete:
Usamos as várias formas explícitas das constantes AF_INET etc, e fazemos uso do fato de que quando uma estrutura é inicializada em C dessa maneira, os elementos não especificados são definidos como zero.
Ouça os clientes, aceite-os e feche suas conexões:
Finalmente, para enviar a cada cliente os dados:
O IP é armazenado em
C.sin_addr.s_addr
como um número inteiro de 32 bits, em que cada octeto é representado por um dos quatro bytes. Somamos esses bytes com o loop for e os imprimimos no fluxo usando fprintf.Eu tenho uma solução de 217 bytes mais curta, mas não tenho certeza absoluta de que ela não viole as brechas padrão, pois exige que a porta seja fornecida unária na ordem de bytes da rede como argumentos de linha de comando. Ou seja, para executar o servidor na porta 12345, seria necessário chamar
onde o número total de
1
s é 14640. Para dizer o mínimo, é um pouco ... complicado. Mas aqui está, de qualquer forma:fonte
Raquete, 265 bytes
Ungolfed:
fonte
Fator,
155146131206190 bytesBem, eu aprendi muito sobre programação de soquetes de baixo nível. Eu não acho que eu nunca quero fazer isso de novo, porque o meu
thrcabeça dói.Ah, sim, encadeado e não retorna, certo.
fonte
10 base>
vez destring>number
?10 >base
para number> string, também.