0

(元の問題は以下にリストされています) 「消費が遅い」問題があることが判明しました。サーバープログラムを制御できないので、setsockopt(m_sock,
IPPROTO_TCP,
TCP_NODELAY,
(char *) &flag,
sizeof(int)); を設定してみました。

しかし、ソケットへの書き込みに数秒かかるところまで到達します。何か不足していますか?元の問題: を使用してソケットを作成しました

m_sock = socket(AF_INET, SOCK_STREAM, 0);

非ブロッキングに設定します。

int opts = fcntl ( m_sock, F_GETFL );

opts = ( opts | O_NONBLOCK ); 

fcntl ( m_sock, F_SETFL,opts );

そして送信

send(m_sock, v_pData, v_iDataSize, MSG_NOSIGNAL);

私は約 200bytes を送信しています。約 2 分後に 1 秒間に 5 回送信すると、大きなバッファが作成され、データの送信に大きな遅延が生じます。送信パフォーマンスを改善する方法はありますか?

最初の編集: ソケットを作成して使用する方法について、さらにコードを追加しています。

m_sock = socket ( AF_INET,
        SOCK_STREAM,
        0 );

if ( ! is_valid() )
  return false;

int on = 1;
if ( setsockopt ( m_sock, SOL_SOCKET, SO_REUSEADDR, ( const char* ) &on, sizeof ( on ) ) == -1 )
return false;


server = gethostbyname(host.c_str());
if (server == NULL) {   

    return false;
}
bzero((char *) &serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
bcopy((char *)server->h_addr, 
     (char *)&serv_addr.sin_addr.s_addr,
     server->h_length);
serv_addr.sin_port = htons(portno);

set_non_blocking(true);// Code for set_non_blocking mentioned above


connect(m_sock,(struct sockaddr *) &serv_addr,sizeof(serv_addr))  ;

次を使用してソケットに書き込みます。

iOut = send(m_sock, v_pData, v_iDataSize, MSG_NOSIGNAL); 
4

2 に答える 2

1

Nagle のアルゴリズムが動作しているのがわかります。

TCP_NODELAY ソケット オプションを設定するだけです。

int value = 1;
setsockopt(m_sock, IPPROTO_TCP, TCP_NODELAY, (void*)&value, sizeof(value));

O_NONBLOCK は必要ないと思いますが、それはユースケースに大きく依存します。

于 2013-09-29T13:56:22.160 に答える