একটি সাধারণ টিসিপি সার্ভার


104

এমন একটি প্রোগ্রাম বা ফাংশন লিখুন যা পোর্ট এন এ আগত টিসিপি ট্র্যাফিকের জন্য শুনবে It

প্রোগ্রাম বা ফাংশনটি আর্গুমেন্ট বা স্টাডিন থেকে পূর্ণসংখ্যা এন পড়ে reads এটি পোর্ট এন-তে আগত টিসিপি সংযোগগুলি শুনবে someone

  • পোর্ট নম্বর এন একটি বৈধ পোর্ট এবং 2 10 <এন <2 15
  • ট্রেলিং নিউলাইন হয় হয় \nবা হয়\r\n
  • আপনি আইপিভি 4 বা আইপিভি 6 ব্যবহার করতে পারেন। যেহেতু IPv6 ঠিকানাগুলি হেক্সাডেসিমাল আকারে লেখা থাকে, আপনাকে অবশ্যই একই ফর্ম্যাটে ফলাফল প্রদান করতে হবে 2001:0db8:0000:0042:0000:8a2e:0370:7334 => 12ecd

এটি । মানক বিধি এবং ফাঁকগুলি প্রযোজ্য।

উদাহরণ

আপনি আপনার সার্ভার দিয়ে চালনা করুন ./server 1234। সার্ভারটি এখন চলছে এবং 1234 পোর্টে সংযোগের জন্য অপেক্ষা করছে Then তারপরে একটি ক্লায়েন্ট 127.0.0.1আপনার সার্ভারে সংযোগ স্থাপন করে। আপনার সার্ভার একটি সহজ হিসাব সঞ্চালিত: 127+0+0+1 => 128এবং (সম্পর্কে newline trailing সঙ্গে) ক্লায়েন্ট ফলাফলের পাঠায়: 128\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>


1
এটি কী ইনডিডি / এক্সিনেটড বা অনুরূপ ব্যবহার করার অনুমতি রয়েছে?
ডিজিটাল ট্রমা

91
আমি এটি পছন্দ করি, যেহেতু এটি একটি গল্ফিং চ্যালেঞ্জ যে গল্ফিং ভাষাগুলি খুব ভাল হওয়ার সম্ভাবনা কম।
isaacg

9
টিসিপি সার্ভারটি স্পষ্টতই লিখতে খুব সহজ প্রোগ্রাম বলে আশ্চর্যরকম নয়, এটি মজাদার জন্য গল্ফ হয়ে উঠছে তা নিয়ে আমি পুরোপুরি মেঝেতে রয়েছি। আমি কেবল ফিজবজ-এর সাথে লড়াইয়ের মতো লড়াইয়ে ফিরে যাব like
MonkeyZeus

17
@ আইসএইচজি এটি কেবলমাত্র সময় যখন কেউ ম্যাথমেটিকায় অন্তর্নির্মিত টিসিপি সার্ভারটি খুঁজে পান
ডাউনওয়েট

3
@ মনকিজেউস সুষ্ঠু হতে, আপনি এখানে কোনও ভাল টিসিপি সার্ভার দেখতে পাবেন না । টিসিপির সমস্ত জটিলতা (এবং আপনার অ্যাপ্লিকেশন প্রোটোকল) ভালভাবে পরিচালনা করে এমন একটি নির্ভরযোগ্য, স্কেলযোগ্য টিসিপি সার্ভার তৈরি করা কিছুটা কঠিন: ডি যদিও এটি অবশ্যই প্রোটোকলটি অত্যন্ত সহজসাধ্যভাবে সাহায্য করে - আপনার এমনকি স্ট্রিমটি পড়ার দরকার নেই , কিছু আমি গণনা করার জন্য অনেকগুলি টিসিপি সার্ভারে ভাঙা দেখেছি: ডি
লুয়ান

উত্তর:


57

বাশ + নেটক্যাট + এসএস +…, 65 60 টি অক্ষর

nc -lp$1 -c'ss src :'$1'|awk \$0=\$5|tr .: +#|bc'
exec $0 $1

কোনও গুরুতর সমাধান নয়, কেবল এই সম্ভাবনা সম্পর্কে কৌতূহল ছিল।

ধন্যবাদ:

  • awkভিত্তিক ফিল্টারিং (-5 অক্ষর) পরামর্শ দেওয়ার জন্য নিনজালজ

নমুনা রান:

(বন্দর 1)

bash-4.3$ ./ip-reduce.sh 8080

(টার্মিনাল ২)

bash-4.3$ nc localhost 8080
128

bash-4.3$ telnet localhost 8080
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
128
Connection closed by foreign host.

উবুন্টু উপর আপনি পেতে পারেন ncথেকে netcat-ঐতিহ্যগত (কোনো, netcat-openbsd ভালো নয়) এবং ssথেকে iproute2


22
আপনি কেন বলেন যে এটি কোনও গুরুতর সমাধান নয়? যতক্ষণ এটি প্রত্যাশার সাথে কাজ করে ততক্ষণ আমি এটিকে গুরুতর বিবেচনা না করার কোনও কারণ দেখতে পাই না। এই মুহুর্তে এটি বেশ তাৎপর্যপূর্ণ ব্যবধানের দ্বারাও সংক্ষিপ্ততম।
অ্যালেক্স এ।

এর বিরুদ্ধে সবচেয়ে বড় উদ্বেগটি @ জেসেসিলেফের সাথে আলোচনার সময় উপস্থিত হয়েছিল যখন আমি জানতে পেরেছিলাম যে কনফিগার করা আইপিভি 6 সিস্টেমগুলিতে, সকেট সম্পর্কিত তথ্য আলাদাভাবে ফর্ম্যাট করা যেতে পারে। এটি পরীক্ষা করার মতো কোনও সিস্টেম নেই। যার জন্য আমি ভাবছি এটি সিডব্লিউতে পরিণত করা আরও সঠিক হবে কিনা।
manatwork

3
অনুমান সম্পর্কে আমার উপলব্ধি হ'ল আপনাকে আইপিভি 4 বা আইপিভি 6 সমর্থন করতে হবে , দুটোই নয়। সুতরাং যতক্ষণ না এটি আইভিভি 4 এর জন্য কাজ করে, আইপিভি 6 সমর্থন করে না সে বিষয়টি বিবেচনা করা উচিত নয়।
অ্যালেক্স এ 4

1
@AlexA। কমপক্ষে আমি আমার প্রশ্ন তাই বলে মনে করি। আমি এটা স্পষ্ট করা উচিত?
হ্যানস কারপিলা

@ হান্নেস কার্পিলা, আপনার প্রশ্নটি পরিষ্কার। সম্ভাব্য সমস্যাটি হ'ল আমার সমাধানটির জন্য অপারেটিং সিস্টেমটি কোনও নির্দিষ্ট উপায়ে কনফিগার করা চালাতে সক্ষম হতে পারে। সুতরাং আমি উদ্বেগ কারণ আইপিভি 6 কনফিগার করা থাকলে এটি ব্যর্থ হতে পারে, আমি এটি পরিচালনা করি কিনা তা নির্বিশেষে। আইপিভি 6 কনফিগার করেছেন এমন কেউ এটিকে নিশ্চিতভাবে বলতে পারে…
manatwork

23

সি #, 284 283 282 278 274 254 বাইট

class A{static int Main(string[]a){var b=new System.Net.Sockets.TcpListener(int.Parse(a[0]));b.Start();for(;;){var c=b.AcceptTcpClient();var d=c.Client.LocalEndPoint.Serialize();new System.IO.StreamWriter(c.GetStream()).WriteLine(d[4]+d[5]+d[6]+d[7]);}}}

একটি বেসিক সি # টিসিপি সার্ভারের ক্লাসিক উদাহরণ। পরীক্ষামূলক:

বন্দর 1:

$ ./Q76379.exe 1029

টার্মিনাল ২:

$ telnet localhost 1029
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
128
Connection closed by foreign host.

ফায়ারফক্স:


7
int Mainপরিবর্তে ব্যবহার করে আপনি 1 বাইট সংরক্ষণ করতে পারেন void Main। প্রোগ্রামটি কখনই সংকলককে ফেরত দেয় না তাই returnবিবৃতি প্রয়োজন হয় না ।
রাজনগুল

এবং না, এটি ফুটো করে না। এটি পাশাপাশি সংস্থানগুলি ছাড়ার বিষয়ে বেশ নির্মাতারা। এছাড়াও, যুক্তিটি Startalচ্ছিক, অন্য একটি অক্ষর সংরক্ষণ করে।
লুয়ান

@ লুয়ান হ্যাঁ, এটি ডিবাগিং থেকে বাকি ছিল।
LegionMammal978

এছাড়াও, আপনি ব্যবহার করতে পারে usingউপর TcpClient, যা আপনি তিন আরো অক্ষর সংরক্ষণ করুন (ব্যবহার করবে {}থেকে for), এবং সঙ্গে একই করছেন StreamWriterআরও একটি সংরক্ষণ করা উচিত।
লুয়ান

@Luaan আমি স্পষ্টভাবে প্রয়োজন এটি সঠিকভাবে কাজ করতে পারে। FlushStreamWriter
LegionMammal978

22

লিনাক্স ইএলএফ / x86, 146 বাইট

00000000  7f 45 4c 46 01 00 00 00  5a 0e 00 00 5a 5e eb 10  |.ELF....Z...Z^..|
00000010  02 00 03 00 0c 50 eb 10  0c 50 eb 10 04 00 00 00  |.....P...P......|
00000020  5e 53 43 53 52 89 e1 b0  66 3d 20 00 01 00 cd 80  |^SCSR...f= .....|
00000030  97 55 6b ed 0a 01 c5 ac  2c 30 79 f6 43 0f cd 01  |.Uk.....,0y.C...|
00000040  dd 55 89 e1 6a 10 51 6a  10 51 57 89 e1 b0 66 cd  |.U..j.Qj.QW...f.|
00000050  80 43 43 b0 66 cd 80 01  64 24 08 89 e1 43 b0 66  |.CC.f...d$...C.f|
00000060  cd 80 89 c1 93 8d 74 24  1b 99 fd ac 01 c2 e2 fb  |......t$........|
00000070  89 f7 b0 0a aa 91 92 f6  f1 86 c4 04 30 aa 42 c1  |............0.B.|
00000080  e8 08 75 f3 42 89 f9 41  b0 04 cd 80 b0 06 cd 80  |..u.B..A........|
00000090  eb c9                                             |..|
00000092

