ネットワークプログラミング相談室 Port30 [転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
主にソケットに関しての質疑応答スレッドです。
Programming UNIX Socket FAQ (日本語訳)
http://www.kt.rim.or.jp/~ksk/sock-faq/indexj.html
Winsock Programmer's FAQ (日本語訳)
http://www.kt.rim.or.jp/~ksk/wskfaq-ja/
関連リンクは>>2-10辺り
足りなかったら適当に付け足してね
前スレ
ネットワークプログラミング相談室 Port28
http://toro.2ch.net/test/read.cgi/tech/1334736934/
ネットワークプログラミング相談室 Port29
http://peace.2ch.net/test/read.cgi/tech/1351670708/
関連スレ
ネットワークプログラミング雑談
http://toro.2ch.net/test/read.cgi/tech/1235800707/ >>539
お前らが一人なのか何人なのか知らんが、
まともに代案を出して俺と技術で議論することすらできなかった時点で
お話にならないんだよ馬鹿がw >>540
お前の間違いが余りにも馬鹿すぎて一斉にツッコまれただけ >>540
とりあえず落ち着いて自分のレスを読み返してみろ TCP_NODELAY、PSHでくっつかなくなるとか一番やばいタイプの勘違い
狭い実験内ではそれでうまくいくように見えることもあるだろうが、だからこそヤバイ TCP_NODELAY も PSH もどっちかって言うとタイミングの指示だからねえ
しかも努力目標みたいなものだからそれに頼ったプログラミングとかあり得んわ >>494にはOSの指定が無い。突っ込み所漫才でした。 TCP/IPストリームに実データとして区切りを書き込まずに、
shutdownで1回分の送信の区切りを表現できるといいなぁと思ったんですけどね
(その後にcloseせずに負荷なくセッションを再構築できるっぽい書き込みだったので)
まあ無いってことですね
残念
それにしてもTCP_NODELAY使えはなかなか面白かったです
パケットが綺麗に順序よくrecvでき、割り込みも即座に解決できてる理想的な環境ならいけるかもしれませんね
私は遠慮しておきますが
16KB送信してきたのに対して、2KBでrecvしたりとか
パケットの並び替えが発生して1回のercvで2パケット分以上取得したりとか
問題ありすぎ TCP_NODELAYで1024バイトを2つsendして、そのあとのタイミングで
2048バイトで受信待ちをしたらどうなるか?
2048バイト1回で受信しきる実装はおそらくこの世にありません。
2048バイトでreadしても1024バイトが2回受信できます。
嘘だと思うなら試してみましょう。 TCP_NODELAYで、一発のsendで送ったものが2度以上のrecvに分かれるなんて普通に起こるんだが
ちなXP時代のWinsock
そんなに綺麗にいくんならネットワークプログラミングで苦労しないんだよなあ・・・ >>551
とりあえずWin10でwinsock2で
TCP_NODELAYかけたソケットに5バイトのsendを4回行って
recv1024バイトで受け止めたら一発で20バイトとれたぞ
お前がいるのはあの世か?
というか一発でとれなかったらTCPの受信効率悪すぎてヤバイから実験するまでもないことなんだがな・・・ >>551
とりあえず>>517を理解することから始めろ struct sockaddr* を引数にするライブラリを書いているんだけど
どうせみんな struct sockaddr_storage に保存するんだし
もういっそライブラリ内での引数は全部 struct sockaddr_storage* にしてもいいよな
対外的なところだけ struct sockaddr* にするわ 単純にsocketを使ってTCP/lPでクライアントとサーバーで通信するプログラムをLinuxのC言語で作っています。
ただsocketはノンブロッキングに設定しています。
クライアントはconnectを呼んだ後に正常にサーバーと繋がったか知りたくてselectを呼んでいますが、待ち状態からリターンしてきません。
サーバー側はacceptしており、その後に試しにクライアントへデータを送るとselectがリターンしてくるので、確実にsyn ackはクライアントへ返っていると思います。
selectはサーバーからのsyn ackでは待ち状態は解除されないのでしょうか。
やりたいことはconnectではサーバー応答を待たないで即リターンし、コネクションが確立できたかの結果は別途知りたい。
ググるといくつかのサイトでsocketをノンブロッキングに設定して、connectをコールした後にselectで待つサンプルがありました。
それを真似たのですが、サーバー側はconnec待ちの状態で、クライアントがconnectコール後にselectをコールしてもselectはリターンしてこない。
こうすれば出来る、あるいはそんなこと出来ないなどありましたらご教授お願いします。 select呼んでるのに待ちが発生とか
なんかやらかしてる connectがEINPROGRESSになった後、本当にエラーになってるんじゃないか?
selectに回す前にMSG_PEEKでrecvするといいよ。エラーならrecvのエラーで
取得できる。 select(2) 第3引数を NULL でやってたり? >>570
何言ってるかわからん。きちんと説明できない馬鹿なの? >>579
横からだけど>>570ってかなり分かりやすいと思うんだけど
とりあえずクライアント側でメッセージの取りこぼしが無いかどうか見直してみたら 横からだけど「パケットをダンプ」が出来ないんだろう >>570さん自演はやめてください。みっともないですよ。 "!"!"!MOHYO!"!"!"2"
1.[[[HUn≒MUL=POSI≠MAHO+Set*HUGE=SAGE=LOGE=NOISIA=0≒1]]]
2-[[[[[[[E=RAT%2^10%SPELAn!%]&!TOWA&!PEG#!NOLNOL8!#!HYAGO!2#]1*2=1]U]S]0]O]!#PAL!
3--->PAGODOL7&!@17,2222734.15&[[[%%RENRAK6,9,99"^10"]#$11.2%}]KAIJ]{
41.2SSS = RALQI2.β{{{RA4,0,238^97,1,$.S.L.E.I.L."Q5352.15Q"JOL"5*3>>>41.3q}}}>1.2<0
.3φTALHOSI"0">>>105.10<1.235<1.2>51≠52===55.632>V="E=0.835"of"1.32","632",0.683,1.end
{ 本当におかしくなったようだ。
>>570程度のことが理解できなくて、悔しいんだろうなあ。 ☆ 日本の、改憲を行いましょう。現在、衆議員と参議院の
両院で、改憲議員が3分の2を超えております。
『憲法改正国民投票法』、でググってみてください。国会の発議は
すでに可能です。平和は勝ち取るものです。お願い致します。☆☆ 諸先輩型、お知恵拝借したく…。
IE11で動かすJavaScriptから、同じPC上のQt5アプリケーションのQlocalServerにメッセージを送りたいのです。
JavaScriptにはどのような実装をすればよいでしょうか?
制限として、Node.jsはインストールできません。それ以外のJavaScriptのライブラリであれば可です。(ただし、HTMLのheadで読み込めるライブラリに限ります。) >>590
590です。
自己解決しました。
IE11上ではJavaScriptのWebsocketは使用できないと思い込んでいたのですが、使用できることに気付き、解決できました。
※IE9互換を強制していたのが原因でした(汗
大変お騒がせしました。 8バイトしかデータを送らない時に着信するまでに20秒くらいかかるのは
Nagleアルゴリズムのせいだと思ってTCP_NODELAYを設定したのだけど
改善しませんでした。OSはLinux4.15.15です
int flag = 1;
::setsockopt( sd, IPPROTO_TCP, TCP_NODELAY, &flag, (socklen_t)sizeof(flag) );
のような書き方をしているのですがフラグを指定するだけでNagleアルゴリズムを
抑制できるのでしょうか? TCP_NODELAY以前になんかおかしいと思う。
きっと別の理由だよ。 >>595
まずWireSharkとかでパケットがちゃんとでてるかから見てみよう >>595
20秒かかるならまずは名前解決を疑ってみろよ
resolv.confを窓から投げ捨てろ >>596
有難う、別の理由っぽいですけどまだ特定できていません
>>598
wiresharkの使い方が分からずまだよく分かっていない状態です
一応通信しようとした時にパケットは出ているような
>>601
特定の部分を通った時に起こる現象のようで、全て20秒かかるわけではないです
プログラム内部でIPとポートも取れていますので名前解決ではなさそうです
特定の部分というのも殆ど何もしていないような感じなのでよくわからない状態です selectの使い方がおかしくて、他のイベントひろうまで受信していないように
みえているんじゃないのかな。 そういや、Linuxならwireshrak使うまでもなくtcpdumpでよかろう。 >>608
自前プログラムを2つ作ってloでつなげています
Libev++を使っているのですが、その使い方が悪いのかも知れません
AとBのプログラムがあるとしてBがAに接続した時にそれぞれのプログラムで
Libev++のコールバックをev:READで仕掛けています
何か通信する時は横から開始する合図をコマンドみたいな形で送っています
お互いに送信するだけなら問題ないのですが、送受信した後短い通信をすると
20秒位反応しなくなるようです
連続して送受信しても症状が出ないし、症状が出ても待っていれば通信は完了するようです
長文失礼しました まずどこで20秒掛かってるか調べたの?straceですぐ分かるでしょ 不足してるのはどの知識でしょうか?
理論、仕様、実装、デバッグ 質問なんですが、
TCP の TIME_WAIT 状態のポートを回収する待ち時間が120秒の環境(os)で、
10秒毎に curl コマンドなどを動かす
↓
TIME_WAIT 状態のポートが増えていって最終的にはポート番号が枯渇し、
(connectで待たされて)120 秒に1度しかリクエストが実行されない、
という理解はあっていますでしょうか?
それとも足りなくなった段階で古い方から一度に沢山解放される? やってみればいいじゃない。
なんで最近の子は手を動かさないのかね。 いやそれが3秒に2回くらいcurlでファイル取ってくる処理をずっと動かしてても枯渇する様子がなくって
どうなってるのかな、と。
カーネルソース読めとか言われそうだが 実装依存をわかっていてなぜ聞くのか、めんどくせー奴 リソースの見方が分からないという質問かな、誰か教えてやれ Linuxだと枯渇するよ。
net.ipv4.ip_local_port_range
net.ipv4.tcp_tw_recycle
net.ipv4.tcp_fin_timeout
あたりでググって解説読むといいよ。
自力でたどり着けない時点で、貴方にその仕事は向いていないけど。 処のところの 5ch が重かったり鯖落ちしたりというのは
5ch 自体の問題やネットワークの問題もあるが
実はアホの山下謹製専ブラ Jane Style 4.00版のせいだと判明した
これのTLS対応に欠陥があり、毎回フルハンドシェイクを行って鯖の負荷を増大させていた
その他にもツッコミどころ満載のクソソフトなので
使っている人を見かけたらすぐにゴミ箱に捨てるように言ってほしい TLSのハンドシェイクを鯖で行っているなら5ch運営が究極の馬鹿ということになるが。 やっぱりか、やたらメモリアクセスエラーが起きている ちょっと質問させてください
プログラムの勉強を初めて、スタンドアロンのアプリを作っていたんですが、最近ソーシャルな機能を入れてみたいと思い
ネットワークプログラムを勉強しているんですが
C#でクライアントを、PHPでサーバーといった構成で作ってみようと思っています
この場合とりあえずTCP/IPを勉強するって事でいいんですかね?
簡単なechoサーバーとクライアント作成まではできたのですが、ここから複数のクライアントの受付やどういった情報をどういった形式でやりとりしたらいいのかがさっぱりわからなくて立ち止まっています
今考えているのは、JSONでやりとりして、そこからコールバックでサーバー側の処理を行わせていこうかなくらいしか思いついていないです。 仕掛けはいろいろあるから、画面なりユーザーI/Fを決めると、シーケンスがわかって
んじゃどう作るかが見えると思う。 初心者の質問スレ辺りで聞けよ、QZと言う親切な奴がコーディングしてくれよ。
スレチ ゲームとかパフォーマンスにシビアなことしないんだっら、通常はhttpにjsonなりxmlでデータやり取りすりゃいいんじゃないかな。 ■ このスレッドは過去ログ倉庫に格納されています