여러 원격 프로세스를 동기화하기 위해 소켓을 사용하고 있습니다.연결이 끊어져서 소켓 연결이 거부되었습니다.
아이디어는 프로세스가 그냥 그런, 서버 측을 관리하는의 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);
을 이제 문제를 I 내가 서버에 동시에 연결하려고하는 많은 프로세스를 가지고있을 때, 그들 중 일부는 연결을 거부했습니다. 오류가 발생했습니다.
받아 들일 준비가되지 않았기 때문일 것입니다 ... 사실, 나는 그것이 일어날 수 있다는 것을 읽었지만 나의 특별한 경우는 발견하지 못했습니다.
누구든지 문제를 해결할 수 있습니까?
내게 가능한 해결책은 각 수락에 대한 스레드를 만드는 것입니다.하지만이를 피하는 것이 좋습니다.
감사합니다.
EDIT : 수정 된 서버의 소켓 이중 초기화. @Remy Lebeau 덕분에.
나는 당신이하려고하는 것을 충분히 잘 이해하지 못한다고 생각합니다. 연결을 수락하고 누설함으로써 성취해야하는 것은 무엇입니까? 이 중 어떤 것이 동기화를 생성합니까? 또는 동기화 및 비 리소스 누출 목표를 유발하는 중요한 비트를 잘라 냈습니까? –
아이디어는 다른 프로세스가 주어진 지점에 도달 할 때까지 첫 번째 프로세스가'pthread_join'을 기다릴 것이라는 아이디어입니다. 나는 그것들을 동기화하기 위해서만 소켓을 사용하며, 프로세스를 의사 소통하는 것에는 관심이 없다. – siserte