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
C Bind()在我的计算机中返回-1,而在其他计算机中则正常运行_C_Sockets_Linux Mint - Fatal编程技术网

C Bind()在我的计算机中返回-1,而在其他计算机中则正常运行

C Bind()在我的计算机中返回-1,而在其他计算机中则正常运行,c,sockets,linux-mint,C,Sockets,Linux Mint,我正在使用LinuxMint,我正在尝试开发一个服务器端应用程序,该应用程序将侦听特定端口。我尝试将端口设置为使用htons(0),但仍然存在相同的问题 #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <linux/in.h> #include <stdlib.h> #include <unistd.h> #include

我正在使用LinuxMint,我正在尝试开发一个服务器端应用程序,该应用程序将侦听特定端口。我尝试将端口设置为使用
htons(0)
,但仍然存在相同的问题

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <linux/in.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <stdbool.h>
#include <math.h>

float calculator(char *calculation);

extern int errno;

int main(int argc,char **argv)
{
  int clientaddrlen, listenfd, connectfd, bytes_rcvd, listen_queue_size=1;
  short int port_no;
  char readBuff[1000];
  struct sockaddr_in servaddr, clientaddr;
  pid_t  childpid;
  int status;
  char sendBuff[1025];

  if(argc!=3){
    printf("Usage Format: ./server -p <PortNumber>\n");
    printf("Sample Run: ./server -p 2000\n");
    exit(1);
  }
  port_no = atoi(argv[argc-1]);
  printf("Server running at port #%d\n", port_no);

  // Create server socket.
  if ( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){
    fprintf(stderr, "Cannot create server socket! errno %i: %s\n",errno,strerror(errno));
    exit(1);
  }

  printf("Server socket created\n");
  // Bind (attach) this process to the server socket.
  servaddr.sin_family = AF_INET;
  servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
  servaddr.sin_port = htons(port_no);
  errno = bind(listenfd, (struct sockaddr *) &servaddr, sizeof(servaddr));
  if(errno < 0){
    printf("Server bind failure errno %i: %s\n",errno,strerror(errno));
    exit(1);
  }
这就在bind系统调用之后,出于某种原因,bind系统调用在我的系统中返回-1。我的系统是否存在导致此问题的原因?

bind()
在内部设置
errno
,以防出现故障。不要覆盖它

发件人:

返回值

成功时,返回零。在出现错误时,返回-1,并正确设置errno

那么这个

  errno = bind(listenfd, (struct sockaddr *) &servaddr, sizeof(servaddr));
  if(errno < 0){
    printf("Server bind failure errno %i: %s\n",errno,strerror(errno));
    exit(1);
  }
errno=bind(listenfd,(struct sockaddr*)&servaddr,sizeof(servaddr));
如果(错误号<0){
printf(“服务器绑定失败错误号%i:%s\n”,错误号,strerror(错误号));
出口(1);
}
应该看起来像:

  int result = bind(listenfd, (struct sockaddr *) &servaddr, sizeof(servaddr));
  if(result < 0) {
    fprintf(stderr, "Server bind failure errno %i: %s\n", errno, strerror(errno));
    exit(EXIT_FAILURE);
  }
int result=bind(listenfd,(struct sockaddr*)&servaddr,sizeof(servaddr));
如果(结果<0){
fprintf(stderr,“服务器绑定失败错误号%i:%s\n”,错误号,strerror(错误号));
退出(退出失败);
}
或者更好:

  int result = bind(listenfd, (struct sockaddr *) &servaddr, sizeof servaddr);
  if(result < 0) {
    perror("Server - bind() failed");
    exit(EXIT_FAILURE);
  }
int result=bind(listenfd,(struct sockaddr*)&servaddr,sizeof servaddr);
如果(结果<0){
perror(“服务器绑定()失败”);
退出(退出失败);
}
注:错误信息应转到标准错误输出。

bind()
在故障情况下在内部设置
errno
。不要覆盖它

发件人:

返回值

成功时,返回零。在出现错误时,返回-1,并正确设置errno

那么这个

  errno = bind(listenfd, (struct sockaddr *) &servaddr, sizeof(servaddr));
  if(errno < 0){
    printf("Server bind failure errno %i: %s\n",errno,strerror(errno));
    exit(1);
  }
errno=bind(listenfd,(struct sockaddr*)&servaddr,sizeof(servaddr));
如果(错误号<0){
printf(“服务器绑定失败错误号%i:%s\n”,错误号,strerror(错误号));
出口(1);
}
应该看起来像:

  int result = bind(listenfd, (struct sockaddr *) &servaddr, sizeof(servaddr));
  if(result < 0) {
    fprintf(stderr, "Server bind failure errno %i: %s\n", errno, strerror(errno));
    exit(EXIT_FAILURE);
  }
int result=bind(listenfd,(struct sockaddr*)&servaddr,sizeof(servaddr));
如果(结果<0){
fprintf(stderr,“服务器绑定失败错误号%i:%s\n”,错误号,strerror(错误号));
退出(退出失败);
}
或者更好:

  int result = bind(listenfd, (struct sockaddr *) &servaddr, sizeof servaddr);
  if(result < 0) {
    perror("Server - bind() failed");
    exit(EXIT_FAILURE);
  }
int result=bind(listenfd,(struct sockaddr*)&servaddr,sizeof servaddr);
如果(结果<0){
perror(“服务器绑定()失败”);
退出(退出失败);
}
注:错误信息应转到标准错误输出。

bind()
在故障情况下在内部设置
errno
。不要覆盖它

发件人:

返回值

成功时,返回零。在出现错误时,返回-1,并正确设置errno

那么这个

  errno = bind(listenfd, (struct sockaddr *) &servaddr, sizeof(servaddr));
  if(errno < 0){
    printf("Server bind failure errno %i: %s\n",errno,strerror(errno));
    exit(1);
  }
errno=bind(listenfd,(struct sockaddr*)&servaddr,sizeof(servaddr));
如果(错误号<0){
printf(“服务器绑定失败错误号%i:%s\n”,错误号,strerror(错误号));
出口(1);
}
应该看起来像:

  int result = bind(listenfd, (struct sockaddr *) &servaddr, sizeof(servaddr));
  if(result < 0) {
    fprintf(stderr, "Server bind failure errno %i: %s\n", errno, strerror(errno));
    exit(EXIT_FAILURE);
  }
int result=bind(listenfd,(struct sockaddr*)&servaddr,sizeof(servaddr));
如果(结果<0){
fprintf(stderr,“服务器绑定失败错误号%i:%s\n”,错误号,strerror(错误号));
退出(退出失败);
}
或者更好:

  int result = bind(listenfd, (struct sockaddr *) &servaddr, sizeof servaddr);
  if(result < 0) {
    perror("Server - bind() failed");
    exit(EXIT_FAILURE);
  }
int result=bind(listenfd,(struct sockaddr*)&servaddr,sizeof servaddr);
如果(结果<0){
perror(“服务器绑定()失败”);
退出(退出失败);
}
注:错误信息应转到标准错误输出。

bind()
在故障情况下在内部设置
errno
。不要覆盖它

发件人:

返回值

成功时,返回零。在出现错误时,返回-1,并正确设置errno

那么这个

  errno = bind(listenfd, (struct sockaddr *) &servaddr, sizeof(servaddr));
  if(errno < 0){
    printf("Server bind failure errno %i: %s\n",errno,strerror(errno));
    exit(1);
  }
errno=bind(listenfd,(struct sockaddr*)&servaddr,sizeof(servaddr));
如果(错误号<0){
printf(“服务器绑定失败错误号%i:%s\n”,错误号,strerror(错误号));
出口(1);
}
应该看起来像:

  int result = bind(listenfd, (struct sockaddr *) &servaddr, sizeof(servaddr));
  if(result < 0) {
    fprintf(stderr, "Server bind failure errno %i: %s\n", errno, strerror(errno));
    exit(EXIT_FAILURE);
  }
int result=bind(listenfd,(struct sockaddr*)&servaddr,sizeof(servaddr));
如果(结果<0){
fprintf(stderr,“服务器绑定失败错误号%i:%s\n”,错误号,strerror(错误号));
退出(退出失败);
}
或者更好:

  int result = bind(listenfd, (struct sockaddr *) &servaddr, sizeof servaddr);
  if(result < 0) {
    perror("Server - bind() failed");
    exit(EXIT_FAILURE);
  }
int result=bind(listenfd,(struct sockaddr*)&servaddr,sizeof servaddr);
如果(结果<0){
perror(“服务器绑定()失败”);
退出(退出失败);
}

注意:错误信息应转到标准错误输出。

我使用的是错误无误。它是在
bind()
函数中内部设置的,我需要设置一个不同的变量来存储
bind()
的返回值

因此,将我的代码更改为:

 int result = bind(listenfd, (struct sockaddr *) &servaddr, sizeof(servaddr));

  if(result < 0)
    {
      printf("Server bind failure errno %i: %s\n",errno,strerror(errno));
      exit(-1);
    }
int result=bind(listenfd,(struct sockaddr*)&servaddr,sizeof(servaddr));
如果(结果<0)
{
printf(“服务器绑定失败错误号%i:%s\n”,错误号,strerror(错误号));
出口(-1);
}
我找到了真正的
errno
,它是13

Errorno 13表示权限被拒绝


在我的系统中,
1080
下的端口是为root用户保留的,这就是我出错的原因。而在其他系统中,它必须超过1024。我不知道为什么
htons(0)
会出错,但当我将端口改为
2000
而不是
1025
时,它工作了。为了使用1080以下的端口,我必须使用
sudo
运行应用程序

我用错了。它是在
bind()
函数中内部设置的,我需要设置一个不同的变量来存储
bind()
的返回值

因此,将我的代码更改为:

 int result = bind(listenfd, (struct sockaddr *) &servaddr, sizeof(servaddr));

  if(result < 0)
    {
      printf("Server bind failure errno %i: %s\n",errno,strerror(errno));
      exit(-1);
    }
int result=bind(listenfd,(struct sockaddr*)&servaddr,sizeof(servaddr));
如果(结果<0)
{
printf(“服务器绑定失败错误号%i:%s\n”,错误号,strerror(错误号));
出口(-1);
}
我找到了真正的
errno
,它是13

Errorno 13表示权限被拒绝

在我的系统中,
1080
下的端口是为root用户保留的,这就是我出错的原因。在