简体   繁体   English

在UNIX中创建和绑定端口时出现问题。 (网络编程新手)

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

I'm having trouble creating a port in Unix. 我在Unix中创建端口时遇到问题。 This code keeps returning "Error creating socket (3)", which makes no sense whatsoever, since sockfd must be smaller than 0 to print the error line. 这段代码不断返回“错误创建套接字(3)”,这毫无意义,因为sockfd必须小于0才能打印错误行。

server.c: 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: 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;
}

Any ideas? 有任何想法吗? This same function works fine in my client program that doesn't take a port value (instead takes 0). 这个函数在我的不带端口值的客户端程序中也可以正常工作(取值为0)。

Cheers, 干杯,

Rhys 里斯

if ((sockfd = createUdpSocket (&sockfd,
                                 &server_sockaddr,
                                 atoi (*(argv + 1)))
      ) < 0);

Whoops, where'd that semi-colon come from? 哎呀,那个分号是哪里来的? You've got a stowaway! 你有个偷东西!


Also, this line won't do what you expect: 此外,此行将无法满足您的期望:

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

The bind() function returns 0 on success, -1 on failure. bind()函数成功返回0,失败返回-1。 Your test is backwards and will error out when bind succeeds rather than fails. 您的测试是向后的,并且在绑定成功而不是失败时会出错。 It's also got an incorrect & where you say &client_sockaddr . 它还有一个不正确的&您在哪里说&client_sockaddr And the third argument needs to be the size of the sockaddr_in struct, not sizeof(sockfd) . 第三个参数必须是sockaddr_in结构的大小,而不是sizeof(sockfd) Try: 尝试:

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

And heck while we're here, your usage printout is missing its argv[0] argument: 哎呀,当我们在这里时,您的用法打印输出缺少其argv[0]参数:

fprintf (stderr, "Usage: %s <port>\n");

似乎您有太多的括号,这使代码和您自己感到困惑。...此外,这是一个有用的指南 ,可帮助您理解基于网络的网络编程,其中包括beej ...

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM