この記事では、C 言語でソケットを使用して、マルチスレッドの非同期送信 TCP メッセージ システムを実装する方法を説明します。C 標準ライブラリは非同期およびマルチスレッド プログラミングをネイティブにサポートしていませんが、POSIX スレッド (pthread) ライブラリとソケットを使用して目的を達成できます。
基本知識
TCP (Transmission Control Protocol) は、コネクション指向で信頼性の高い、バイト ストリーム ベースの通信プロトコルです。
ソケットは、アプリケーションがネットワーク上でデータを送受信できるようにするネットワーク プログラミング インターフェイスです。
マルチスレッド プログラミングは、各タスクを別個のスレッドで実行し、複数のタスクを同時に実行する方法です。
非同期メッセージングは、メッセージの送信者が受信者によるメッセージの処理を待つ必要がなく、すぐに戻って他のタスクを続行できるプログラミング モデルです。
気づき始める
まず、必要なヘッダー ファイルをインクルードする必要があります。
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <pthread.h>
#include <unistd.h>
send_message
次に、メッセージを送信するために新しいスレッドで呼び出される関数を定義します。
void* send_message(void* arg)
{
char* message = (char*)arg;
int sock;
struct sockaddr_in server;
// Create socket
sock = socket(AF_INET , SOCK_STREAM , 0);
if (sock == -1)
{
perror("Could not create socket");
return NULL;
}
server.sin_addr.s_addr = inet_addr("127.0.0.1");
server.sin_family = AF_INET;
server.sin_port = htons(8888);
// Connect to remote server
if (connect(sock, (struct sockaddr*)&server, sizeof(server)) < 0)
{
perror("Connect failed");
return NULL;
}
// Send some data
if (send(sock, message, strlen(message), 0) < 0)
{
perror("Send failed");
return NULL;
}
close(sock);
return NULL;
}
このsend_message
関数は、まずソケットを作成し、リモート サーバーに接続します。次に、メッセージを送信し、ソケットを閉じます。
これで、main 関数で複数のスレッドを作成し、各スレッドがメッセージを送信できるようになりました。
int main()
{
// Array of messages to be sent
char* messages[] = {
"Hello", "from", "C"};
// Create a new thread for each message
pthread_t threads[sizeof(messages)/sizeof(char*)];
for (int i = 0; i < sizeof(messages)/sizeof(char*); i++)
{
if (pthread_create(&threads[i], NULL, send_message, messages[i]) < 0)
{
perror("Could not create thread");
return 1;
}
}
// Wait for all threads to finish
for (int i = 0; i < sizeof(threads)/sizeof(pthread_t); i++)
{
pthread_join(threads[i], NULL);
}
return 0;
}
このコードでは、送信されるメッセージごとに新しいスレッドを作成し、send_message
その関数をスレッド関数として渡します。次に、すべてのスレッドが完了するまで待ちます。
主な機能説明
1.ソケット機能
<sys/socket.h>
ソケット関数は、ソケットを作成し、ヘッダー ファイルで定義されているソケットのファイル記述子を返すために使用されます。その関数プロトタイプは次のとおりです。
int socket(int domain, int type, int protocol);
-
domain
: このパラメータは、使用するプロトコル ファミリ (Protocol Family) を指定します。一般的なプロトコル ファミリには、AF_INET (IPv4 ネットワーク プロトコル)、AF_INET6 (IPv6 ネットワーク プロトコル) などが含まれます。 -
type
: このパラメータはサービスの種類を指定します。一般的なサービス タイプには、SOCK_STREAM (コネクション型の安定したデータ伝送、つまり TCP プロトコルを提供します)、SOCK_DGRAM (コネクションレス型の不安定なデータ伝送、つまり UDP プロトコルを提供します) などが含まれます。 -
protocol
: このパラメータは通常 0 に設定され、システムがtype
TCP や UDP などの適切なプロトコルを自動的に選択できるようにします。
ソケット関数が成功した場合は、新しいソケット記述子を返し、それ以外の場合は、-1 を返し、errno をエラー番号に設定します。
2. pthread_create関数
pthread_create 関数は、新しいスレッドを作成し、その新しいスレッドで指定された関数を実行するために使用されます。<pthread.h>
ヘッダーファイルで定義されます。その関数プロトタイプは次のとおりです。
int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);
-
thread
: これは、新しく作成されたスレッド ID を返す出力パラメータです。 -
attr
: 新しいスレッドの属性を設定するために使用される、スレッド属性構造体へのポインター。NULL に設定すると、デフォルトのプロパティが使用されます。 -
start_routine
: 新しいスレッドによって実行される関数を指す関数ポインター。 -
arg
start_routine
:渡されるパラメータへのポインタ。
pthread_create 関数は成功すると 0 を返し、失敗すると 0 以外のエラー コードを返します (この関数は errno を設定しないことに注意してください)。新しく作成されたスレッドはstart_routine
関数のアドレスから実行を開始し、start_routine
関数が戻るとスレッドは自動的に終了します。
結論
これは、C でソケットを使用して、TCP メッセージのマルチスレッド非同期送信を実装する簡単な例です。これは基本的な例であり、実際に使用するには、エラー処理および例外処理コードの追加が必要になる場合があります。同時に、C 言語には非同期またはマルチスレッドのサポートが組み込まれていないため、このメソッドは完全な非同期ではありませんが、マルチスレッドを使用して非同期動作をシミュレートできます。