logo

C/C++ でのソケット プログラミング

今日の世界では、コンピュータ ネットワークがデータ転送分野で重要な役割を果たしています。これは各プログラマが知っておくべき主題です。コンピューター ネットワークの下では、ソケット プログラミングはプログラミングの世界で最も重要なトピックの 1 つです。このトピックでは、ソケット プログラミングと、C++ で実装されるソケット プログラミングのさまざまな方法について説明します。

C++ におけるソケット プログラミングは、ネットワーク上で 2 つ以上のノードを相互に結合し、ノードがデータを失うことなくデータを共有できるようにする方法です。これに関連して、1 つのノードは特定の IP アドレスに接続されている 1 つのポートをリッスンします。クライアントがサーバーに到達すると、サーバーはソケット リスナーを作成します。

ソケットとは何ですか?

リアルタイムの例でソケットについて理解しましょう。ソケットは、2 つのデバイス間の接続を提供する媒体の一種です。ソケットは、ソケットと電話の間、または電話とラップトップの間の接続を提供する電話充電器のいずれかになります。ソケットを使用すると、さまざまなアプリケーションがさまざまなポートでローカル ネットワークに接続されます。ソケットが作成されるたびに、サーバーはプログラムを指定し、そのプログラムがソケットとドメイン アドレスを指定します。

ソケットは、異なるプロセス間でデータを交換するために使用されるメカニズムの一種です。ここで、これらのプロセスは、ネットワークを介して接続された異なるデバイスまたは同じデバイスに存在します。ソケットの接続が作成されると、データは両方向に送信され、いずれかのエンドポイントが接続を閉じるまで送信され続けます。

C/C++ でのソケット プログラミング

クライアントサーバー通信の手順

クライアントとサーバー間の通信を確立するには、いくつかの手順に従わなければなりません。これらは次のとおりです。

    ソケット:ソケットを使用すると、新しい通信を作成できます。練る:これを利用して、ソケットにローカル アドレスを接続することができます。聞く:この助けを借りて;接続を受け入れることができます。受け入れる:この助けを借りて;リクエストが到着するまで受信接続をブロックできます。接続する:この助けを借りて;接続の確立を試みることができます。送信:これの助けを借りて;ネットワーク経由でデータを送信できます。受け取る:この助けを借りて;ネットワーク経由でデータを受信できます。近い:これを利用して、ネットワークから接続を解放できます。

サーバーソケット作成の段階

サーバー用のソケットを作成するにはいくつかの段階があります。これらは次のとおりです。

    intソケットcr:ソケット(ドメイン、タイプ、プロトコル)ソケット等:整数型でファイルハンドラーのようなものです。ドメイン:通信ドメインであり、整数型です。タイプ:コミュニケーションタイプです。SOCK_DGRAM:これは、信頼性が低く、コネクションレス型の UDP の一種です。プロトコル:これは、IP アドレスのプロトコル値 (0) を割り当てるために使用されます。プロトコル値は、ポケットの IP ヘッダーのプロトコル フィールドに表示される値と似ています。

コネクションとは何ですか?

接続は、2 つのソフトウェアが互いについて認識されている 2 つのマシン間の関係の一種です。これら 2 つのソフトウェアは、相互に接続を確立する方法を知っています。言い換えれば、この 2 つのソフトウェアはネットワーク上でビットを送信する方法を知っていると言えます。ソケットの接続は、2 台のマシンが電話番号、IP アドレス、TCP ポートなど、相互間のすべての情報を認識している必要があることを意味します。

ソケットは、プログラムが受信接続を受け入れ、受信接続を送受信できるようにするファイルに似たオブジェクトのタイプです。また、サーバーのプロセスに割り当てられるリソースの一種でもあります。

