сокет назначил порт сервера 0 после sendbase C UDP - PullRequest
0 голосов
/ 04 декабря 2018

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

...