একটি 52-বাইট ইএলএফ শিরোলেখ, একটি 32-বাইট প্রোগ্রাম শিরোলেখ, 111 বাইট প্রোগ্রামের কোড + 3 বাইট কোডের শিরোনামের ভিতরে প্রায় স্কিপিংয়ের জন্য অন্তর্ভুক্ত।

কিভাবে অতি ক্ষুদ্র ELF এক্সেকিউটেবল তৈরি করার তথ্য পাওয়া যাবে breadbox এর " লিনাক্সের জন্য সত্যিই Teensy ELF এক্সেকিউটেবল তৈরির একটি ঘূর্ণিবায়ু টিউটোরিয়াল "

লিনাক্স / i386 socketcall(2)মাল্টিপ্লেক্স সিস্টেম কল ব্যবহার করে যা ebxনির্দিষ্ট সকেট কল গ্রহণ করে ( SYS_*ম্যাক্রোগুলি থেকে /usr/include/linux/net.h) এবং ecxমূল লাইব্রেরি কলের আর্গুমেন্টের পয়েন্টারে।

এক্সিকিউটেবল ছোট রাখতে কিছু কাজ করা হয়েছে:

  • এটি ধরে নেয় রেজিস্টারগুলি প্রবেশের শূন্য, যা লিনাক্স করে, তবে ইএলএফ স্ট্যান্ডার্ড দ্বারা প্রয়োজন হয় না (একমাত্র প্রয়োজন হ'ল এন্ট্রি EDXপয়েন্টগুলিতে একটি চূড়ান্তকরণ ফান্টে (ডায়নামিক লিংক দ্বারা চালিত এক্সিকিউটেবলের জন্য দরকারী) বা NULL)।
  • এটি সূচনা ধরে নিয়েছে (সাধারণত শেল দ্বারা) কেবলমাত্র উন্মুক্ত ফাইল বর্ণনাকারী 0, 1 এবং 2 হয় Which যার অর্থ হ'ল শ্রবণ সকেট এফডি 3 হবে, এবং স্বীকৃত সকেট এফডি 4 হবে।
  • এটি ধরে নিয়েছে ঠিক 2 টি যুক্তি রয়েছে (সহ argv[0])।
  • একই স্ট্যাকের স্থান থেকে কলের জন্য পুনঃব্যবহৃত করা হয় bind(2), listen(2)এবং accept(2)
  • উপর লাফালাফি করা phentsizeএবং phnumক্ষেত্র, একটি বাইট, prepended একটি পরিণত CMPঅপারেশন যা লাগে phentsizeএবং phnumএকটি তাৎক্ষণিক হিসাবে ক্ষেত্র (নির্লজ্জভাবে থেকে চুরি কৌতুক অরাজকতা গলফ মধ্যে 123 থেকে breadbox এর সমাধান )।
  • x86 স্ট্রিং ক্রিয়াকলাপ LODS(সংযোজক এবং ইনক্রিমেন্ট / হ্রাস উত্স সূচকতে লোড) এবং STOS(সংগ্রহকারী এবং বর্ধন / হ্রাস গন্তব্য সূচকের স্টোর) সংক্ষিপ্ত কোডের জন্য দুর্দান্ত।
  • XCHG EAX, regতুলনায় 1-বাইট MOV EAX, reg, যা 2 বাইট নেয়।
  • CDQ/CLTD(সাইন প্রসারিত EAXমধ্যে EDX:EAX) একটি 1 বাইট পথ শূন্য হিসেবে ব্যবহার করা যেতে পারে EDXরেজিস্টার।
  • BSWAPবাস্তবায়নের জন্য দরকারী htons()

নাসম উত্স:

BITS 32                                         ;
                                                ;   ELF HEADER    --   PROGRAM HEADER
; ELF HEADER                                    ; +-------------+
DB 0x7f,'E','L','F'                             ; | magic       |    +--------------------+
                                                ; |             |    |                    |
; PROGRAM HEADERS                               ; |             |    |                    |
DD 1                                            ; |*class   32b | -- | type: PT_LOAD      |
                                                ; |*data   none |    |                    |
                                                ; |*version   0 |    |                    |
                                                ; |*ABI    SysV |    |                    |
DD 0xe5a        ; offset = vaddr & (PAGE_SIZE-1); |*ABI vers    | -- | offset             |
                                                ; |             |    |                    |
entry:  pop     edx     ; edx = 2 (argc)        ; |*PADx7       | -- | vaddr = 0x10eb5e5a |
        pop     esi     ; discard argv[0]       ; |             |    |                    |
        jmp     short skip                      ; |             |    |                    |
DW 2                                            ; | ET_EXEC     | -- |*paddr LO           |
DW 3                                            ; | EM_386      | -- |*paddr HI           |
DD 0x10eb500c                                   ; |*version     | -- | filesz             |
DD 0x10eb500c                                   ; | entry point | -- | memsz              |
DD 4                                            ; | ph offset   | -- | flags: RX          |
                                                ; |             |    |                    |
skip:   pop     esi     ; esi = argv[1]         ; |*sh offset   | -- |*align              |
socket: push    ebx     ; default protocol (0)  ; |             |    |                    |
        inc     ebx                             ; |             |    |                    |
        push    ebx     ; SOCK_STREAM (1)       ; |             |    |                    |
        push    edx     ; AF_INET (2)           ; |*flags       |    +--------------------+
        mov     ecx, esp                        ; |             |
        mov     al, 0x66                        ; |*ehsize      |
DB 0x3d         ; cmp eax,0x10020               ; |             |
DW 32                                           ; | phentsize   |
DW 1                                            ; | phnum       |
                                                ; |             |
        int     0x80    ; socket(2, 1, 0)       ; |*shentsize   |
        xchg    edi, eax; edi = sockfd, eax = 0 ; |*shnum       |
        push    ebp     ; INADDR_ANY            ; |             |
                                                ; |             |
mult:   imul    ebp, 10 ; \_                    ; |*shstrndx    |
        add     ebp, eax; >                     ; |             |
        lodsb           ; >                     ; +-------------+
        sub     al,'0'  ; >
        jns     mult    ; / ebp = atoi(argv[1])                 ;       bind stack frame
                                                                ;    +-----------------------+
endmul: inc     ebx             ; SYS_BIND (2)                  ;    |        INADDR_ANY     |
                                                                ; +->| AF_INET | htons(port) |
        bswap   ebp                                             ; |  +-----------------------+
        add     ebp, ebx        ; AF_INET (2), htons(port)      ; |  |           16          |
        push    ebp                                             ; |  +-----------------------+
                                                                ; |  |         dummy         |
        mov     ecx, esp                                        ; |  +-----------------------+
        push    16              ; addrlen                       ; |  |           16          |
        push    ecx             ; dummy value                   ; |  +-----------------------+
        push    16              ; addrlen                       ; +--|          addr         |
        push    ecx             ; addr                          ;    +-----------------------+
        push    edi             ; sock                          ;    |         sockfd        |
        mov     ecx, esp                                        ;    +-----------------------+
        mov     al, 0x66
        int     0x80            ; bind(sockfd, addr, addrlen)
                                                                ;       accept stack frame
                                                                ;    +-----------------------+
listen: ;mov    byte [esp+8],1                                  ;    |        INADDR_ANY     |
        inc     ebx                                             ; +->| AF_INET | htons(port) |
        inc     ebx             ; SYS_LISTEN (4)                ; |  +-----------------------+
        mov     al, 0x66                                        ; |+>|           16          |
        int     0x80            ; listen(sockfd, backlog)       ; || +-----------------------+
                                                                ; || |         dummy         |
        add     [esp+8], esp                                    ; || +-----------------------+
accept: mov     ecx, esp                                        ; |+-|        &addrlen       |
        inc     ebx             ; SYS_ACCEPT (5)                ; |  +-----------------------+
        mov     al, 0x66                                        ; +--|          addr         |
        int     0x80            ; accept(sockfd, addr, &addrlen);    +-----------------------+
                                                                ;    |         sockfd        |
        mov     ecx, eax        ; ecx = 4                       ;    +-----------------------+
        xchg    ebx, eax        ; ebx = acceptfd, eax = 000000xx

        lea     esi, [esp+27]   ; point to the IP part of struct sockaddr_in
        cdq

        std                     ; reverse direction for string operations
addip:  lodsb                   ; \_
        add     edx, eax        ; > edx = sum of 4 IP bytes
        loop    addip           ; /

        mov     edi, esi        ; reuse struct sockaddr_in as scratch buffer
        mov     al, 10          ; '\n'
        stosb
        xchg    ecx, eax        ; ecx = 10
        xchg    eax, edx        ; edx = 0, eax = sum

divide: div     cl              ; \_
        xchg    al, ah          ; >
        add     al,0x30         ; >
        stosb                   ; > sprintf(scratch, "%d", sum)
        inc     edx             ; >
        shr     eax, 8          ; >
        jnz     divide          ; /

write:  inc     edx             ; ndigits + 1 ('\n')
        mov     ecx, edi
        inc     ecx
        mov     al,4
        int     0x80            ; write(acceptfd, scratch, scratchlen) 
close:  mov     al, 6
        int     0x80            ; close(acceptfd)
        jmp     accept

4
এই উত্তরটি হ'ল উপায়হীন।
বিড়াল

16

নোডজেএস, 146 134 127 বাইট

require('http').createServer((q,s)=>s.end(eval(0+q.socket.remoteAddress.replace(/^.*:|\./g,'+'))+'\n')).listen(process.argv[2])

আমি অবশেষে একটি নোডজেএস উত্তর পোস্ট করতে হবে! কেবল এখনই আইপিভি 4।

নমুনা ফাঁসি: node script.js 1024। অন্য টার্মিনাল থেকে:

$ curl 127.0.0.1:1024
128

2
আমি এই মুহুর্তে 127 বাইট গণনা করছি, যদিও আপনি এটিতে '\n'আক্ষরিক নিউলাইনযুক্ত টেম্পলেট স্ট্রিংটি অদলবদল করে 126-এ নামাতে পারেন ।
Mwr247

আপনার প্রয়োজনীয় এইচটিটিপি সার্ভার তৈরি করার কারণে এটি প্রয়োজনীয়তাগুলিতে ব্যর্থ হবে না, কারণ এটি প্রযুক্তিগতভাবে একটি টিসিপি সার্ভার, তবে আপনি কেবল টিসিপি মডিউলটি ব্যবহার করতে এবং নিজেকে একটি চরিত্র বাঁচাতে পারবেন না?
মেয়রমন্টি

14

Tcl, 92

  • 1 ডোনালফেলোতে 1 বাইট সংরক্ষণ করা হয়েছে।
proc s {c a p} {puts $c [expr [string map .\ + $a]]
close $c}
socket -server s $argv
vwait f

মোটামুটি স্ব-ব্যাখ্যামূলক:

socket -server s $argv আর্গুমেন্টে নির্দিষ্ট পোর্টে শ্রবণকারী সকেট তৈরি করে।

প্রতিবার একটি নতুন সংযোগ আসার পরে, proc sপ্যারামিটার হিসাবে চ্যানেল, উত্স-ঠিকানা এবং উত্স-বন্দর সহ কল ​​করা হয়। উত্স ঠিকানার string mapবিকল্প .হিসাবে চিহ্নিত করা +হয় এবং exprগাণিতিকভাবে ফলাফলটি মূল্যায়ন করে যা putsসংযোগ চ্যানেলে ফিরে আসে c

vwait আগত সংযোগ ইভেন্টগুলি ধরতে ইভেন্ট লুপ চালায়।


নিম্নলিখিতগুলির জন্য @ ডোনালফেলোতে ক্রেডিট:

এখানে একটি সংস্করণ যা আইপিভি 6 পরিচালনা করে (টিসিএল 8.6 প্রয়োজন; অতিরিক্ত দৈর্ঘ্যের বেশিরভাগ অংশ হেক্স প্রতিক্রিয়া তৈরি করার কারণে হয়):

টিসিএল, 109

proc s {c a p} {puts $c [format %x [expr 0x[string map :\ +0x0 $a]]]
close $c}
socket -server s $argv
vwait f

1
ব্যবহার applyকরে কিছু সংরক্ষণ করা হবে বলে মনে হচ্ছে না। না আপনি tcl::mathop::+ {*}[split $a .]যে সামান্য দীর্ঘ হিসাবে ব্যবহার করতে পারেন । অথবা বিকল্পের নাম থেকে আপনি কিছু শেভ করতে পারবেন না। তবে আইপিভি supporting সমর্থন করা যুক্ত করার পক্ষে বেশ তুচ্ছ, এবং কেবলমাত্র কয়েকটি বাইট কোডের বেশি খরচ হয় (এবং তারপরে একটি regsubবেসভিত্তিক দৃষ্টিভঙ্গি কেবল দীর্ঘ।
ডোনাল ফেলো

আহ, টিসিএল / টিসিএল-ডিপি ... সরঞ্জামগুলির আশ্চর্যজনক গুচ্ছ। (90 এর দশকে একজন অধ্যাপক আমাদের দেখিয়েছিলেন যে আমরা একটি নেটওয়ার্ক-বিতরণকৃত এক্সেল (একটি গ্রিড সহ সূত্র মূল্যায়ন সহ!) সার্ভারের জন্য (iirc) 4 (সংক্ষিপ্ত) লাইন এবং ক্লায়েন্টদের 5 টির সাথে একাধিক ব্যক্তির মধ্যে ভাগ করে নিতে পারি। ..
অলিভিয়ার ডুলাক

proc s {c a p}আপনার কি সত্যিই সেই সাদা জায়গাটির দরকার?
বিড়াল 13

12

গ্রোভি 133 , 125 , 93 , 89

new ServerSocket(args[0]as int).accept{it<<(it.inetAddress.address as int[]).sum()+"\n"}

কেবলমাত্র আইভিভি 4, সম্ভবত।

Ungolfed:

new ServerSocket(args[0]as int).accept{
    it << (it.inetAddress.address as int[]).sum()+"\n"
}

পরীক্ষামূলক:

$ telnet localhost 9000
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
128
Connection closed by foreign host.

1
.toInteger()as intএবং s.inetAddress.address*.toInteger()(s.inetAddress.address as int[])। এবং পরে একটি অতিরিক্ত স্থান আছে .with
manatwork

@ মান্যাট ওয়ার্ক! আপডেট করা হয়েছে।
LP হবে

9

পাইথন 3, 170 166 147 বাইট

from socket import*
s=socket()
s.bind(("",int(input())))
s.listen()
while 1:
 c,a=s.accept()
 c.send(b"%d\n"%eval(a[0].replace(".","+"))),c.close()

পোর্ট চালু করে stdin, কেবল আইপিভি 4। জিএনইউ / লিনাক্সে কাজ করে (এবং, আমি ধরে নিলাম, বেশিরভাগ অন্যান্য সংযুক্তি), যা স্বয়ংক্রিয়ভাবে "" "0.0.0.0" তে প্রসারিত হয়, যদিও উইন্ডোজ সম্পর্কে নিশ্চিত নয়।


2
আপনি কয়েকটি বাইট সংরক্ষণ করতে পারেন। প্রথমত, এ স্পেস import *এবং , SOCK_STREAMঅপ্রয়োজনীয় হয়। এছাড়াও, প্রেরণ লাইনটি আরও দক্ষতার সাথে লেখা যেতে পারে c.send(b"%d\n"%eval(a[0].replace(".","+")))
হ্যানস কারপিলা

2
@ হান্নেস কার্পপিলা ওহ, ধন্যবাদ স্পেসগুলি সম্পর্কে ভুলে গেছি, যদিও ইভাল হ্যাকটি বেশ দুর্দান্ত।
সাম্মকো

2
এফএনপেট এবং সোসকপ্রিম কেবল ধ্রুবক; এএফপিইটিটি 2 এবং এসক্ক্রিপ্রেম 1 টি। এছাড়াও উল্লেখ করা আছে, সোকপ্রেম অপ্রয়োজনীয়; যাতে আপনি এটি ব্যবহার করে পরিবর্তিত করতে পারেন s=socket(2)
স্কাইলার

1
আপনি কি কেবল সকেট () করতে পারবেন না এবং তাই অন্য একটি বাইট সংরক্ষণ করতে পারেন?
ফুন

1
পাইথন ২ ব্যবহার করে আপনি 10 টি অক্ষর সংরক্ষণ করতে পারেন 2 তারপরে, int(input())হয়ে যায় input()এবং প্রেরণের অংশটি হয়ে যায়c.send(`eval(a[0].replace(".","+"))`)
ব্লেন্ডার

9

জাভা, 371 368 350 344 333 310 295 282 বাইট

Golfed

import java.net.*;class A{public static void main(String[]n)throws Exception{ServerSocket s=new ServerSocket(Integer.decode(n[0]));for(;;){try(Socket a=s.accept()){byte[]c=a.getInetAddress().getAddress();new java.io.PrintStream(a.getOutputStream()).println(c[0]+c[1]+c[2]+c[3]);}}}}

Ungolfed

import java.net.*;

class A {
    public static void main(String[] n) throws Exception {
        ServerSocket s = new ServerSocket(Integer.decode(n[0]));
        for (;;) {
            try (Socket a = s.accept()) {
                byte[] c = a.getInetAddress().getAddress();
                new java.io.PrintStream(a.getOutputStream()).println(c[0] + c[1] + c[2] + c[3]);
            }
        }
    }
}

আউটপুট

mallard@steamroller:~$ telnet localhost 8888
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
128
Connection closed by foreign host.

1
মুছে ফেলুন int k=এবং এর মধ্যে সমস্ত সি জিনিস দিয়ে কে প্রতিস্থাপন করুন Integer.toString(k)। কয়েক বাইট সংরক্ষণ করতে।
জায়ান্ট্রি গাছ

1
Javas উপরে 127. একটি বাইট আপ 192.168.2.1 বা অনুরূপ adresses বিনিময়ে মান নিশ্চিত messes বাইট
AlexR

1
পরিবর্তন interfaceকরার জন্য classআরো কয়েকটি বাইট লাভ করা উচিত
ortis

2
ব্যবহার করুন a.getOutputStream().write((c[0] + c[1] + c[2] + c[3]+"\n").getBytes());পরিবর্তেnew DataOutputStream(a.getOutputStream()).writeBytes(c[0] + c[1] + c[2] + c[3] + "\n")
ortis

3
এর try(Socket a=...){}চেয়েও কম নয় a.close();? জাভা 7 প্রয়োজন, তবে বাইটগুলি অর্জন করতে পারে।
অলিভিয়ার গ্রাগোয়ার

8

পাওয়ারশেল ভি 2 +, 303 268 257 227 বাইট

nal n new-object;($l=n Net.Sockets.TcpListener($args[0])).Start()
for(){($w=n IO.StreamWriter(($c=$l.AcceptTcpClient()).GetStream())).Write((([Net.IPEndPoint]$c.Client.RemoteEndPoint).Address-replace"\.",'+'|iex))
$w.Dispose()}

ম্যাটকে ধন্যবাদ 35 বাইট সংরক্ষণ করা হয়েছে ... এলিয়াসিং New-Objectএবং অপ্রাপ্তবয়স্ক টুইটের মাধ্যমে আরও 11 বাইট সংরক্ষণ করা হয়েছে ... anyআইপি ঠিকানার পরিবর্তে স্পষ্টত লোকালহোস্ট ব্যবহার করে 30 টি আরও বাইট সংরক্ষণ করা হয়েছে এবং মূলত নির্দিষ্ট হিসাবে ক্রমাগত ব্যবহারের জন্য অ্যাকাউন্টে সংশোধন করা হয়েছে এবং আমি মিস করেছি

সি # জবাবের সাথে সত্যিই মিল , যেহেতু এটি। নেট উভয়ই অন্তর্নিহিত। আমরা পাওয়ার শেলের রিটার্নিং কার্যকারিতা (পেরেনগুলিতে আমাদের ঘোষণা / অ্যাসাইনমেন্টকে ঘিরে, এবং তারপরে তাত্ক্ষণিকভাবে। পদ্ধতিগুলি কল করে) সক্ষম করে কিছুটা বাইট এখানে সি-উত্তর দিয়ে সংরক্ষণ করি, তবে সংক্ষেপটি গঠনের প্রয়োজনের সাথে আমরা একটি ভয়াবহ কিছু হারাতে পারি । আমরা সামান্য খাটো শ্রেণীর নাম / কল পেয়েছি যে সত্যই এই উত্তরটি সি # কে মারছে।

ব্যাখ্যা

পরে পুনরায় টাইপ করার সময় সংরক্ষণ করার জন্য আমরা প্রথমে একটি New-Alias( nalওরফে সহ) তৈরি করি New-Object। প্রথম লাইনের বাকি অংশগুলি টিসিপি শ্রোতা স্থাপন করছে। আমরা $args[0]নতুন System.Net.Sockets.TcpListenerহিসাবে তৈরির জন্য ইনপুট হিসাবে কমান্ড-লাইনটি পাস করি $l। এই অবজেক্টটি পেরেন্সে আবদ্ধ হয় এবং তত্ক্ষণাত .Start()সক্রিয়ভাবে সকেটটি খোলার জন্য ডেকে আনা হয়।

অসীম forলুপটি প্রবেশ করে আমরা আমাদের শ্রোতাদেরকে $lঅবরুদ্ধ করতে সেট করি AcceptTcpClient()যা সংযোগের জন্য অপেক্ষা করবে। সেই সংযোগটির একটি রেফারেন্স (এটি তৈরি হয়ে গেলে) সঞ্চিত হয় $c, প্যারেন্সে এনক্যাপসুলেটেড হয় এবং তাত্ক্ষণিকভাবে GetStream()ডাস্টাস্ট্রিম পেতে বলা হয়। যে datastream একটি নতুন প্রেরণ করা System.IO.StreamWriterকন্সট্রাকটর, $w, তাই আমরা এটা নিপূণভাবে পারবেন না। সেই কনস্ট্রাক্টর নিজেই প্যারেন্সে আবদ্ধ হয় এবং তাত্ক্ষণিক কল হয় Write(...)

Write(...)কলটির অভ্যন্তরে , আমরা আমাদের ক্লায়েন্টকে পরিচালনা করি $cএবং ক্লায়েন্টের RemoteEndPointসম্পত্তি পাই' s দূরবর্তী আইপি ঠিকানা পাওয়ার জন্য এটিই একমাত্র উপায় (যে আমি এখনও অবধি খুঁজে পেয়েছি)। এরপরে আমাদের এটি পুনরায় কাস্ট করতে [System.Net.IPEndPoint]হবে যাতে কোনও অবজেক্ট হিসাবে এটি সঠিকভাবে ফর্ম্যাট করা যায়, এটি প্যারেন্সে encapsulate করুন এবং কেবল .Addressসম্পত্তি টানুন । তারপরে আমরা -replaceআক্ষরিক পিরিয়ডগুলি প্লাস চিহ্ন সহ, তারপরে এটি পাইপের জন্য Invoke-Expression(অনুরূপ eval) আমাদের সমষ্টি পেতে।

আইও লেখার পরে, আমাদের .Dispose()কাছে ডাস্টাস্ট্রিমটি ক্লায়েন্টের কাছে ফ্লাশ করা এবং বন্ধ করা হয়েছে তা নিশ্চিত করার জন্য কল করতে হবে। টিসিপি সার্ভার ক্লায়েন্ট সংযোগটি সতর্কতা ছাড়াই ফেলে দেয়, সুতরাং ব্যবহৃত ক্লায়েন্টের উপর নির্ভর করে এটি এই মুহুর্তে কিছু সময়ের জন্য স্তব্ধ হতে পারে। forএটি সঠিকভাবে সংযোগগুলি বন্ধ না করে লুপের মাধ্যমে অবিরত থাকে । এর অর্থ এইও যে এটি মেমরি ফাঁস করে এবং সিস্টেমটি পাগলের মতো হ্যান্ডলগুলি হ'ল, কিন্তু আমরা সে বিষয়ে যত্ন করি না, তাই না? যদিও আপনি সার্ভার চালানোর কাজটি শেষ করে ফেলেছেন তখন প্রক্রিয়াটি শেষ করতে আপনাকে টাস্ক ম্যানেজার ব্যবহার করতে হবে use : ডি

কেবলমাত্র আইভিভি 4, সমষ্টি বার্ফগুলি দর্শনীয়ভাবে একটি আইপিভি 6 ঠিকানা পরিচালনা করার চেষ্টা করছে, কারণ পার্স করার :জন্য কোনও বৈধ বীজগণিত অপারেটর নয় iex


2
"ফুটো মেমরি এবং সিস্টেম পাগলের মতো পরিচালনা করে" কী, free()তাদের পরে আপনার কী আছে ? delete[], হতে পারে? : পি
বিড়াল

8
@ ট্যাঁ হ্যাঁ, আমরা এখানে কল করছি না এমন পুরো পদ্ধতি .close()এবং .dispose()পদ্ধতিগুলি রয়েছে যা কোড রিভিউতে লোকদের ফিট রাখতে পারে।
অ্যাডমবর্কবার্ক 15 '27

ওহ, পিএস জিসি না? বা জিসি কি স্ক্র্যাপ-বিশ্লেষণকে পুনরায় গণনা করে না?
বিড়াল

@ ট্যাক হ্যাঁ, পাওয়ারশেলের অন্তর্নিহিত। নেট সিস্টেমের জন্য আবর্জনা সংগ্রহের ধন্যবাদ রয়েছে। কিন্তু, কেমন আহ্বান করছি বা এই স্ক্রিপ্টের ওঠানামা উপর নির্ভর করে, আপনার মত বাগ মধ্যে চালাতে পারেন এই এক পাইপলাইন মেমরি লিক। উপরের কোডটি থ্রেড-সেফও নয় এবং এটি জিসি ইস্যুতে চালিত হতে পারে, কারণ আমরা স্পষ্টভাবে সকেটটি বন্ধ করছি না।
অ্যাডমবর্কবার্ক

1
পরীক্ষায় আমি এটি কাজ করতে পারিনি, সম্ভবত ফায়ারওয়াল সমস্যাগুলির কারণে যা আমার কাছে ফিক্সিংয়ের মতো মনে হয় না তাই আমি নিশ্চিত হতে পারি না তবে ..... আমার মনে হয় আপনি সমস্ত ধরণের কাস্ট না থাকলে আপনি বেশিরভাগ থেকে "সিস্টেম" বাদ দিতে পারেন I আপনার সেখানে আছে: [Net.ipaddress]::Anyকাজ করে।
ম্যাট

7

পিএইচপি, 161 (56?)

এটি এখানে আমার প্রথম পোস্ট। আমি আশা করি এটি ঠিক হয়ে যায় :)

<?php $s=socket_create_listen($argv[1]);while($c=socket_accept($s)){socket_getpeername($c,$r);socket_write($c,array_sum(explode('.',$r))."\n");socket_close($c);}

Ungolfed:

<?php 
    $s = socket_create_listen($argv[1]); //Create socket
    while( $c = socket_accept($s) ) { // Loop accepting new connections
        socket_getpeername($c, $r); // Get IP address in $r
        socket_write($c, array_sum(explode('.', $r))."\n"); //Calculate sum
        socket_close($c); //Close connection and wait for next one
    }

টার্মিনাল:

$ php test.php 8080 &
$ telnet localhost 8080
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
128
Connection closed by foreign host.

এটি কেবল আইপিভি 4 এর জন্য কাজ করে

সম্পাদনা : আমি সবেমাত্র লক্ষ্য করেছি যে পিএইচপি বেসিক সার্ভারকে সমর্থন করে:
আমি নিম্নলিখিত চরিত্রের গণনার সাথে লেগে থাকার সিদ্ধান্ত নিয়েছি যদি না নিম্নলিখিতটির অনুমতি দেওয়া হয় তবে কেউ নিশ্চিত না করে :)

test2.php: (সম্ভব 56-বাইট সমাধান)

<?=array_sum(explode('.',$_SERVER['REMOTE_ADDR']))."\n";

এবং তারপরে পরিষেবাটি শুরু করুন:

php -S localhost:8080 test2.php

ক্লায়েন্ট হিসাবে ক্রোম স্ক্রিনশট

সম্পাদনা 2: ক্লায়েন্ট হিসাবে উইজেট

$ wget -qO- localhost:8080
128

আমি জানি নিয়মগুলি বলে: "প্রোগ্রাম বা ফাংশনটি আর্গুমেন্ট বা স্টিডিন থেকে পূর্ণসংখ্যা এন পাঠ করে" তবে এই ক্ষেত্রে প্রোগ্রামটি যদি পিএইচপি নিজেই হয় তবে কি ঠিক আছে? অথবা পিএইচপি বিবেচিত লুফোলটিতে বিল্টিন সার্ভার ব্যবহার করছেন?
মিকেল

প্রোগ্রামিং ধাঁধা এবং কোড গল্ফ স্বাগতম! আপনার 161-বাইট সমাধানটি দুর্দান্ত দেখাচ্ছে। আপনি যে 56-বাইট সমাধানটির কথা উল্লেখ করেছেন তা test2.phpকি? যদি তা হয়, তবে আমি মনে করি যে আপনি এই ওপিকে জিজ্ঞাসা করতে হবে যে তারা এই চ্যালেঞ্জের জন্য এই জাতীয় বিল্ট-ইনকে গ্রহণযোগ্য বলে বিবেচনা করবে। যদিও এটি একটি ফাঁক নয়।
অ্যালেক্স এ।

আমি বলব, একটি বিল্টিন টিসিপি সার্ভার ব্যবহার করা গ্রহণযোগ্য হবে তবে এই ক্ষেত্রে আমরা একটি বিল্টিন এইচটিটিপি সার্ভারের কথা বলি । সুতরাং 56 বাইট সমাধান 1) ক্লায়েন্ট কেবল সংযোগ করে এবং কিছু না প্রেরণ করলে কিছুই করে না; 2) কেবল ক্লায়েন্ট উদাহরণস্বরূপ "foo" প্রেরণ করে যদি test2.php না চালিয়ে "[বুধ 30 মার্চ 10-15:02 2016] 127.0.0.1:47974 অবৈধ অনুরোধ (ত্রুটিযুক্ত HTTP অনুরোধ) ফেরত পাঠায়; 3) ক্লায়েন্ট বৈধ HTTP অনুরোধ প্রেরণের ক্ষেত্রে প্রকৃত প্রয়োজনীয় প্রতিক্রিয়ার আগে HTTP প্রতিক্রিয়া শিরোনামের সম্পূর্ণ সেট প্রেরণ করে।
manatwork

