簡體   English   中英

在UNIX中創建和綁定端口時出現問題。 (網絡編程新手)

[英]Problems creating and binding port in unix. (New to network programming)

我在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)。

干杯,

里斯

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");

似乎您有太多的括號,這使代碼和您自己感到困惑。...此外,這是一個有用的指南 ,可幫助您理解基於網絡的網絡編程,其中包括beej ...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM