Здравствуйте господа! Помогите мне пожалуйста разобраться с одним вопросом. Есть сокеты (есть и потоковый, и дадаграммный), которые сидят на портах и слушают их. Иногда им приходят пакеты. Как узнать IP адрес отправителя этих пакетов?
Может код поможет Код (Text): if(getpeername(hAccept,(sockaddr *) &sin,(int *)&temp)!=SOCKET_ERROR) { if(p=inet_ntoa(sin.sin_addr)) { strcpy(szRemIp,p); } }
спасибо. с потоковыми сокетом понятно. а как быть с датаграмным? getpeername как я понял не работает с ними.
int PASCAL FAR recvfrom (SOCKET s, char FAR * buf, int len, int flags, struct sockaddr FAR *from, int FAR * fromlen);
Я так понял тебя интересует UDP. Спускаешся на уровень ниже и ловишь IP-пакеты. В любом из них есть адреса отправителя и получателя.
>> с потоковыми сокетом понятно. а как быть с датаграмным? getpeername как я понял не работает с ними. Код (Text): SOCKET sock; struct sockaddr_in sin; char buff[BUFFSIZE]; if ((sock = socket(PF_INET, SOCK_DGRAM, 0)) < 0) { fprintf(stderr, "socket creation error\n"); return -1; } bzero(&sin, sizeof(sin)); sin.sin_family = AF_INET; sin.sin_port = htons(atoi(argv[1])); sin.sin_addr.s_addr = INADDR_ANY; if (bind(sock, (struct sockaddr *)&sin, sizeof(sin))) { fprintf(stderr, "bind() error\n"); close(sock); return -1; } while (1) { struct sockaddr_in client_addr; int client_addr_size = sizeof(client_addr); bzero(&buff, sizeof(buff)); int len = recvfrom(sock, buff, sizeof(buff), 0, (struct sockaddr *)&client_addr, &client_addr_size); printf("client %s\n", inet_ntoa(client_addr.sin_addr)); // processing client connection... } closesocket(sock);