Я пишу программу для обмена файлами, и суть ее в том, что есть один главный сервер, к которому подключаются все клиенты. Однако клиенты — это машины, на которых размещены файлы, поэтому, когда один клиент запрашивает файл у другого, он должен создать с ним соединение. Когда клиент изначально подключается к основному серверу, я получаю его IP и порт (я думаю) с помощью:
int client_len = sizeof(client);
int new_sd = accept(sd, (struct sockaddr *)&client, &client_len);
char str[INET_ADDRSTRLEN];
inet_ntop(AF_INET, &(client.sin_addr), str, INET_ADDRSTRLEN);
//printf("%s\n", str);
int port = (int) ntohs(client.sin_port);
//printf("Port is: %d\n", (int) ntohs(client.sin_port));
Printf дает мне 127.0.0.1 и 40XXX. Основной сервер использует 127.0.0.1 и порт 3000. Поэтому я почти уверен, что у меня правильный IP-адрес и порт клиента, НО когда я пытаюсь установить соединение между двумя клиентами, используя 127.0.0.1 и 40XXX, это не работает. Функция подключения продолжает возвращать ошибку. Вот код, пытающийся установить соединение между двумя клиентами:
if ((cd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
fprintf(stderr, "Can't creat a socket\n");
exit(1);
}
bzero((char *)&cServer, sizeof(struct sockaddr_in));
cServer.sin_family = AF_INET;
cServer.sin_port = htons(cPort);
if (inet_pton(AF_INET, cAddress, &cServer.sin_addr) == -1) {
printf("inet_pton error occured\n");
exit(1);
}
/* Connecting to the server */
if (connect(cd, (struct sockaddr *)&cServer, sizeof(cServer)) == -1) {
fprintf(stderr, "Can't connect to server\n");
exit(1);
}
cPort — это int, а cAddress — это массив символов.
Вот код от клиента, пытающегося создать соединение для входящих соединений. Код для получения IP-адреса и порта возвращает 0.0.0.0 и 0 соответственно.
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
fprintf(stderr, "Can't creat a socket\n");
exit(1);
}
/* Bind an address to the socket */
bzero((char *)&clientServer, sizeof(struct sockaddr_in));
clientServer.sin_family = AF_INET;
clientServer.sin_port = 0;
clientServer.sin_addr.s_addr = htonl(INADDR_ANY);
if (bind(sockfd, (struct sockaddr *)&clientServer, sizeof(clientServer)) == -1){
fprintf(stderr, "Can't bind name to socket\n");
exit(1);
}
char str[INET_ADDRSTRLEN];
inet_ntop(AF_INET, &(clientServer.sin_addr), str, INET_ADDRSTRLEN);
printf("%s\n", str);
int clientServerPort = (int) ntohs(clientServer.sin_port);
printf("Port is: %d\n", (int) ntohs(client.sin_port));
/* queue up to 10 connect requests */
listen(sockfd, 10);
Вся помощь очень ценится!