1

AF_INET ファミリーのソケットを使用して、同じプロセスのスレッド間にローカル接続を作成しようとしています。
サーバーはクライアントを処理し、スレッドとの多重化を介してクライアントの要求を処理することになっています。

したがって、サーバーのメインスレッドでは、外部接続用にこれを持っています: (投稿の長さを合理的に保つために、エラーのチェックは省略されています)

struct sockaddr_in server_addr;
struct sockaddr *serverptr=(struct sockaddr *)&server_addr;
listening_sock = socket(AF_INET, SOCK_STREAM, 0);
fds[0].fd = listening_sock;
fds[0].events = POLLIN;
// Setting listening socket
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(port);
int one = 1;
setsockopt(listening_sock, SOL_SOCKET, SO_REUSEADDR, (void *)&one, sizeof(one));
setsockopt(listening_sock, IPPROTO_TCP, TCP_NODELAY, (void *)&one, sizeof(one));
bind(listening_sock, serverptr, sizeof(server_addr));
listen(listening_sock, 5);

そして、ポーリングを使用して、リスニングソケットで正常にポーリングしています(クライアントと通信しています)。

ここで、メイン スレッドとこれから作成する新しいスレッドとの間の通信のために、TCP 経由で内部ソケットを作成したいと考えています。
これらを追加しました:

struct sockaddr_in loopback_addr;
struct sockaddr *loopbackptr=(struct sockaddr *)&loopback_addr;
loopback_sock = socket(AF_INET, SOCK_STREAM, 0); //checking for errors is omitted
fds[1].fd = loopback_sock;
fds[1].events = POLLIN;
// Setting loopback socket
loopback_addr.sin_addr.s_addr = htonl(IN_LOOPBACKNET);
loopback_addr.sin_family = AF_INET;
loopback_addr.sin_port = htons(18000);
int one = 1;
setsockopt(loopback_sock, SOL_SOCKET, SO_REUSEADDR, (void *)&one, sizeof(one));
setsockopt(loopback_sock, IPPROTO_TCP, TCP_NODELAY, (void *)&one, sizeof(one));
bind(loopback_sock, loopback_ptr, sizeof(loopback_addr));
listen(loopback_sock, 5);

また、nfds カウンターを 2 に増やしました。
スレッドはポーリングのループの前に開始し、次のコードとの通信を試みます。

struct sockaddr_in server;
struct sockaddr *serverptr = (struct sockaddr*)&server;
int sock;
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
    perror("thread: socket");
    pthread_exit((void*)-1);
}

int port = 18000;
server.sin_family = AF_INET;      
server.sin_addr.s_addr = IN_LOOPBACKNET; 
server.sin_port = htons(port);        
if (connect(sock, serverptr, sizeof (server)) < 0)
{
    perror("thread: connect");
    pthread_exit((void*)-1);
}

そして何が起こるかというと、connect syscall が を返しますthread: connect: Network is unreachable

サーバーのメイン ループには、次のようなものがあります。

if (fd[1].revents)
    printf("Loopback socket\n");

このソケットとの相互作用があるかどうかを確認しますが、これは何も出力しません。

内部ソケットの設定方法がわかりません。読めるチュートリアルがあれば、リンクを歓迎します。

単純なことかもしれませんが、ソケットプログラミングは初めてなので、見つけることができません。


編集:
alk が提案したように IN_LOOPBACKNET を htonl(INADDR_LOOPBACK) に変更した後も、接続は失敗しますが、新しいメッセージが表示されますconnection refused
それでも、fds[2] からの revents はありません。

4

1 に答える 1