Сокеты: не меняется адрес клиента

Модератор: Модераторы разделов

Elfinith
Сообщения: 14
ОС: Mandriva Linux

Сокеты: не меняется адрес клиента

Сообщение Elfinith »

Пытаюсь написать сервер, принимающий строковые сообшения через сокеты (как с windows-клиентов, так и с linux). Возникла следующая проблема - после первого соединения структура claddr не изменяет больше своего значения, вне зависимости с какого реального адреса осуществляется подключение. Подскажите, где косяк?

Код:

Код:

#include <stdio.h> #include <string.h> #include <sys/socket.h> #include <sys/types.h> #include <string.h> #include <sys/un.h> #include <netinet/in.h> #define SOCK_PROTOCOL PF_INET #define SOCK_TYPE SOCK_STREAM #define ADDR_FAMILY AF_INET #define SOCK_PORT 277 #define BUF_LEN 256 #define strEXIT "EXIT" int main (int argc, char **argv) { int sock, client_sock, bytes; size_t claddr_size; struct sockaddr_in saddr, claddr; struct hostent *hostinfo; char *buf; buf = (char *) malloc (BUF_LEN); claddr_size = sizeof(claddr); if (argc < 2) { fprintf (stderr, "not enough params\n"); return 1; } sock = socket (SOCK_PROTOCOL, SOCK_TYPE, 0); if (sock == -1) { fprintf (stderr, "socket() error\n"); return 2; } bzero(&saddr, sizeof(saddr)); saddr.sin_port = htons(SOCK_PORT); saddr.sin_family = ADDR_FAMILY; if (inet_pton(ADDR_FAMILY, argv[1], &saddr.sin_addr) <= 0) { fprintf(stderr, "inrt_pton() error with IP=%s\n", argv[1]); return 3; } if (bind (sock, (struct sockaddr *) &saddr, sizeof(saddr)) == -1) { fprintf (stderr, "bind() error\n"); return 4; } char nameBuf[INET_ADDRSTRLEN]; bzero(buf,BUF_LEN); listen(sock,5); while (strcoll(buf,strEXIT) != 0) { bzero(buf,BUF_LEN); client_sock = accept(sock,(struct sockaddr *)&claddr, &claddr_size); if (client_sock == -1) { fprintf(stderr, "accept() error\n"); return 5; } if (bytes = recvfrom(client_sock, buf, BUF_LEN-1, 0, (struct sockaddr *)&claddr, &claddr_size) == -1) { fprintf(stderr,"recvfrom() error\n"); return 6; } fprintf(stdout," >> '%s'\n", buf); fprintf(stdout,"from %s\n", inet_ntop(ADDR_FAMILY, &claddr.sin_addr,nameBuf,sizeof(nameBuf))); close(client_sock); } close(sock); free(buf); fprintf(stdout,"done.\n"); fgetc(stdin); return 0; }


Вывод strace (соединение осуществлялось поочерёдно с двух разных клиентов, но адрес сокета клиента, как видно, один и тот-же ):

Код:

socket(PF_INET, SOCK_STREAM, IPPROTO_IP) = 4 bind(4, {sa_family=AF_INET, sin_port=htons(277), sin_addr=inet_addr("192.168.0.245")}, 16) = 0 listen(4, 5) = 0 accept(4, {sa_family=AF_INET, sin_port=htons(3392), sin_addr=inet_addr("192.168.0.75")}, [16]) = 6 recvfrom(6, "MESSAGE1", 255, 0, {sa_family=AF_INET, sin_port=htons(3392), sin_addr=inet_addr("192.168.0.75")}, [0]) = 8 fstat64(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 1), ...}) = 0 mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7f48000 write(1, " >> \'MESSAGE1\'\n", 15) = 15 write(1, "from 192.168.0.75\n", 18) = 18 close(6) = 0 accept(4, {sa_family=AF_INET, sin_port=htons(3392), sin_addr=inet_addr("192.168.0.75")}, [16]) = 8 recvfrom(8, "#MESSAGE2", 255, 0, {sa_family=AF_INET, sin_port=htons(3392), sin_addr=inet_addr("192.168.0.75")}, [0]) = 9 write(1, " >> \'#MESSAGE2\'\n", 16) = 16 write(1, "from 192.168.0.75\n", 18) = 18 close(8) = 0 accept(4, {sa_family=AF_INET, sin_port=htons(3392), sin_addr=inet_addr("192.168.0.75")}, [16]) = 9 recvfrom(9, "EXIT", 255, 0, {sa_family=AF_INET, sin_port=htons(3392), sin_addr=inet_addr("192.168.0.75")}, [0]) = 4 write(1, " >> \'EXIT\'\n", 11) = 11 write(1, "from 192.168.0.75\n", 18) = 18 close(9) = 0 close(4) = 0 write(1, "done.\n", 6) = 6 fstat64(0, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 1), ...}) = 0 mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7f47000 read(0, "\n", 1024) = 1 munmap(0xb7f48000, 4096) = 0 exit_group(0) = ?
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: Сокеты: не меняется адрес клиента

Сообщение watashiwa_daredeska »

Может, клиенты за NAT'ом?
Спасибо сказали:
Elfinith
Сообщения: 14
ОС: Mandriva Linux

Re: Сокеты: не меняется адрес клиента

Сообщение Elfinith »

watashiwa_daredeska писал(а):
09.10.2008 12:11
Может, клиенты за NAT'ом?

да нет, NAT-а нету
Спасибо сказали: