Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
bind()返回的权限被拒绝C_C_Sockets_Network Programming - Fatal编程技术网

bind()返回的权限被拒绝C

bind()返回的权限被拒绝C,c,sockets,network-programming,C,Sockets,Network Programming,我试图编写一个程序,将端口号作为命令行参数接收并启动HTTP服务器。我正在传递一个listenfd以接受()来执行此操作。但是,我从open_listenfd()获得的权限被拒绝,然后从Accept()获得错误的描述符错误 open_listenfd()和Accept()函数是从 我正在将端口100传递给程序: int open_listenfd(int port) { int listenfd, optval=1; struct sockaddr_in serveraddr;

我试图编写一个程序,将端口号作为命令行参数接收并启动HTTP服务器。我正在传递一个listenfd以接受()来执行此操作。但是,我从open_listenfd()获得的权限被拒绝,然后从Accept()获得错误的描述符错误

open_listenfd()和Accept()函数是从

我正在将端口100传递给程序:

int open_listenfd(int port)
{
   int listenfd, optval=1;
   struct sockaddr_in serveraddr;

   /* Create a socket descriptor */
   if ((listenfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
      return -1;

   /* Eliminates "Address already in use" error from bind */
   if (setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, (const void *)&optval , sizeof(int)) < 0)
      return -1;

   /* Listenfd will be an endpoint for all requests to port on any IP address for this host */
   bzero((char *) &serveraddr, sizeof(serveraddr));
   serveraddr.sin_family = AF_INET;
   serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);
   serveraddr.sin_port = htons((unsigned short)port);
   if (bind(listenfd, (SA *)&serveraddr, sizeof(serveraddr)) < 0)
      return -1;

   /* Make it a listening socket
    * ready to accept connection
    * requests */
   if (listen(listenfd, LISTENQ) < 0)
      return -1;

   return listenfd;
}

int Open_listenfd(int port)
{
   int rc;

   if ((rc = open_listenfd(port)) < 0)
      unix_error("Open_listenfd error");
   return rc;
}

int Accept(int s, struct sockaddr *addr, socklen_t *addrlen)
{
   int rc;

   if ((rc = accept(s, addr, addrlen)) < 0)
      unix_error("Accept error");
   return rc;
}

int main(int argc, char **argv) {
   int listenfd, connfd, port, clientlen;
   struct sockaddr_in clientaddr;
   struct hostent *phost;
   char *phostaddr;

   port = atoi(argv[1]);

   listenfd = Open_listenfd(port);

   clientlen = sizeof(clientaddr);

   connfd = Accept(listenfd, (SA *)&clientaddr, &clientlen);
   printf("%d\n", connfd);
   printf("%s\n", strerror(errno));

   return 0;
}

如何做到这一点?

1024以下的端口在Linux中被视为具有特权,因此您需要是root用户才能在端口上打开套接字<1024

您是否以sudo身份运行代码?您可能需要超级用户权限才能绑定到100。或者,如果您没有sudo访问权限,请使用更高的端口尝试5555,因为您的代码结构不良。实际上是
bind()
导致了这个错误,而不是
listen()
,但是你编码它的方式,很难说出来。您需要在系统调用错误时立即调用
perror()
,并指出导致错误的原因。最后一个问题的答案是一个循环,可能是一个线程。前1024个端口是“特殊”端口,通常需要超级用户权限才能使用它们。正如@SamRedway所述,请使用1024以上的端口号。“unix_error()”函数不是可用函数的一部分。强烈建议使用“peror()”
GET /path HTTP/1.1\r\n\r\n