ページ 11

send関数でのackのみ送信方法についてご教授ください

Posted: 2017年5月14日(日) 12:40
by Yukosoft
サーバ・クライアント通信でWindowsのTCP接続ツールを作っておりますが、
ソケット宣言→サーバコネクト→sendやrecv→close
に関するサンプルは多々あるのですが、クライアントからsendの途中で意図して
ackのみ送信するような方法について探しきれませんでした。

方法があるかご教授いただければ幸いです。

クライアント側

s = socket(AF_INET, SOCK_STREAM , 0);

(connect(s, (struct sockaddr *) &dest, sizeof(dest)));
←サーバにはsyn/ackとして自動的に送信される

while(1){

send(s, buffer, length , 0);
←送付するデータをつければサーバにはpsh/ackとして自動的に送信される

又は

recv(s , recvbuff , 256 , 0);

←※※※ここで受信結果が正しければackのみ送付したい※※※
この方法は存在しますか?
}

closesocket(s);
←サーバにはFINとして自動的に送信される

Re: send関数でのackのみ送信方法についてご教授ください

Posted: 2017年5月14日(日) 19:53
by みけCAT
「本来TCPで安定して送受信できるストリームの内容だけを見て処理をすればいいはずのアプリケーションが、ackを送信するタイミングをコントロールしたい」というのは不自然な状況であり、
The XY Problemの疑いがあります。
なぜ「クライアントからsendの途中で意図してackのみ送信する」ことをしたいのですか?
Yukosoft さんが書きました: recv(s , recvbuff , 256 , 0);

←※※※ここで受信結果が正しければackのみ送付したい※※※
パケットキャプチャなどで、現状では「受信結果が正しければackのみ送付」されていないことは確認しましたか?

Re: send関数でのackのみ送信方法についてご教授ください

Posted: 2017年5月15日(月) 00:20
by YuO
どこの層の話をしているのでしょうか。
  • TCP層(やそれ以下の層)でのACKの話をしているのであれば,自前でTCP(やそれ以下の層)のドライバーを作っている場合を除いて,上位層はTCP(やそれ以下の層)がACKを返したとか知る必要が無いですし,それに依存するプロトコルを作ってはいけません。
  • アプリケーション層の話であれば,普通にsendを使ってACKを送ればよいでしょう。ACKだけを送る方法が無いのであれば,プロトコルの不備になります。ただし,Nagleアルゴリズム等によって,1 octetだけ等の小さな情報の送信は送信自体が遅延される可能性があります。