Сокет назначил порт сервера 0 после sendbase C UDP

Я пишу клиент-серверное приложение через 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... Я отправляю первый пакет раньше...

0 ответов

Другие вопросы по тегам