socket bind()返回错误EINVAL

时间:2015-10-01 04:22:24

标签: c linux sockets

我正在尝试绑定服务器套接字,以便我可以接收和侦听来自其他客户端的传入消息。但我无法绑定,它返回错误 - EINVAL(无效参数)。我已经完成了之前提到的与此错误相关的问题,并且Linux手册页说'套接字已经绑定到一个地址,并且该协议不支持绑定到新地址;或者套接字已经关闭。'

以下是c:

中有问题的服务器代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <unistd.h>
#include <sys/types.h>
#include <netinet/in.h>

#define LISTEN_BACKLOG 5

#define handle_error(msg) \
  do { perror(msg); exit(EXIT_FAILURE); } while(0)

int main(int argc, char* argv[])
{
  int sockfd, cfd;
  struct sockaddr_in myaddr, cl_addr;
  socklen_t cl_len;
  int quit = 0, reuse = 1;

  if (argc < 2)
  {
    fprintf(stderr, "ERROR, no port provided\n");
    exit(1);
  }

  if ((sockfd = socket(PF_LOCAL, SOCK_STREAM, 0)) == -1)
    handle_error("socket");

  printf("socket created.\n");

#ifdef SO_REUSEADDR
  if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (const char*)&reuse, sizeof(reuse)) < 0)
    perror("setsockopt(SO_REUSEADDR) failed");
#endif

#ifdef SO_REUSEPORT
    if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEPORT, (const char*)&reuse, sizeof(reuse)) < 0)
        perror("setsockopt(SO_REUSEPORT) failed");
#endif

  memset(&myaddr, 0, sizeof(myaddr));
  myaddr.sin_family = AF_INET;
  myaddr.sin_addr.s_addr = htonl(INADDR_ANY);
  myaddr.sin_port = htons(atoi(argv[1]));

  printf("portno: %d\n", atoi(argv[1]));

  if (bind(sockfd, (struct sockaddr *) &myaddr, sizeof(myaddr)) < 0)
    handle_error("bind");
  printf("bind successful\n");

  close(sockfd);
  unlink((const char *) &myaddr);

  return 0;
}

当我尝试启动服务器时,我收到错误EINVAL,如下所示:

$ ./server 8032

套接字创建。

portno:8032

bind:参数无效

非常感谢收到任何意见,谢谢!

1 个答案:

答案 0 :(得分:2)

问题在于您创建套接字的方式。

 if ((sockfd = socket(PF_LOCAL, SOCK_STREAM, 0)) == -1)

此处您正在为PF_LOCAL创建套接字,而不想为AF_INET系列创建。