我正在尝试绑定服务器套接字,以便我可以接收和侦听来自其他客户端的传入消息。但我无法绑定,它返回错误 - 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:参数无效
非常感谢收到任何意见,谢谢!
答案 0 :(得分:2)
问题在于您创建套接字的方式。
if ((sockfd = socket(PF_LOCAL, SOCK_STREAM, 0)) == -1)
此处您正在为PF_LOCAL
创建套接字,而不想为AF_INET
系列创建。