linux-TCPネットワークインタフェース伝送速度試験プログラム

5432 ワード

ボードのインタフェース通信速度をテストしようとしたが、開発環境に外部ネットワークがないため、既存の各種ツールが使えず、自力更生するしかなかった.だからsocketベースの小さなコードを書いて、みんなと分かち合います.centosとubuntu環境でのコンパイルに成功しました.ps:マルチスレッドを使用しているので、コンパイルは-lpthreadを追加するオプションですよ.
コードリンク:https://github.com/yangyinqi/nic_speed
このようなテストゲートウェイ伝送速度の必要性に対して、比較的純粋な伝送速度を測定する以上、接続はtcp伝送層に直接確立され、様々なアプリケーション層プロトコル解析による遅延を排除する.

サービス:


サービス側は、リンク層におけるmtuサイズが一般的に1500であることを考慮して、1400の長さで、顧客への接続を継続的に送信するパケットを担当する.各接続上のパケットの合計数を格納するために、先頭ノードの一方向チェーンテーブルを定義し、レートの計算を容易にします.
typedef struct _thread_args {
	int client_sockfd;
	char *data_pointer;
	long packet_count;
	int thread_seq;
	pthread_t thread_id;
	struct _thread_args *next;
}thread_args;
ヘッダノードは、リスニングソケット情報、およびレート計算スレッドの情報を格納する.
プライマリ・スレッドでacceptにブロックされ、返されたときにこの接続を維持し、クライアントにデータを送信するスレッドが作成されます.
	int thread_seq = 0;
	client_len = sizeof(client_address);
	while(1) {
		printf("Server waiting.
"); client_sockfd = accept(listen_sockfd, (struct sockaddr *)&client_address, &client_len); if((response_args = (thread_args *)malloc(sizeof(thread_args))) == NULL) { printf("Thread args malloc failed.
"); close(listen_sockfd); break; } response_args->thread_seq = thread_seq++; response_args->client_sockfd = client_sockfd; response_args->packet_count = 0; response_args->data_pointer = send_buff; response_args->next = response_head->next; response_head->next = response_args; //create thread for send data to client_sockfd if(pthread_create(&(response_args->thread_id), NULL, thread_response, (void *)response_args) != 0) { perror("Thread response create failed"); break; } }

クライアント処理スレッドは次のとおりです.
void *thread_response(void *arg)
{
	thread_args *internal_args = (thread_args *)arg;
	internal_args->packet_count = 0;
	int sem_status = 0;

	pthread_detach(pthread_self());
	printf("Server the client,fd:%d. Thread No.%d.
", internal_args->client_sockfd, internal_args->thread_seq); while(1) { sem_getvalue(&sem_send_data, &sem_status); if(sem_status == 0) { continue; } else { int wr_res = send(internal_args->client_sockfd, internal_args->data_pointer, MTU_NUM, 0); if(wr_res == 0) { printf("Disconnected!
"); break; } else if(wr_res < 0) { perror("Error in connection"); break; } (internal_args->packet_count)++; } } close(internal_args->client_sockfd); pthread_exit(""); }

レートを計算するスレッドは、スレッド信号量によって応答スレッドの実行ロジックを制御する.具体的には、文章の先頭に接続されているプログラムを参照してください.ここでは具体的なコードは貼られていません.

クライアント:


クライアントの論理は、テスト環境のcpuが8コアであるため、いくつかのスレッド(この例では8)をそれぞれ作成し、スレッドでソケットの作成、connect、recvなどの操作を行うことです.ここでソケットを作成して、複数のスレッドで直接接続することはできません.私はこのエラーを犯しました.このようなサービス側はリンク要求として処理されることに気づきました.
具体的なコードは、文章の先頭githubアドレスを参照します.

テスト:


帰ってきたらローカルテストを行い、client.hのIPは127.0.0.1に設定され、その後、2つの端末がサーバとクライアントをそれぞれ実行する.
サーバ印刷:
Server waiting.
Server the client,fd:5. Thread No.1.
Server waiting.
Server the client,fd:6. Thread No.2.
Server the client,fd:4. Thread No.0.
Server waiting.
Server waiting.
Server waiting.
Server the client,fd:7. Thread No.3.
Server the client,fd:8. Thread No.4.
Server the client,fd:9. Thread No.5.
Server waiting.
Server waiting.
Server the client,fd:10. Thread No.6.
Server the client,fd:11. Thread No.7.
No.7 client count packet:1516597.
No.6 client count packet:1486722.
No.5 client count packet:1494818.
No.4 client count packet:1522742.
No.3 client count packet:1541814.
No.2 client count packet:1405446.
No.1 client count packet:1586907.
No.0 client count packet:1598772.
Total length:12153818bytes. Sample timing:5s, Transmittion speed:3245.42Mb/s
No.7 client count packet:2625885.
No.6 client count packet:2658081.
No.5 client count packet:2788680.
No.4 client count packet:2387941.
No.3 client count packet:2776665.
No.2 client count packet:2514184.
No.1 client count packet:2648765.
No.0 client count packet:2461294.
Total length:20861495bytes. Sample timing:5s, Transmittion speed:5570.62Mb/s
No.7 client count packet:2431768.
No.6 client count packet:2388140.
No.5 client count packet:2415890.
No.4 client count packet:2329173.
No.3 client count packet:2550932.
No.2 client count packet:2524958.
No.1 client count packet:2492313.
No.0 client count packet:2537837.
Total length:19671011bytes. Sample timing:5s, Transmittion speed:5252.73Mb/s
No.7 client count packet:1855025.
No.6 client count packet:1954570.
No.5 client count packet:1929904.
No.4 client count packet:1898067.
No.3 client count packet:2134070.
No.2 client count packet:1930880.
No.1 client count packet:1965562.
No.0 client count packet:1834356.
Total length:15502434bytes. Sample timing:5s, Transmittion speed:4139.60Mb/s
クライアント印刷:
Creating thread..
Connect successfully,seq_num:3, id:-1562437888
Connect successfully,seq_num:5, id:-1587616000
Connect successfully,seq_num:4, id:-1570830592
Connect successfully,seq_num:5, id:-1596008704
Connect successfully,seq_num:6, id:-1604401408
Thread create finished. Test running...
Connect successfully,seq_num:5, id:-1579223296
Connect successfully,seq_num:8, id:-1621186816
Connect successfully,seq_num:8, id:-1612794112
Main process.

ローカルループネットワークの速度は確かに速いことがわかります.ギガビットカードの実際のテストレートは112 Mb/s程度で、興味のある読者は自分で走りながらテストすることができます.