LWIP では、ネットワーク デバイス (イーサネット カードなど) が複数のソケットを作成して、さまざまなネットワーク接続を処理できます。listen
通常、接続をリッスンするためのソケット ( ) と、接続をアクティブに開始するための別のソケット ( )を作成できますconnect
。各ソケットが適切に初期化および構成されていることを確認する限り、これは完全に可能です。
以下は、LWIP で 2 つのソケット (1 つはサーバーとして、もう 1 つはクライアントとして) を作成する方法を示す簡単な例です。これは基本的な例であり、エラー処理やリソースのクリーンアップは含まれていないことに注意してください。
#include "lwip/sockets.h"
#include "lwip/ip_addr.h"
void create_sockets(void)
{
int listen_sock, client_sock;
struct sockaddr_in server_addr, client_addr;
/* Create server socket */
listen_sock = lwip_socket(AF_INET, SOCK_STREAM, 0);
if (listen_sock < 0) {
// Handle error
return;
}
/* Initialize server sockaddr structure */
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(1234);
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
/* Bind the server socket */
if (lwip_bind(listen_sock, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {
// Handle error
return;
}
/* Start listening for incoming connections */
if (lwip_listen(listen_sock, 5) < 0) {
// Handle error
return;
}
/* Create client socket */
client_sock = lwip_socket(AF_INET, SOCK_STREAM, 0);
if (client_sock < 0) {
// Handle error
return;
}
/* Initialize client sockaddr structure */
memset(&client_addr, 0, sizeof(client_addr));
client_addr.sin_family = AF_INET;
client_addr.sin_port = htons(1235);
client_addr.sin_addr.s_addr = htonl(INADDR_ANY);
/* Connect to the server */
if (lwip_connect(client_sock, (struct sockaddr *)&client_addr, sizeof(client_addr)) < 0) {
// Handle error
return;
}
/* Now the server socket (listen_sock) is listening for connections, and
the client socket (client_sock) is connected to the server. */
}
これは単なる基本的な例であり、エラー処理やリソースのクリーンアップは含まれていません。実際の使用では、エラー処理の追加、リソースのクリーンアップ、クライアントとサーバー間のデータ送信の処理など、実際のニーズに応じてこの例を変更および拡張する必要があります。