【发布时间】:2016-09-21 20:42:54
【问题描述】:
我正在使用套接字来同步多个远程进程。
这个想法是一个进程创建一个管理服务器端的 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);
现在,我遇到的问题是,当我有很多进程试图同时连接到服务器时,其中一些进程会抛出 connection denied 错误。
我猜那是因为接受可能还没有准备好......事实上,我已经读过它可能会发生,但我还没有找到我的具体情况。
有人能解释一下吗?
我想到的一个可能的解决方案是为每个接受创建一个线程,但我更愿意避免它。
谢谢。
编辑:更正了服务器中套接字的双重初始化。感谢@Remy Lebeau。
【问题讨论】:
-
我认为我不太了解您要做什么。通过接受连接然后泄漏它们应该完成什么?这些如何产生任何同步?或者您是否删除了一些重要的部分来满足您的同步和非资源泄漏目标?
-
这个想法是第一个进程将在
pthread_join等待,直到其他进程达到给定点。我只使用套接字来同步它们,我对进程通信不感兴趣。
标签: c sockets parallel-processing synchronization