Я использую сокеты для синхронизации нескольких удаленных процессов.Подключение к разъему отказалось из-за всплеска соединений
Идея заключается в том, что процесс создает PTHREAD, который управляет на стороне сервера, так же, как что:
void *listener(void * in) {
int sockfd;
socklen_t clilen;
struct sockaddr_in serv_addr, cli_addr;
int n = *((int *) in);
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0)
error("ERROR opening socket");
int option = 1;
setsockopt(sockfd, SOL_SOCKET, (SO_REUSEPORT | SO_REUSEADDR), (char*) &option, sizeof (option));
bzero((char *) &serv_addr, sizeof (serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons(PORT);
if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof (serv_addr)) < 0)
error("ERROR on binding");
if (listen(sockfd, n) < 0)
error("ERROR when listening");
clilen = sizeof (cli_addr);
int cnt = 0;
while (cnt < n) {
int newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
if (newsockfd < 0) {
error("ERROR on accept");
}
cnt++;
}
close(sockfd);
return 0;
}
В то же время, будет выполнять другие процессы:
int sockfd;
struct sockaddr_in serv_addr;
struct hostent *server;
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0)
error("ERROR opening socket");
server = gethostbyname(_managementHost); //managementHost);
if (server == NULL)
error("ERROR, no such host\n");
bzero((char *) &serv_addr, sizeof (serv_addr));
serv_addr.sin_family = AF_INET;
bcopy((char *) server->h_addr, (char *) &serv_addr.sin_addr.s_addr, server->h_length);
serv_addr.sin_port = htons(PORT);
if (connect(sockfd, (struct sockaddr *) &serv_addr, sizeof (serv_addr)) < 0)
error("ERROR connection");
close(sockfd);
Теперь проблема я есть, когда у меня есть много процессов, пытающихся подключиться одновременно к серверу, некоторые из них бросают соединение отказано ошибок.
Я думаю, это потому, что прием может быть не готов ... На самом деле, я прочитал, что это может произойти, но я не нашел свой конкретный случай.
Может ли кто-нибудь пролить свет на вопрос?
Возможное решение, которое возникает для меня, заключается в создании потока для каждого принятия, но я бы предпочел избежать его.
спасибо.
EDIT: исправлена двойная инициализация сокета на сервере. Благодаря @Remy Lebeau.
Я не думаю, что хорошо понимаю, что вы пытаетесь сделать. Что должно быть достигнуто путем принятия соединений, а затем их утечки? Как происходит любая синхронизация? Или вы вырезали некоторые важные биты, которые питают ваши задачи синхронизации и не-ресурса? –
Идея состоит в том, что первый процесс будет ждать 'pthread_join', пока другие не достигнут заданной точки. Я использую только сокеты для их синхронизации, мне не интересно передавать процессы. – siserte