サーバーは、socket() を使用してソケットを作成できます。このソケットは他のプロセッサと共有できません。

    セットソケット:Setsockopt を使用すると、ソケットのファイル記述子によって参照されるソケットのさまざまなオプションを操作できます。このプロセスは完全にオプションです。 Setsockopt を使用すると、クライアントとサーバーのポートとアドレスを再利用できます。サーバーが「アドレスはすでに使用されています」というエラーを出した場合、Setsockopt を使用してエラーを防ぐことができます。練る:バインド関数を使用して、ソケットをアドレスとポートにバインドできます。この操作はソケットの作成後に実行されます。たとえば、サーバーをローカル ホストにバインドしようとすると、INADDR_ANY を使用してサーバーの IP アドレスを定義します。聞く:listen to () 関数を使用して接続モードのソケットを作成できます。接続モードソケットの例は SOCK_STREAM です。これはソケット引数によって定義できます。これは、着信接続を受け入れ、着信接続のキュー操作を実行し、着信接続のバックログを実行するために使用されます。受信接続がサーバーに確認を要求すると、ソケットはパッシブ モードになります。サーバーの backlog パラメーターは、サーバーへの一度に複数の接続を許可できないという事実を指します。何らかの着信接続が到着し、キューがいっぱいの場合、サーバーは「ECONNREFUSED」を示すエラーを提供します。 listen() の助けを借りて、受信接続は保留され、キューが空になると、サーバーへのすべての受信接続が呼び出されます。受け入れる:accept() システムコールを利用します。接続ベースのソケットを作成できます。一部の接続ベースのソケットには SOCK_STREAM と SOCK_SEQPACKET があります。最初に受信するすべての受信接続を抽出し、そのリクエストがサーバーに送信されることを許可します。新しく接続されたリストは、新しいソケットを作成するための別の引数を使用してリッスンすることはできません。

クライアントの段階

    ソケット接続:サーバーの作成方法と全く同じです。接続する:connect() システムコールを使用してソケットへの接続を開始できます。ソケットのパラメータが SOCK_DGRAM のタイプである場合、connect() を使用してデータグラムを永続的なデータグラムとして定義できます。ソケットのタイプが SOCK_STREAM の場合は、サーバーに対して別の接続を試みることができます。 connect() 関数を使用すると、外部関連付けの接続を作成することもできます。ソケットがバインドされていない場合、システムはローカル関連付けに一意の値を割り当てます。システム呼び出しが正常に完了すると、ソケットはあらゆるタイプのデータを送受信できる状態になります。送受信:send()関数とrecv()関数は以下の操作を実行できます。
  • データを相互に通信できるソケット。
  • ストレージ バッファには、addr_of_data や addr_of_buffer などのアドレスに関するデータを保存できます。
  • len_of_data や len_of_buffer などのバッファのサイズを扱います。
  • データの送信方法を示すフラグを扱います。

ソケットで接続を確立する手順

さまざまなクライアントとサーバー間の接続を確立します。ただし、クライアントとサーバーの両方がソケット接続を処理できます。各プロセスは、独自のソケットへの接続を確立する必要があります。

クライアント側でソケットを確立する手順は次のとおりです。

  • これは、socket() システムコールを使用してソケットを作成します。
  • 次に、system() 呼び出しを使用してサーバーのソケット アドレスに接続する必要があります。
  • 次に、データを送受信する必要があります。これはさまざまな方法で行うことができます。この read() 関数と write() 関数を実行できます。

サーバー側でソケットを確立する手順は次のとおりです。

  • まず、socket() システムコールを使用してソケットを作成します。
  • 次に、bind() システムコールを使用してソケットをアドレスにバインドします。アドレスは、ホスト マシンのサーバー ソケットのポート番号で構成されます。
  • 次に、listening () システム コールを使用して接続をリッスンします。
  • 次に、サーバーは accept() システムコールを使用して受信接続を受け入れます。また、クライアントがサーバーに接続されるまで、受信コマンドはすべてブロックされます。
  • その後、データの送受信のプロセスが開始されます。

マルチスレッドを使用しない複数のクライアントの接続

