Проблемы создания и привязки порта в unix. (Новое в сетевом программировании) - PullRequest
1 голос
/ 18 августа 2010

У меня проблемы с созданием порта в Unix.Этот код продолжает возвращать «Ошибка создания сокета (3)», что не имеет никакого смысла, поскольку для вывода строки ошибки sockfd должен быть меньше 0.

server.c:

int main (int argc, char **argv)
{
  int sockfd;
  struct sockaddr_in server_sockaddr;
  char buff[TRANSFER_BUFFER_LEN];

  /* check number of command line arguments */
  if (argc < 2)
  {
    fprintf (stderr, "Usage: %s <port>\n");
    exit (EXIT_FAILURE);
  }

  /* create server socket */
  if ((sockfd = createUdpSocket (&sockfd,
                                 &server_sockaddr,
                                 atoi (*(argv + 1)))
      ) < 0);
  {
    fprintf (stderr, "Error creating socket (%d).\n", sockfd);
    exit (EXIT_FAILURE);
  }

  ...

return 0;
}

socket_utils.h:

int createUdpSocket (int *sockfd, struct sockaddr_in *client_sockaddr, int port)
{
  /* create socket */
  if ((*sockfd = socket (AF_INET, SOCK_DGRAM, 0)) == -1)
    return -1;

  memset (client_sockaddr, 0, sizeof (struct sockaddr_in));
  client_sockaddr->sin_family = AF_INET;
  client_sockaddr->sin_addr.s_addr = htonl (INADDR_ANY);
  client_sockaddr->sin_port = htons (port);

  /* bind socket */
  if (!bind (*sockfd, (struct sockaddr*) &client_sockaddr, sizeof (sockfd)))
  {
    close (*sockfd);
    return -2;
  }

  return *sockfd;
}

Есть идеи?Эта же функция прекрасно работает в моей клиентской программе, которая не принимает значение порта (вместо этого принимает 0).

Cheers,

Rhys

Ответы [ 2 ]

6 голосов
/ 18 августа 2010
if ((sockfd = createUdpSocket (&sockfd,
                                 &server_sockaddr,
                                 atoi (*(argv + 1)))
      ) < 0);

Упс, откуда взялась эта точка с запятой?У вас есть убежище!


Кроме того, эта строка не будет делать то, что вы ожидаете:

if (!bind (*sockfd, (struct sockaddr*) &client_sockaddr, sizeof (sockfd)))

Функция bind() возвращает 0 в случае успеха, -1 в случаеотказ.Ваш тест выполнен в обратном направлении и выдаст ошибку, когда связывание будет успешным, а не неудачным.Он также получил неправильный &, где вы говорите &client_sockaddr.И третий аргумент должен быть размером структуры sockaddr_in, а не sizeof(sockfd).Попробуйте:

if (bind (*sockfd, (struct sockaddr*) client_sockaddr, sizeof (struct sockaddr_in)) != 0)

И, черт возьми, пока мы здесь, в вашей распечатке об использовании отсутствует аргумент argv[0]:

fprintf (stderr, "Usage: %s <port>\n");
0 голосов
/ 18 августа 2010

Похоже, у вас слишком много скобок, что вводит в заблуждение код и вас самих ... Кроме того, вот полезное руководство для понимания сетевого программирования с помощью сокетов, любезно предоставленного beej ...

...