我有以下情况。我的服务器从远程服务器(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;}
}
}