我正在使用套接字来同步多个远程进程。由于连接突发而拒绝套接字连接
的想法是,一个进程创建用于管理服务器端的并行线程,就像这样:
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);
现在,这个问题我有当我有很多进程试图同时连接到服务器,其中有一些连接拒绝连接错误。
我想这是因为接受可能没有准备好......事实上,我已经读过它可能会发生,但我还没有找到我的具体情况。
任何人都可以解释此事吗?
对我来说,一个可能的解决方案是为每个接受创建一个线程,但我宁愿避免它。
谢谢。
编辑:更正服务器中套接字的双重初始化。感谢@Remy Lebeau。
我不认为我理解你正在尝试做的事情。接受连接然后泄漏它们应该完成什么?这些如何产生任何同步?或者是否删除了一些能够提供同步和非资源泄漏目标的重要位? –
这个想法是,第一个进程将在'pthread_join'中等待,直到其他进程到达给定的点。我只使用套接字来同步它们,我对传递过程不感兴趣。 – siserte