c - 套接字未绑定(bind)() ing - 无效参数

标签 c linux

大家晚上好, 为了好玩,我正在尝试 *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/

相关文章:

c - 当提供库地址时,如何获取共享库中符号的地址?

php - 如何使用 Linux 或 PHP 将文件保持在 1000 行?

c - Google Test C 中的调试、系统函数(fopen、fclose、fread、fwrite、...)和 for 循环

c - 求两个整数以获得最大公约数(GCD)?

c - 虚拟地址 : multiple of four aligned - writing to address "in between"

linux - 供 Unix 使用的随机访问存档

linux - 点网核心 : cross platform version of GetInvalidFileNameChars?

c - 这是使用#define的最佳方法吗?

linux - bash:可能需要双 Ctrl-c 才能退出脚本?

linux - 将 "standalone"版本的 Wine 安装到 Ubuntu 目录