close()socket(c ++)を備えた悪いファイル記述子
-
28-09-2019 - |
質問
私のプログラムが別のホストを接続できないとき、私はファイル記述子を使い果たしています。閉じる()システムコールは機能しません。オープンソケットの数は増加します。一緒にいることができます
cat/proc/sys/fs/file-nr
コンソールからの印刷:
接続:ホストへのルートなし
閉じる:悪いファイル記述子
接続:ホストへのルートなし
閉じる:悪いファイル記述子
..
コード:
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <string.h>
#include <iostream>
using namespace std;
#define PORT 1238
#define MESSAGE "Yow!!! Are we having fun yet?!?"
#define SERVERHOST "192.168.9.101"
void
write_to_server (int filedes)
{
int nbytes;
nbytes = write (filedes, MESSAGE, strlen (MESSAGE) + 1);
if (nbytes < 0)
{
perror ("write");
}
}
void
init_sockaddr (struct sockaddr_in *name,
const char *hostname,
uint16_t port)
{
struct hostent *hostinfo;
name->sin_family = AF_INET;
name->sin_port = htons (port);
hostinfo = gethostbyname (hostname);
if (hostinfo == NULL)
{
fprintf (stderr, "Unknown host %s.\n", hostname);
}
name->sin_addr = *(struct in_addr *) hostinfo->h_addr;
}
int main()
{
for (;;)
{
sleep(1);
int sock;
struct sockaddr_in servername;
/* Create the socket. */
sock = socket (PF_INET, SOCK_STREAM, 0);
if (sock < 0)
{
perror ("socket (client)");
}
/* Connect to the server. */
init_sockaddr (&servername, SERVERHOST, PORT);
if (0 > connect (sock,
(struct sockaddr *) &servername,
sizeof (servername)))
{
perror ("connect");
sock = -1;
}
/* Send data to the server. */
if (sock > -1)
write_to_server (sock);
if (close (sock) != 0)
perror("close");
}
return 0;
}
修理:
if (0 > connect (sock,
(struct sockaddr *) &servername,
sizeof (servername)))
{
perror ("connect");
}
else
write_to_server (sock);
if (close (sock) != 0)
perror("close");
解決
問題はプログラムの構造にあるようです。無限のループを介して、新しいソケットを作成しています。これをループから移動して再利用することをお勧めします。
ただし、今のやり方を修正したい場合は、「接続」の内側に近いことを使用してください。記述子は「ソケット」コールによって割り当てられ、「接続」コールにのみ接続されます。 「靴下」変数を-1に設定することにより、「ソケット」によって割り当てられた記述子を捨てます。近くに電話してください、 それから -1に設定すると、設定する必要があります。
所属していません StackOverflow