@ অ্যালেক্স এ। আপনাকে ধন্যবাদ এবং হ্যাঁ, 56-বাইট সমাধান পরীক্ষা 2.php এর অধীনে রয়েছে :)
মিকেল

@ মান্যাটওয়ার্ক আপনি সঠিক আছেন তবে আমি ভাবছিলাম ক্লায়েন্টকে এই কাজটিতে স্পষ্টভাবে নির্দিষ্ট করা হয়নি। সুতরাং ব্রাউজার ব্যবহার করা বা ক্লায়েন্ট হিসাবে "wget ​​-qO- লোকালহোস্ট: 8080" এর মতো আরও সাধারণ কিছু ব্যবহার করা ঠিক কি?
মিকেল

7

যান , 359 311

এটি গোতে আমার প্রথম প্রোগ্রাম - এটি আমাকে একটি জিনিস আবিষ্কার করতে দিয়েছে: এটি অবশ্যই কোনও ভাল গল্ফিং ভাষা নয়!

(কাস্টোস টু @ স্টিভ যারা বেশিরভাগ গল্ফ করেছেন!)

package main
import(n"net";t"strings";r"strconv";x"regexp";"os")
func main(){l,_:=n.Listen("tcp",":"+os.Args[1])
for{c,_:=l.Accept();var s int
for _,i:=range t.Split(x.MustCompile(":[0-9]+$").ReplaceAllLiteralString(c.RemoteAddr().String(),""),"."){
n,_:=r.Atoi(i);s=s+n};c.Write([]byte(r.Itoa(s)));c.Close()}}

