Я пишу клиент-серверное приложение через udp.Я сделал эти шаги:
memset((void *)&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(serverport);
if(inet_pton(AF_INET, argv[1], &servaddr.sin_addr) < 0)
err_func("Error in inet_pton()\n");
...
if( (socketfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
err_func("Error in socket()");
...
if(sendto(socketfd,&pckt, sizeof(pckt), 0, (struct sockaddr *)&servaddr,sizeof(servaddr)) == -1)
err_func("Error in sendto()\n");
...
struct sockaddr_in addr;
socklen_t len;
if(getsockname(socketfd,(struct sockaddr *) &addr, &len) != 0)
err_func("Error in getsockname()\n");
printf("My port is %d\n", addr.sin_port);
Теперь моя проблема в том, что этот код будет печатать «Мой порт 0», но почему?и как это возможно?(0 - это забавно, что означает, что SO назначит порт, который не используется случайным образом, но после того, как SO отправил SO, назначил порт моему сокету, или нет?)
Странная вещьчто после 2 или 3 sendto мой код начинает печатать другое значение для addr.sin_port.Почему он не работает нормально после первого sendto?
Мне нужно привязать порт, потому что на сервере я создаю процесс, который выполняет соединение с этим клиентским адресом, и он получает все пакеты от клиента.
Я пытался запустить связывание с клиентом перед запуском первого sendto, но похоже, что связывание не имеет никакого эффекта (возможно, я заполняю struct sockaddr_in, использованную в связывании, неправильно? Я не знаю).
Если вам нужно, я могу выложить весь код с запуска main ... Я отправляю первый пакет раньше ...