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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Yukosoft
記事: 1
登録日時: 11ヶ月前

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

#1

投稿記事 by Yukosoft » 11ヶ月前

サーバ・クライアント通信で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として自動的に送信される

アバター
みけCAT
記事: 6004
登録日時: 7年前
住所: 千葉県
連絡を取る:

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

#2

投稿記事 by みけCAT » 11ヶ月前

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

←※※※ここで受信結果が正しければackのみ送付したい※※※
パケットキャプチャなどで、現状では「受信結果が正しければackのみ送付」されていないことは確認しましたか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

YuO
記事: 908
登録日時: 7年前
住所: 東京都世田谷区

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

#3

投稿記事 by YuO » 11ヶ月前

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

返信

“C言語何でも質問掲示板” へ戻る