2
তবে এটি নিশ্চিত যে টিসিপি সার্ভার তৈরি করার জন্য একটি দুর্দান্ত ভাষা!
নিউমারি

1
বিজোড়, ফলে 360 যখন আমি 192.168.0.67 সাথে সংযোগ স্থাপন পাচ্ছি বদলে 427.
স্টিভ

3
আপনি কয়েকটি বাইট সংরক্ষণের জন্য স্ট্রিং + স্ট্রঙ্কভি প্যাকেজটির নাম দিতে পারেন। যেমন "strings"হয়ে ওঠে s "strings"যাতে পরবর্তীকালে ন্যায়বিচার strings.Splitহয় s.Split
স্টিভ

1
পেস্টবিন. com/HY84sazE বন্ধ শেভ করা আরও কয়েকটি বাইট - এখন কিছুটা আরও "গল্ফড" দেখতে শুরু করুন
স্টিভ

2
আপনি যদি import(."pkgname")সমস্ত ফাংশন ব্যবহার করেন তবে বর্তমান নেমস্পেসে আমদানি করা হবে, আপনি তারপরে উপসর্গটি ড্রপ করতে পারেন। যেমন। import ."fmt"; Println("foo") আপনি যদি প্যাকেজটি থেকে রেজেক্সের পরিবর্তে ঠিকানাটি বিশ্লেষণ করতে ব্যবহার Sscanfকরেন তবে fmtএটি আপনাকে আরও কয়েকটি বাইট বাঁচাতে পারে, আপনাকে Fprintlnআমদানির পরিবর্তে মোটটি ফেরত দেওয়ার দুর্দান্ত বোনাস দেয় strconv
ক্রিস্টোফার সল-স্টোরগার্ড

