サーバ・クライアント通信で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として自動的に送信される
send関数でのackのみ送信方法についてご教授ください
Re: send関数でのackのみ送信方法についてご教授ください
「本来TCPで安定して送受信できるストリームの内容だけを見て処理をすればいいはずのアプリケーションが、ackを送信するタイミングをコントロールしたい」というのは不自然な状況であり、
The XY Problemの疑いがあります。
なぜ「クライアントからsendの途中で意図してackのみ送信する」ことをしたいのですか?
The XY Problemの疑いがあります。
なぜ「クライアントからsendの途中で意図してackのみ送信する」ことをしたいのですか?
パケットキャプチャなどで、現状では「受信結果が正しければackのみ送付」されていないことは確認しましたか?Yukosoft さんが書きました: recv(s , recvbuff , 256 , 0);
←※※※ここで受信結果が正しければackのみ送付したい※※※
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: send関数でのackのみ送信方法についてご教授ください
どこの層の話をしているのでしょうか。
- TCP層(やそれ以下の層)でのACKの話をしているのであれば,自前でTCP(やそれ以下の層)のドライバーを作っている場合を除いて,上位層はTCP(やそれ以下の層)がACKを返したとか知る必要が無いですし,それに依存するプロトコルを作ってはいけません。
- アプリケーション層の話であれば,普通にsendを使ってACKを送ればよいでしょう。ACKだけを送る方法が無いのであれば,プロトコルの不備になります。ただし,Nagleアルゴリズム等によって,1 octetだけ等の小さな情報の送信は送信自体が遅延される可能性があります。