大家晚上好, 为了好玩,我正在尝试 *NIX 套接字和 TCP/IP。现在,为了开始工作,我只是尝试在两个端点上创建一个套接字,并来回创建一个基本的文本聊天程序。现在,在我启动并运行之前,我遇到了绑定(bind)“无效参数”:
user@user-VirtualBox:~/sockets$ ./socket
sock=3
s_->sin_family = 2
s_->sin_port = 3879
s_->sin_addr.s_addr = 0
sockfd = 3
s_->sin_family = 2
s_->sin_port = 3879
s_->sin_addr.s_addr = 0
Socket bind error: Invalid argument
sizeof(s_) = 8
代码如下。所以,据我了解,INADDR_ANY应该是255.255.225.255 = 0; AF_INET 为 2;和 sin_port,好吧,我前后查看了二进制文件,不确定我是否理解 9000 在主机顺序中如何从 9000 表示为 3879,但假设这不是问题。此外,由于 1 是 stdout,2 是 stderr,我假设高于此的任何内容都是动态分配的,因此 3 对于套接字文件描述符来说应该没问题。
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>
#include <errno.h>
void setSocket(struct sockaddr_in* s_){
s_->sin_family=AF_INET;
s_->sin_port=htons(9999);
s_->sin_addr.s_addr=INADDR_ANY;
memset(&(s_->sin_zero), '\0', 8);
printf("s_->sin_family = %i\n", s_->sin_family);
printf("s_->sin_port = %i\n", s_->sin_port);
printf("s_->sin_addr.s_addr= %i\n", s_->sin_addr.s_addr);
}
void createSocket(int *sock){
if ((*sock = socket(AF_INET, SOCK_STREAM, 0)) == -1){
fprintf(stderr, "Socket creation error: %s\n", strerror(errno));
exit(1);
}
printf("sock = %i\n", *sock);
fflush(stdout);
}
void bindSocket(int sock, struct sockaddr_in* s_){
printf("s_->sin_family = %i\n",s_->sin_family);
printf("s_->sin_port = %i\n",s_->sin_port);
printf("s_->sin_addr.s_addr = %i\n",s_->sin_addr.s_addr);
if((bind(sock, (struct sockaddr*)s_, (socklen_t)sizeof(s_))) == -1){
fprintf(stderr, "Socket bind error: %s\n", strerror(errno));
}
printf("sizeof(s_) = %lu\n", sizeof(s_));
}
int main(int argc, char* argv[]){
int sockfd;
struct sockaddr_in socket_;
createSocket(&sockfd);
setSocket(&socket_);
printf("sockfd = %i\n", sockfd);
fflush(stdout);
bindSocket(sockfd, &socket_);
exit(0);
}
最佳答案
我认为问题在于
sizeof() inside your bind()... 's_' is a pointer, so its sizeof is (probably) 4... You need to dereference it:
if((bind(sock, (struct sockaddr*)s_, (socklen_t)sizeof(*s_))) == -1){
fprintf(stderr, "Socket bind error: %s\n", strerror(errno));
}
关于c - 套接字未绑定(bind)() ing - 无效参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29811444/