7

কমন লিস্প, 110 বাইট

(use-package'usocket)(lambda(p)(socket-server"localhost"p(lambda(u)(format u"~D~%"(reduce'+ *remote-host*)))))

বিস্তারিত

(use-package 'usocket)

(lambda (port)

  ;; create server with event-loop
  (socket-server "localhost"
                 port

                 ;; tcp-handler
                 (lambda (stream)
                   ;; format to stream to client
                   (format stream
                           "~D~%"
                           ;; add all elements of the host,
                           ;; a vector of 4 integers
                           (reduce #'+ *remote-host*))

                   ;; client connection is closed automatically
                   ;; when exiting this function                     
                 )))

2
কমন লিথ্পের জন্য ইয়ে!
বিড়াল 13

6

q, 88 বাইট

system raze"p ",1_.z.x;.z.pg:{(string sum"i"$0x0 vs .z.a),"\n"};.z.ph:{.h.hy[`;.z.pg[]]}
  • system raze"p ",1_.z.x: দ্বিতীয় কমান্ড-লাইন আর্গুমেন্ট গ্রহণ করে (প্রথমটি "-"হ'ল স্ক্রিপ্ট / ফাইল হিসাবে qব্যাখ্যা না করার জন্য N) এবং "p "এটি দিয়ে একটি পোর্ট খোলে ( )।
    • দ্রষ্টব্য: কলিংটি স্বয়ংক্রিয়ভাবে q -p Nবন্দরটিকে সেট করে N, তবে যেহেতু প্রশ্নটি মনে হয় যে এটি কার্যকর Nহওয়ার চেয়ে প্রোগ্রামটির পক্ষে যুক্তি হওয়া উচিত argument
  • .z.pgআগত অনুরোধগুলি পরিচালনা করে এমন ফাংশনের অভ্যন্তরে , .z.aআইপি ঠিকানাটি 32-বিট পূর্ণসংখ্যা হিসাবে ধারণ করে।
    • "i"$0x0 vsএটিকে এর পূর্ণসংখ্যার 'উপাদানগুলি' এ বিভক্ত sumকরে এবং সংক্ষেপটি করে।
    • সর্বশেষে, stringসংখ্যার ফলাফল এবং "\n"ক্লায়েন্টে ফিরে আসার জন্য এটিতে যুক্ত ।
  • .z.ph স্ট্রিং আউটপুটটিকে বৈধ HTTP প্রতিক্রিয়াতে রূপান্তর করতে অতিরিক্ত হ্যান্ডলিং সহ HTTP GET অনুরোধগুলির জন্য আরেকটি ফাংশন for

ডেমো - সার্ভার:

c:\q\w32>q - 1234
KDB+ 3.3 2015.11.03 Copyright (C) 1993-2015 Kx Systems
w32/ 4()core ... NONEXPIRE

Welcome to kdb+ 32bit edition
q)system raze"p ",1_.z.x;.z.pg:{(string sum"i"$0x0 vs .z.a),"\n"};.z.ph:{.h.hy[`;.z.pg[]]}
q)

ডেমো - ক্লায়েন্ট (অন্য qসেশন থেকে চলছে 127.0.0.1):

q)(hopen `::1234)""
"128\n"

ডেমো - ক্লায়েন্ট (থেকে curl):

$ curl localhost:1234
128

$

6

লাইভস্ক্রিপ্ট, 107 105 বাইট

(require \http)createServer(->&1.end((.reduce (+))<|it.connection.remoteAddress/\.))listen process.argv.0

কিছু যোগ করার মতো কিছুই নয়, এটি কেবলমাত্র বেসিক নোডজেএস স্টাফ। &1(দ্বিতীয় যুক্তি), <|(এফ # পাইপিং, $হাস্কেলের অনুরূপ ) এবং বায়োপ জন্য স্টাইল পয়েন্টস : (+)এলএস-এ হ্যাসকেলে অপারেটর বিভাগগুলির মতো: একটি ত্রিযুক্ত বাইনারি ফাংশন (এটি তার অপারেশনগুলিকে যুক্ত করে)। কিছুটা নোংরা: /যদি এর ডানদিকে আক্ষরিক স্ট্রিং দেওয়া হয় তবে বিভক্ত হবে।


5

পার্ল, 141 132 + 1 টি = 133 বাইট

Golfed

$s=new IO::Socket::INET LocalPort=><>,Listen=>5,Reuse=>1;{$c=$s->accept;$_=$c->peerhost;y/./+/;$c->send(eval.$/);shutdown $c,1;redo}

Ungolfed

# listen on tcp port obtained from stdin
$s=new IO::Socket::INET(LocalPort=> <>,
                        Listen   => 5,
                        Reuse    => 1);

{
    # accept connection
    $c=$s->accept();

    # get the ip address
    $_=$c->peerhost();

    # replace dots with plus
    y/./+/;

    # send the evaluated version back, with a newline
    $c->send(eval . $/);

    # close
    shutdown($c,1);

    redo;
}

উদাহরণ

$ echo 7777|perl -MIO::Socket::INET -e'$s=new IO::Socket::INET LocalPort=><>,Listen=>5,Reuse=>1;{$c=$s->accept;$_=$c->peerhost;y/./+/;$c->send(eval.$/);shutdown $c,1;redo}'

$ telnet 127.0.0.1 7777
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
128
Connection closed by foreign host.
$

আপনি কি নিশ্চিত যে এটি সঠিক? আমি সার্ভারের টার্মিনালে মুদ্রিত সমষ্টি পাই, ক্লায়েন্টের নয়। যাই হোক, আপনি সব প্রথম বন্ধনী এবং পরিবর্তন অপসারণ করতে পারেন s/\./+/gy/./+/
manatwork

আহ, অপঠিত..আপনি সেই অনুযায়ী সংশোধন করবেন এবং আপনার ভাল y / পরামর্শ অন্তর্ভুক্ত করবেন।
স্টিভ

1
while(1){…}{…;redo}অনুযায়ী user130144 এর মহান টিপ । এবং ->send()কল ব্যতীত , অন্যান্য সমস্ত প্রথম বন্ধনী অপ্রয়োজনীয়।
manatwork

4

পাইথন 2, 180 বাইট

from SocketServer import*
TCPServer(('',input()),type('',(BaseRequestHandler,set),{'handle':lambda s:s.request.send(`eval(s.client_address[0].replace('.','+'))`)})).serve_forever()

স্টিনের উপর দিয়ে বন্দর নিয়ে যায়।


4

নোডজেএস (ইএস 6), 129 118 107 বাইট

require('net').createServer(c=>c.end(eval(c.remoteAddress.replace(/\./g,'+'))+`
`)).listen(process.argv[2])

আইপিভি 4 এর জন্য কাজ করে। হিসাবে চালানnode server.js <port>


আসলে সার্ভারের আইপিভি 6 ব্যবহার করা যদি কাজ করে না (উদাহরণস্বরূপ, খনিটি স্বয়ংক্রিয়ভাবে করে), c.remoteAddressতখন থেকে ::ffff:127.0.0.1। (আমি নোড v5.9.1 এ পরীক্ষা করেছি)।
ফ্রেক্সস্ট্রেম

এছাড়াও, আপনার পেছনের নতুন লাইন নেই, যা আপনার স্কোর 2 বাইট বাড়িয়ে তুলবে।
ফ্রেক্সস্ট্রেম

@ ফ্র্যাক্সট্রেম ওফস, সেই নতুন লাইনটি ভুলে গেছেন। টেম্পলেট স্ট্রিংয়ের জন্য ধন্যবাদ যদিও শুধুমাত্র 1 বাইট যুক্ত করা হয়েছে। আইপি পরিবার সম্পর্কিত: .listen()প্রথমে আইপিভি 4-তে ডিফল্ট হিসাবে ব্যবহৃত হয় তবে এটি বাগ বা ডিজাইনের মাধ্যমে মনে হয় এটি পরিবর্তিত হয়েছে। হোস্ট মেশিনে আইপিভি 6 অক্ষম করা হলে নোডের নতুন সংস্করণগুলিতে জমাটি এখনও সঠিকভাবে কাজ করবে।
Mwr247

4

যান, 211 বাইট

package main
import(."fmt"
."net"
"os")
func main(){s,_:=Listen("tcp4",":"+os.Args[1])
for{c,_:=s.Accept()
var a,b,d,e int
Sscanf(Sprint(c.RemoteAddr()),"%d.%d.%d.%d",&a,&b,&d,&e)
Fprintln(c,a+b+d+e)
c.Close()}}

সম্ভবত আরও গল্ফ করা যেতে পারে, উদাহরণস্বরূপ আমি যেভাবে আইপি অ্যাড্রেসটি পার্স করতে পেরেছি তার সাথে আমি পুরোপুরি সন্তুষ্ট নই, এটি দেখতে ভয়ঙ্কর হ্যাকের মতো দেখাচ্ছে।

আর্গুমেন্ট হিসাবে দেওয়া বন্দরে আইপিভি 4 এ তালিকান।


4

পাওয়ারশেল, 208 206 192 152 বাইট

($t=[net.sockets.tcplistener]$args[0]).start();for(){($z=$t.acceptsocket()).sen‌d([char[]]"$($z.remoteendpoint.address-replace"\.","+"|iex)");$z.close()}

সংস্করণ সংক্রান্ত তথ্য:

Name                           Value
----                           -----
PSVersion                      4.0
WSManStackVersion              3.0
SerializationVersion           1.1.0.1
CLRVersion                     4.0.30319.34209
BuildVersion                   6.3.9600.17400
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0}
PSRemotingProtocolVersion      2.2

আমাকে 14 বাইট সংরক্ষণ করার জন্য টিমমিডকে ধন্যবাদ!

আমাকে 40 বাইট বাঁচানোর জন্য টেসেল্লাটিংহেকলারের কাছে প্রচুর ধন্যবাদ


@ টিমিমিডি আহ উফস আমি মিস করেছি যে এটি প্রয়োজনীয় ছিল ... এখনই ঠিক করা হয়েছে
নচট

প্রোগ্রামগুলি ইনপুট নেওয়ার জন্য যেভাবে অনুমতি দেওয়া হয় তার একটি হ'ল স্টিডিন। আমি মনে করি এই নির্দিষ্ট প্রশ্নটি অনুমোদিত হিসাবে এটি নির্দিষ্ট করে না তবে এটি একটি সাধারণ কোড-গল্ফ জিনিস যা আমার মনে হয় পাওয়ারশেলের জন্য গণনা করা উচিত। দুর্ভাগ্যক্রমে এটি বাশ থেকে আলাদা যে এটি স্টিডিনে ইনপুটটির জন্য অপেক্ষা করে না যদি কোনও সরবরাহ না করা থাকে।
নচট

যথেষ্ট ন্যায্য। আবার ঠিক করা হয়েছে
নট

ঠিক আছে, এখন কিছু গল্ফের জন্য - 192 এ নিম্নলিখিতটি চেষ্টা করুন -($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()}
অ্যাডমবর্কবার্ক

1
আমার মনে হয় আপনি এটিকে 152 এ ছুঁড়ে ফেলতে পারেন - নতুন-অবজেক্টটি ফেলে দিন এবং সরাসরি castালাই করুন, বাইট অ্যারে রূপান্তরটি এড়িয়ে একটি স্ট্রিং ভিন্নভাবে করুন, $ x সংরক্ষণ করবেন না এবং পাঠানোর জন্য বাকী প্যারামিটারগুলি ফেলে দিন) এবং এটি হয়ে যায় ($t=[net.sockets.tcplistener]$args[0]).start();for(){($z=$t.acceptsocket()).send([char[]]"$($z.remoteendpoint.address-replace"\.","+"|iex)");$z.close()}- যা আমি কেবল নেটকাট সংযোগের সাথে দ্রুত পরীক্ষা করেছি, তবে এটি একইরকম মনে হয় - যেভাবে স্থানীয় লোকাল থেকে সংযোগ স্থাপন করে।
টেসেল্ল্যাটিংহেকলার

4

8086 মেশিন কোড (16-বিট ডস), 163 156 148 148 142 বাইট

00000000  31 c0 bb 0a 00 31 c9 be  81 00 bf 80 00 8a 0d 01  |1....1..........|
00000010  cf 46 8a 0c 80 e9 30 f7  e3 00 c8 39 fe 72 f2 89  |.F....0....9.r..|
00000020  c3 89 c1 b8 01 10 ba ff  ff 31 f6 31 ff cd 61 53  |.........1.1..aS|
00000030  b8 00 12 bf 80 00 b9 01  00 ba ff ff cd 61 b8 00  |.............a..|
00000040  14 cd 61 31 c0 bb 0a 00  83 c7 06 8d 4d 04 26 02  |..a1........M.&.|
00000050  05 80 d4 00 47 39 cf 72  f5 bf 84 00 b9 80 00 bb  |....G9.r........|
00000060  0a 00 4f 31 d2 f7 f3 80  c2 30 88 15 39 cf 77 f2  |..O1.....0..9.w.|
00000070  1e 07 b8 0e 13 5b bf 80  00 b9 04 00 ba ff ff cd  |.....[..........|
00000080  61 b8 00 11 ba 01 00 cd  61 b8 00 4c cd 21        |a.......a..L.!|
0000008e

সমমানের সমাবেশ কোড:

org 0x100
tcp equ 0x61    ; NTCPDRV interrupt

    xor ax,ax
    mov bx,10
    xor cx,cx
    mov si,0x81     ; [ds:81]-[ds:FF] = command line args
    mov di,0x80     ; [ds:80] = strlen(args)
    mov cl,[di]
    add di,cx

@@: inc si
    mov cl,[si]     ; get character
    sub cl,'0'      ; convert char to int
    mul bx          ; ax *= 10
    add al,cl
    cmp si,di
    jb @b
    ; now ax = port number

    mov bx,ax       ; source port (leaving this 0 doesn't work?)
    mov cx,ax       ; dest port
    mov ax,0x1001   ; open TCP socket for listening
    mov dx,-1       ; infinite timeout
    xor si,si       ; any dest IP
    xor di,di
    int tcp
    ; ^ I think this call should block until a connection is established, but apparently it doesn't.

    push bx         ; bx = socket handle, save it for later

    mov ax,0x1200   ; read from socket
    mov di,0x80     ; es:di = buffer (just reuse argument area to save space)
    mov cx,1        ; one byte
    mov dx,-1
    int tcp         ; this will block until a client connects and sends one byte

    mov ax,0x1400   ; get TCP session status, bx=handle
    int tcp
    ; now es:di points to a struct containing the source/dest IP addresses and ports
    ; the docs say it's two dwords for each IP address, then two bytes for "ip_prot" and "active" (whatever that means)
    ; ...but actually each IP address is followed by the port number (one word)

    xor ax,ax
    mov bx,10
    add di,6        ; [es:di+6] = client IP
    lea cx,[di+4]
@@: add al,[es:di]  ; add all bytes together
    adc ah,0
    inc di
    cmp di,cx
    jb @b
    ; now ax contains the IP address sum

    mov di,0x84     ; recycle arguments area again
    mov cx,0x80
    mov bx,10
@@: dec di
    xor dx,dx
    div bx          ; dl = ax mod 10
    add dl,'0'      ; convert int to char
    mov [di],dl
    cmp di,cx
    ja @b
    ; now [ds:80]-[ds:83] contains an ascii representation of the IP address sum

    push ds
    pop es
    mov ax,0x130e   ; send data with newline, wait for ack
    pop bx          ; socket handle
    mov di,0x80     ; es:di = data
    mov cx,4        ; sizeof data
    mov dx,-1
    int tcp

    mov ax,0x1100   ; close TCP socket
    mov dx,1
    int tcp

    mov ax,0x4c00
    int 0x21

এটি ধরে নেওয়া ntcpdrvহয় INT 0x61(এবং কোনও উপযুক্ত প্যাকেট ড্রাইভার 0x60) এ লোড করা হয় । সঙ্গে সংকলন fasm tcpserv.asm

যদিও এর কিছু সমস্যা রয়েছে:

  • এটি আর্গুমেন্টটি একটি বৈধ পোর্ট নম্বর কিনা তা যাচাই করে না, বা এটি আদৌ কোনও সংখ্যা কিনা।
  • ক্লায়েন্টকে অবশ্যই কমপক্ষে একটি বাইট প্রেরণ করতে হবে, যেহেতু কোনও ক্লায়েন্ট সংযুক্ত আছে কিনা তা বলার মতো অন্য কোনও উপায় আমি খুঁজে পাচ্ছি না।
  • এটি কেবল একবারে কাজ করে এবং দ্বিতীয় প্রচেষ্টাতে স্তব্ধ হয়ে যায়। পুনরায় বুট করার পরে আবার কাজ করে।
  • ফিরে আসা মানটি শূন্যের সাথে বাম-প্যাডযুক্ত।
  • এটি আমার প্রথম কোড গল্ফ এন্ট্রি, এবং আমার প্রথম 8086 এএসএম প্রোগ্রাম। আমি নিশ্চিত এটি আরও উন্নত করার উপায় আছে।

1
আপনি কেবল 148 বাইটের জন্য সংকলিত আউটপুটটির একটি হ্যাক্সডাম্প পোস্ট করতে পারেন
বিড়াল

এটা কি অনুমোদিত? এটি এই এন্ট্রিটিকে আরও কিছুটা প্রতিযোগিতামূলক করে
তুলবে

1
ঠিক আছে, আমি মেশিন কোড এন্ট্রি পরিবর্তন করেছি। xor r,rপরিবর্তে ব্যবহার করে আরও কয়েকটি বাইট শেভ করে mov r,0
ব্যবহারকারী5434231

1
আমি এটি একটি ডস মেশিনে লিখেছি যেখানে নিউলাইনগুলি রয়েছে CR LF, তাই আমি কেবল এটি নিয়ে গিয়েছিলাম। যেভাবেই এখন এএসএম আকারটি গণনা করা অর্থহীন, পাশাপাশি এটি কিছুটা পরিষ্কার করে কিছু মন্তব্য যুক্ত করতে পারে।
ব্যবহারকারী5434231

1
এখানেও এটি হওয়ার কথা, এবং এটি কাজ করে; int 0x61এলোমেলো একটি স্থানীয় বন্দর ফিরে আসে ax। তবে এটি শ্রোতা 4.2.0.0
আইপিটিকে

3

হাস্কেল, 216 বাইট

"নেটওয়ার্ক-সরল" প্যাকেজ ( cabal install network-simple) ব্যবহার করা হচ্ছে। -XOverloadedStrings -XNoMonomorphismRestrictionকাজের জন্য কয়েকটি ভাষা বর্ধনের প্রয়োজন ( )।

import Network.Simple.TCP(serve)
import Network.Socket
import Data.Bits
main=getLine>>= \n->serve"*"n p
p(s,(SockAddrInet _ h))=()<$(send s$(show$sum$w h 24)++"\n")
m=255
w h 0=[h.&.m]
w h n=h`shiftR`n.&.m:(w h$n-8)

wতালিকার চেয়ে সরাসরি যোগফল ফাংশন পরিবর্তন করা এবং একটি প্রোগ্রামের পরিবর্তে কোনও ফাংশন ব্যবহার করা যাতে পোর্ট নম্বরটি আর্গুমেন্ট হিসাবে নির্দিষ্ট করা যায় সেজন্য কয়েকটি সম্ভাব্য সরলকরণ রয়েছে । যদিও আমি ধারণা করি না যে এটি আকারটি খুব কমিয়ে ফেলবে, যদিও। 20 বাইট সম্ভবত?


নিস! খুব নিশ্চিত যে আপনি এখনও নাম পরিবর্তন করে কয়েকটি বাইট ছাঁটাই wকরতে পারেন #, তাই ব্যবহারের জন্য 2 বাইটের সঞ্চয় w h nহয়ে যায় h#n
অভিনেতা ক্লাভিলিস

3

মাম্পস, 114 115 বাইট

Golfed:

R P F{S J=0,I="|TCP|1" O I:(:P) U I R K F K=1:1:4{S J=J+$P(##class(%SYSTEM.TCPDevice).PeerAddr(),".",K)} W J,! C I}

Ungolfed:

R P             ; Read Port # from STDIN ;
  F{            ; Loop over everything;
  S J=0,        ; Initial IP segment total
  I="|TCP|1"    ; TCP device
  O I:(:P)      ; Open the TCP device, port from input {and sticking a tongue out! :-) }
  U I           ; Use the TCP device
  R K           ; Read from STDIN (anything)
  F K=1:1:4{    ; Iterate 1->4 in variable K
    S J=J+      ; Accumulate the following segments of the IP in var. J
    $P(##class(%SYSTEM.TCPDevice).PeerAddr(),".",K) ; Grab each piece of IPv4.
            }   ; close the loop.
  W J,!         ; Write the total w/newline out the TCP port 
  C I           ; close the TCP port to send.
}               ; end final loop

এটি মাম্পসের ইন্টারসিস্টেমস কাচি সংস্করণ - যদি সেখানে কোনও সংস্করণ থাকে যা টিসিপি ঠিকানাটি সংক্ষিপ্ত করে তুলতে পারে ##class(%SYSTEM.TCPDevice).PeerAddr() (এটি পুরো প্রোগ্রামের প্রায় 1/3 অংশ) এটি ইতিমধ্যে পোস্ট করা অন্য কয়েকটি ভাষার বিরুদ্ধে আরও ভাল সুযোগ থাকতে পারে ... ;-)

সম্পাদনা: @ টিমমিডকে ধন্যবাদ - হার্ডডকড হওয়ার পরিবর্তে এসটিডিইএন বা যুক্তি থেকে পোর্টটি পড়তে আমি মিস করেছি। সম্পাদিত; এটি প্রোগ্রামে 1 বাইট যুক্ত করেছে।


@ টিমিডি - আহ, আপনি ঠিক বলেছেন প্রয়োজনীয়তা পড়ার পরে মিস করেছেন। পোস্টস্টেস্ট সম্পাদনা করবে।
zmerch

3

সি, 535 বাইট

ঠিক আছে, কাউকে এটি করতে হয়েছিল।

আমি একটি একক লাইন বিরতি যুক্ত করেছি যাতে পোস্ট কোডটিতে 536 টি অক্ষর থাকে।

#include <stdio.h>
#include <netdb.h>
#include <netinet/in.h>
#include <string.h>
int main(int c,char**v){int f,l;char b[99];struct sockaddr_in d,e;f=socket(AF_INET,SOCK_STREAM,0);bzero(&d,sizeof(d));d.sin_family=AF_INET;d.sin_addr.s_addr=INADDR_ANY;d.sin_port=htons(atoi(v[1]));bind(f,&d, sizeof(d));listen(f,5);l=sizeof(e);
f=accept(f,&e,&l);bzero(b,99);int p,q,r,s;char g[INET_ADDRSTRLEN];inet_ntop(AF_INET,&(e.sin_addr),g,INET_ADDRSTRLEN);sscanf(g,"%d.%d.%d.%d",&p,&q,&r,&s);sprintf(b,"%d\n",p+q+r+s);write(f,b,strlen(b));return 0;}

সঙ্গে সংকলন gcc [file_name] -o server

সাথে চালানো ./server [port]

সম্পর্কিত telnet localhost [port]


3
চমৎকার উত্তর! পূর্বে উল্লিখিত হিসাবে , আপনি কিছু ধ্রুবকের জন্য বাস্তব মূল্য ব্যবহার করে কিছু বাইট সংরক্ষণ করতে পারেন, যেমন এএফএনপেট এবং এসকলপিআরআইএম।
হ্যানস কারপিলা

2

জাভা, 210 বাইট

Golfed:

p->{java.net.ServerSocket x=new java.net.ServerSocket(p);for(;;){try(java.net.Socket s=x.accept()){byte[]b=s.getInetAddress().getAddress();s.getOutputStream().write((0+b[0]+b[1]+b[2]+b[3]+"\n").getBytes());}}};

সম্প্রসারিত:

@FunctionalInterface interface Consumer { // Define an interface that allows a function that throws an exception.
  void accept(int port) throws Exception;
}

Consumer consumer = (port) -> {
  java.net.ServerSocket serverSocket = new java.net.ServerSocket(port);
    for (;;) {
      try (java.net.Socket socket = serverSocket.accept()) {
        byte[] bytes = socket.getInetAddress().getAddress();
        socket.getOutputStream().write((0 + b[0] + b[1] + b[2] + b[3] + "\n").getBytes());
      }
    }
}

এটি অন্যান্য জাভা জবাবগুলিতে আমি দেওয়া সমস্ত টিপসের সমাহার, পুরো প্রোগ্রামের পরিবর্তে ফাংশন হিসাবে লেখা, যা প্রোগ্রামের তুলনায় প্রায় 70 বাইট লাভ করে।


2

হাস্কেল, 326 বাইট

import Data.Bits
import Network.Socket
import System.IO
f n=withSocketsDo$do
 s<-socket AF_INET Stream defaultProtocol
 bind s$SockAddrInet n iNADDR_ANY
 listen s 1
 g s
g s=do
 (z,SockAddrInet _ a)<-accept s
 h<-socketToHandle z WriteMode
 hPutStrLn h$show$b a
 hClose h
 g s
b 0=0
b x=x.&.0xFF+b(x`shiftR`8)

দুঃখজনকভাবে আমাকে Network.Socketস্ট্রিংয়ের পরিবর্তে একটি পূর্ণসংখ্যার হিসাবে দূরবর্তী আইপি ঠিকানায় অ্যাক্সেস পেতে ব্যবহার করতে হয়েছিল। এটা তোলে অক্ষর কয়েক ডজন সংরক্ষণ করেছেন তাহলে আমি শুধু করতে পারে s <- listenOn (PortNumber n)বরং স্পষ্টভাবে কল থাকার চেয়ে socket, bindএবং listenস্বতন্ত্রভাবে। তবে, দুঃখের বিষয়, Network.acceptআমাকে একটি হোস্ট স্ট্রিং দেয় , কোনও আইপি অ্যাড্রেস পূর্ণসংখ্যা নয় , তাই আমাকে Network.Socket.acceptএবং বন্ধুদের অবলম্বন করতে হয়েছিল ।

ফাংশনটি fএকটি পোর্ট নম্বরটি আর্গুমেন্ট হিসাবে গ্রহণ করে এবং সেই পোর্টটিতে একটি সার্ভার সকেট তৈরি করে ( s)। এটি gসার্ভার সকেট সহ ফাংশন কল করে । gচিরকালের জন্য লুপস, সংযোগ গ্রহণ করে। ফাংশনটি bএকটি আসল আইপিভি 4 ঠিকানা নেয় এবং তার অঙ্কগুলির যোগফলকে গণনা করে।

আমি নিশ্চিত যে আমার চেয়ে কোথাও কেউ এটি করতে পারে। আমি হাস্কেলের মধ্যে কীভাবে নির্বিচারে সহজ সকেট স্টাফ হয় তা দেখাতে চেয়েছিলাম ... তবে তাত্ক্ষণিকভাবে ব্যর্থ হয়েছিল, কারণ আইপি ঠিকানায় আমার অ্যাক্সেস দরকার যা সাধারণত পাওয়া সহজ হয় না।


"নেটওয়ার্ক-সিম্পল" প্যাকেজটি একটি খুব ভাল ইন্টারফেস সরবরাহ করে যা আপনার দেওয়া কোনও ফাংশনে সোকএড্রারকে দেয় যা জিনিসগুলিকে সহজ করে তোলে। আমার সমাধানটি যা আমি পোস্ট করতে চলেছি তা দেখুন ...
জুলস

কয়েকটি সরলকরণ সুস্পষ্ট: (1) আমি বিশ্বাস করি withSocketsDoউইন্ডোজে কেবল প্রয়োজনীয়, সুতরাং লিনাক্সে চললে এটি উপেক্ষা করা যেতে পারে; (2) 0xFF 255 এর চেয়ে দীর্ঘ অক্ষর; (3) সকেটটিকে একটি হ্যান্ডলে রূপান্তর করা এবং নিয়মিত আইও ব্যবহার করা ব্যবহারের চেয়ে অনেক বেশি দীর্ঘ Network.Socket.send। হ্যাঁ, sendহ্রাস করা হয়েছে, তবে কারণটি এই দৃশ্যের সাথে প্রাসঙ্গিক নয় (এটি কেবল অ-এসকিআইআই পাঠ্য বা বাইনারি ডেটার সাথে সম্পর্কিত), সুতরাং এটি ব্যবহার করা যুক্তিসঙ্গত বলে মনে হয়।
জুলে

Network.accept gives me a host string, not an IP address integerআপনি কি কেবল আইপি স্ট্রিংকে বিভক্ত করতে পারবেন না ".", mapহাস্কেলের স্ট্রিং-টু-নম্বর ফাংশনকে বিভক্ত স্ট্রিংয়ের উপর দিয়ে ফলাফলগুলি যোগ করতে পারেন?
বিড়াল

2

অ্যাপ্লিকেশন Lua, 169 162 160 153 151 148 138 129 বাইট

গল্ফ সংস্করণ

m=require"socket".bind(0,...)::l::c=m:accept()f=0 for n in c:getpeername():gmatch"%d+"do f=f+n end c:send(f.."\n")c:close()goto l

এটির জন্য লুয়াসকেট ইনস্টল হওয়া এবং একটি দোভাষী যা লেবেলগুলিকে সমর্থন করে requires আমি এটি লুয়াজিটের সাথে পরীক্ষা করেছি এবং আমি এটিও নিশ্চিত করতে পারি যে কোড লুয়া 5.1 এর সাথে কাজ করে না।

উদার সংস্করণ

m=require"socket".bind(0,...)
::l::
c=m:accept()

f=0
for n in c:getpeername():gmatch"%d+" do
    f=f+n
end
c:send(f.."\n")

c:close()
goto l

সম্পাদনা 1:

ন্যায়বিচারে পরিবর্তন i=({c:getpeername()})[1]হয়েছেi=c:getpeername()

সম্পাদনা 2:

প্রয়োজনীয় বিবৃতি থেকে বন্ধনীগুলি সরানো হয়েছে।

3 সম্পাদনা করুন:

ভারার্গের চারপাশে বন্ধনীগুলি সরিয়ে নিয়েছে, বাইট গণনাটি কিছুটা কমিয়েছে।

সম্পাদনা 4:

"বায়ার দ্বারা সংক্ষিপ্ত,"% d + "এর আশেপাশে প্রথম বন্ধনী সরানো হয়েছে।

5 সম্পাদনা করুন:

অপ্রয়োজনীয় ভেরিয়েবল সরানো i।

6 সম্পাদনা করুন:

আইপি "127.0.0.1" থেকে 0 এ পরিবর্তিত হয়েছে (# লুয়ায় জাইজির জন্য ধন্যবাদ)

7 সম্পাদনা করুন:

স্ট্রিংগুলি স্বয়ংক্রিয়ভাবে সংখ্যায় কাস্ট করা হওয়ায় আজকের ফাংশন কলটি সরিয়ে ফেলা হয়েছে (পরামর্শের জন্য ট্রেবুচেটিকে ধন্যবাদ, আমি এটি জানতাম না)


1
আপনি যদি কৌতূহলী হন তবে কেবল লুয়া 5.2 এবং আপ সমর্থন লেবেলগুলি
ট্রেবুচেট

1
এছাড়াও, লুয়া স্বয়ংক্রিয়ভাবে +অপারেটরের সাথে সংখ্যায় স্ট্রিং কাস্ট করে , যাতে আপনি এটি বের করতে পারেন tonumber
ট্রেবুচেট

2

হাস্কেল, 185 (+ 19 = 204)? বাইট

import Network.Simple.TCP(serve)
import Network.Socket
import Data.List.Split
main=getLine>>=flip(serve"*4")(\(a,b)->()<$(send a$(++"\n")$show$sum.map read.take 4.sepByOneOf":."$show b)

স্টিডিনে একটি লাইন হিসাবে পোর্ট নম্বর নেয়; network-simpleক্যাবল থেকে প্রয়োজন ।

যথারীতি হাস্কেল জবাব দিয়েছিল যা খাঁটি ফাংশনে নিজেকে সীমাবদ্ধ করে না, importsঅনেক বেশি বাইট নেয় by পেছনের নতুন লাইনটি 9 বাইটেরও মূল্যবান ...

@ জুলসের উত্তরের সাথে কিছুটা মিল, তবে আমি বাইট ক্রিয়াকলাপের পরিবর্তে স্ট্রিং ম্যানিপুলেশন ব্যবহার করি। আমি চুরি করে ব্যবহার করা -XOverloadedStringsএক্সটেনশান হিসাবে ভাল, সম্ভবত 19 বাইট মূল্য তারও চেয়ে বেশী।


2

সি, 243 188 বাইট (বা সম্ভবত 217 162 বাইট)

ভি 2: ব্যাখ্যাগুলির জন্য নীচে দেখুন।

188 বাইট:

s;main(g,v)char**v;{short S[8]={2,htons(atoi(v[1]))};char C[g=16];bind(s=socket(2,1,0),&S,g);for(listen(s,8);g=fdopen(accept(s,&C,&g),"w");fclose(g))fprintf(g,"%d\n",C[4]+C[5]+C[6]+C[7]);}

খানিকটা 162 বাইট নিরস্ত করুন:

s;main(g){short S[8]={2,g};char C[g=16];bind(s=socket(2,1,0),&S,g);for(listen(s,8);g=fdopen(accept(s,&C,&g),"w");fclose(g))fprintf(g,"%d\n",C[4]+C[5]+C[6]+C[7]);}

সম্ভবত আগামীকাল সকালে আরও গল্ফিং সম্ভব। এই আপডেটগুলির পরে আমি এই পোস্টটি পরিস্কার করব।


V1 থেকে:

গল্ফ করতে এই সত্যিই বেশ মজা ছিল।

#include<netdb.h>
s,c,q;main(g,v)char**v;{struct sockaddr_in S={2,htons(atoi(v[1]))},C;bind(s=socket(2,1,0),&S,g=16);for(listen(s,8);c=accept(s,&C,&g);q=fclose(g)){for(g=4;g;q+=C.sin_addr.s_addr>>8*--g&255);fprintf(g=fdopen(c,"w"),"%d\n",q);}}

এটি আইপিভি 4 এর জন্য কাজ করে। বেশিরভাগ ক্ষেত্রে এটি একটি সরল বাস্তবায়ন। তিনটি প্রধান উপাদান হয়

সকেট তৈরি করা হচ্ছে:

@ sockaddr_in S = {2, htons (atoi (v [1]))}, C; বাইন্ড (s = সকেট (2,1,0), & এস, জি = 16);

আমরা কনস্ট্যান্টস এএএনপিএনইটি ইত্যাদি ইত্যাদির বিভিন্ন স্পষ্ট রূপ ব্যবহার করি এবং সত্যটি ব্যবহার করি যে যখন কোনও কাঠামো সিতে এভাবে শুরু করা হয় তখন নির্ধারিত উপাদানগুলি শূন্যে সেট করা থাকে।

ক্লায়েন্টদের জন্য শুনুন, তাদের গ্রহণ করুন এবং তাদের সংযোগগুলি বন্ধ করুন:

জন্য (শুনতে (গুলি, 8); গ = গ্রহণ (গুলি, সি, & ছ); কুই = fclose সাথে (ছ))

শেষ পর্যন্ত প্রতিটি ক্লায়েন্টকে ডেটা প্রেরণ করতে:

জন্য (ছ = 4; ছ; কুই + + = C.sin_addr.s_addr >> 8 * - জি ও 255); fprintf (ছ = fdopen (C, "W"), "% d টি \ N", কুই);

আইপি C.sin_addr.s_addr32 বিট সংখ্যার হিসাবে সংরক্ষণ করা হয় যেখানে প্রতিটি অক্টেট চারটি বাইটের মধ্যে একটির দ্বারা প্রতিনিধিত্ব করা হয়। আমরা এই বাইটগুলি লুপের সাথে সংযুক্ত করি এবং তারপরে এফপ্রিন্টফ ব্যবহার করে প্রবাহে মুদ্রণ করি।

আমার একটি সংক্ষিপ্ত 217 বাইট সমাধান রয়েছে তবে আমি পুরোপুরি নিশ্চিত নই যে এটি স্ট্যান্ডার্ড লুফোলগুলি লঙ্ঘন করে না কারণ এটির প্রয়োজন বন্দরটি কমান্ড লাইন আর্গুমেন্ট হিসাবে নেটওয়ার্ক বাইট ক্রমে অবিচ্ছিন্নভাবে দেওয়া হয়। যে, 12345 পোর্টে সার্ভারটি চালানোর জন্য একটি কল করতে হবে

$ ./tcp 1 1 1 1 ... 1 1 1

যেখানে মোট 1s এর সংখ্যা 14640 the কমপক্ষে বলতে গেলে এটি একটু ... বোঝার মতো। তবে এখানে এটি যাইহোক:

#include<netdb.h>
s,c,q;main(g){struct sockaddr_in S={2,g},C;bind(s=socket(2,1,0),&S,g=16);for(listen(s,8);c=accept(s,&C,&g);q=fclose(g)){for(g=4;g;q+=C.sin_addr.s_addr>>8*--g&255);fprintf(g=fdopen(c,"w"),"%d\n",q);}}

2

র‌্যাকেট, 265 বাইট

#lang racket(define l(tcp-listen(string->number(read-line))))(let e()(define-values(i o)(tcp-accept l))(thread(λ()(define-values(a b)(tcp-addresses o))(write(~a(foldl + 0(map string->number(string-split a".")))o))(newline o)(close-output-port o)))(e)))

Ungolfed:

#lang racket
(define listener (tcp-listen (string->number (read-line))))
(define (mk-server)
  (let echo-server ()
    (define-values (in out) (tcp-accept listener))
    (thread
     (λ()
       (define-values (a b) (tcp-addresses out))
       (write (number->string (foldl + 0(map string->number(string-split a "."))) out))
       (write "\n" out)
       (close-output-port out)))
    (echo-server)))

2

ফ্যাক্টর, 155 146 131 206 190 বাইট

ভাল, আমি সবেমাত্র নিম্ন-স্তরের সকেট প্রোগ্রামিং সম্পর্কে অনেক কিছু শিখেছি। আমি মনে করি না আমি কখনো চাই আবার তা করতে কারণ আমার THR মাথা ব্যাথা।

[ utf8 <threaded-server> readln 10 base> >>insecure [ remote-address get host>> "." split [ 10 base> ] map sum 10 >base print flush ] >>handler [ start-server ] in-thread start-server drop ]

ওহ হ্যাঁ, থ্রেডেড, এবং ফিরে আসবে না, ঠিক আছে।


আপনি কি 10 base>পরিবর্তে ব্যবহার করতে পারেন string>number?
ফেডারেশন এস।

@fedes। বাহ, আমি জানি না যে এর অস্তিত্ব আছে। আমি মনে করি এটি আমার ফ্যাক্টর উত্তরগুলি অনেক ছোট করতে দেয়!
বিড়াল 18

এবং 10 >baseসংখ্যা> স্ট্রিংয়ের জন্যও।
ফেডারেশন এস।

1
@fedes। যারা এখানে একটি উত্তর প্রাপ্য : ডি
বিড়াল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.