単一のユーザーがサーバーにどのように接続できるかを示すさまざまな例があります。今日のプログラミングの世界では、複数のユーザーが異なるソケットを使用してサーバーに接続しています。

これを実現するにはさまざまな方法があります。その 1 つはマルチスレッドです。マルチスレッドの助けを借りて、これを実現できます。 select() 関数の助けを借りてマルチスレッド プロセスを実装できます。

例:

クライアントのコード:

 // Client side C/C++ program to demonstrate Socket // programming #include #include #include #include #include #define PORT 8080 int main(int argc, char const* argv[]) { int sock = 0, valread, client_fd; struct sockaddr_in serv_addr; char* hello = &apos;Hello from client&apos;; char buffer[1024] = { 0 }; if ((sock = socket(AF_INET, SOCK_STREAM, 0)) <0) 0 8080 { printf('
 socket creation error 
'); return -1; } serv_addr.sin_family="AF_INET;" serv_addr.sin_port="htons(PORT);" convert ipv4 and ipv6 addresses from text to binary form if (inet_pton(af_inet, '127.0.0.1', &serv_addr.sin_addr) <="0)" printf( '
invalid address not supported ((client_fd="connect(sock," (struct sockaddr*)&serv_addr, sizeof(serv_addr))) 0) printf('
connection failed send(sock, hello, strlen(hello), 0); printf('hello message sent
'); valread="read(sock," buffer, 1024); printf('%s
', buffer); closing the connected close(client_fd); 0; code for server: server side c c++ program demonstrate programming #include #define port int main(int argc, char const* argv[]) server_fd, new_socket, valread; struct sockaddr_in address; opt="1;" addrlen="sizeof(address);" buffer[1024]="{" }; char* hello="Hello from server" ; creating file descriptor ((server_fd="socket(AF_INET," sock_stream, 0)) perror('socket failed'); exit(exit_failure); forcefully attaching (setsockopt(server_fd, sol_socket, so_reuseaddr | so_reuseport, &opt, sizeof(opt))) perror('setsockopt'); address.sin_family="AF_INET;" address.sin_addr.s_addr="INADDR_ANY;" address.sin_port="htons(PORT);" (bind(server_fd, sockaddr*)&address, sizeof(address)) perror('bind (listen(server_fd, 3) perror('listen'); ((new_socket="accept(server_fd," (socklen_t*)&addrlen)) perror('accept'); send(new_socket, close(new_socket); listening shutdown(server_fd, shut_rdwr); pre> <p> <strong>Compiling:</strong> </p> <img src="//techcodeview.com/img/c-tutorial/33/socket-programming-c-c-2.webp" alt="Socket Programming in C/C++"> <p> <strong>Output:</strong> </p> <img src="//techcodeview.com/img/c-tutorial/33/socket-programming-c-c-3.webp" alt="Socket Programming in C/C++"> <h2>Uses of Socket Programming</h2> <p>Socket programs are used to communicate between various processes, usually running on different systems. It is mostly used to create a client-server environment. This post provides the various functions used to create the server and client program and an example program.</p> <p>In the example, the client program sends a file name to the server, and the server sends the contents of the file back to the client. Socket programming usually pertains to basic communication protocols like TCP/UDP and raw sockets like ICMP. These protocols have a small communication overhead when compared to underlying protocols such as HTTP/DHCP/SMTP etc.</p> <p> <strong>Some of the basic data communications between the client and server are:</strong> </p> <ul> <li>File Transfer: Sends name and gets a file.</li> <li>Web Page: Sends URL and gets a page.</li> <li>Echo: Sends a message and gets it back.</li> </ul> <h2>Disadvantages</h2> <ul> <li>C++ can establish communication only with the machine requested and not with any other machine on the network.</li> <li>Sockets allow only raw data to be sent. This means that the client and server need mechanisms to interpret the data.</li> </ul> <hr></0)>