次のような状況があります。私のサーバーは、リモート サーバー (fd_server) からデータを受信し、それをクライアント (fd_client) に転送します。複数のクライアントと複数のサーバー接続を処理できるように、エッジ トリガーの epoll を使用しています。
手順:
- クライアントがサーバーに接続します。
- 私のサーバーはリモート サーバーに接続し、データを要求します。
- リモートサーバーが応答し、サーバーがデータをクライアントに転送します。
詳細:
サーバーがリモート サーバーに接続した後、fd_server が EPOLLIN フラグを使用して epoll コントロールに追加されます。サーバーはイベントを待機します。
epoll_wait が fd_server を読み取り可能として返すと、次のループに進みます。
いくつかの読み取り/書き込みの後、sctp_sendmsg が EAGAIN を返します。これは、sctp 送信バッファーがいっぱいであることを意味します。fd_server ソケットから既に読み取ったデータを失うことなく、この状況を処理するにはどうすればよいですか?
どのくらいのデータを送信できるかを事前に知る方法があるので、適切な量だけを読み取ることができますか?
while(1){
N = recv(fd_server,buf, sizeof buf,0);
if (N == -1){
/* If errno == EAGAIN, that means we have read all
data. So go back to the main loop. */
if (errno != EAGAIN){
perror ("tcp_recv error");
}
break;
}
if(N == 0){
/* End of file. The remote has closed the
connection. */
close(fd_server);
break;
}
pos = 0;
while(pos < N){
got = sctp_sendmsg(fd_client, &buf[pos], N-pos, to, tolen, 0, 0, stream, 0, 0);
if(got<=0){
if (errno == EAGAIN){
//what to do?
}else{
perror("tcp to sctp send error");
}
}
else{
pos += got;}
}
}