send_to возвращает EINVAL в udp

Я создаю простое приложение для передачи файлов, но send_to возвращает EINVAL, когда я пытаюсь отправить со стороны сервера клиенту, в то время как send_to и recv_from отлично работают на стороне клиента. port_number, portno, hostname передаются в качестве аргументов.

Код для настройки сервера:

portno=port_number;

    sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    if (sockfd < 0)
      error("ERROR opening socket");


    optval = 1;

    setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR,
         (const void *)&optval , sizeof(int));


    bzero((char *) &serveraddr, sizeof(serveraddr));
    serveraddr.sin_family = AF_INET;
    serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);
    serveraddr.sin_port = htons((unsigned short)portno);


    if (bind(sockfd, (struct sockaddr *) &serveraddr,
       sizeof(serveraddr)) < 0)
      error("ERROR on binding");
      //getsockname(sockfd, (struct sockaddr *)&clientaddr, &clientlen);
      cout<<"server port no"<<serveraddr.sin_port<<endl;
    clientlen = sizeof(clientaddr);

Код для настройки клиента: hostname = name; портно = порт;

/* socket: create the socket */
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd < 0)
 error("ERROR opening socket");



/* gethostbyname: get the server's DNS entry */
server = gethostbyname(hostname);
if (server == NULL)
{
  fprintf(stderr,"ERROR, no such host as %s\n", hostname);
  exit(-1);
}

/* build the server's Internet address */
memset((char *) &serveraddr,0, sizeof(serveraddr));
serveraddr.sin_family = AF_INET;
bcopy((char *)server->h_addr,
(char *)&serveraddr.sin_addr.s_addr, server->h_length);
serveraddr.sin_port = htons(portno);
serverlen = sizeof(serveraddr);
struct timeval tv;

tv.tv_sec = 1;                       // TIMEOUT IN SECONDS
tv.tv_usec = 0;                      // DEFAULT
if(setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)) < 0)
  printf("Cannot Set SO_RCVTIMEO for socket\n");

Команда, которая не работает:

  if(sendto (sockfd, ack, strlen(ack), 0,(struct sockaddr*) 
  &clientaddr,sizeof(clientaddr) < 0)
       error("ERROR in sending hello_ACK");

где clientadddr объявлен как структура sockaddr_in


person Arka Pal    schedule 01.04.2018    source источник
comment
clientaddr не был инициализирован.   -  person user207421    schedule 01.04.2018


Ответы (1)


Ошибка EINVAL генерируется из-за недопустимого аргумента. Таким образом, вы должны либо инициализировать clientaddr, как вы сделали для serveraddr, либо, если вы получаете сообщение HELLO ранее/или любое другое сообщение от клиента, вы можете передать clientaddr в качестве аргумента для этого вызова recvFrom.

recvfrom(socketFileDescriptor, buffer, bufferSize,0,(struct sockaddr *) &clientaddr, &clientlen))

здесь clientlen равен sizeof(clientaddr), если вы пишете на C.

person Aman Purwar    schedule 01.04.2018