连接时的BSD套接字无效参数

BSD Sockets Invalid Argument at connection

本文关键字:无效 参数 套接字 BSD 连接      更新时间:2023-10-16

当我尝试将客户端连接到服务器时,我一直得到无效参数错误。网上有几个线程说,当addrlen不正确时,可能会发生这种情况,但我试图在计算长度后将其更改为文字值,这不起作用。我也试过strlen(),但没有成功。总之,相关代码-

server -

struct sockaddr name;
int main(int agrc, char** argv) {
    int sock, new_sd, adrlen;   //sock is this socket, new_sd is connection socket
    name.sa_family = AF_INET;
    strcpy(name.sa_data, "127.0.0.1");
    adrlen = strlen(name.sa_data) + sizeof(name.sa_family);
    //make socket
    sock = socket(AF_INET, SOCK_STREAM, 0);
    if (sock < 0) {
        printf("nBind error %m", errno);
        exit(1);
    }  
    //unlink and bind
    unlink("127.0.0.1");
    if(bind (sock, &name, adrlen) < 0)
        printf("nBind error %m", errno);
    //listen
    if(listen(sock, 5) < 0)
        printf("nListen error %m", errno);
    //accept
    new_sd = accept(sock, &name, (socklen_t*)&adrlen);
    if( new_sd < 0) {
        printf("nAccept error %m", errno);
        exit(1);
    }

client -

int main(int agrc, char** argv) {
    int sock, new_sd, adrlen;
    sock = socket(AF_INET, SOCK_STREAM, 0);
    if (sock < 0) {
        printf("nserver socket failure %m", errno);
        exit(1);
    }
    //stuff for server socket
    name.sa_family = AF_INET;
    strcpy(name.sa_data, "127.0.0.1");
    adrlen = strlen(name.sa_data) + sizeof(name.sa_family);
    cout<<"nadrlen: "<<adrlen<<"n";
    if(connect(sock, &name, adrlen) < 0) {
        printf("nclient connection failure %m", errno);
        exit(1);
    }

我没有看到任何可能出错的地方,但我想我可能只是忽视了一些事情或没有意识到一些事情。

strcpy(name.sa_data, "127.0.0.1");

真的吗?地址应该是32位的IPv4地址,而不是字符串。

这是AF_INET的结构(从这里开始):

// IPv4 AF_INET sockets:
struct sockaddr_in {
    short            sin_family;   // e.g. AF_INET, AF_INET6
    unsigned short   sin_port;     // e.g. htons(3490)
    struct in_addr   sin_addr;     // see struct in_addr, below
    char             sin_zero[8];  // zero this if you want to
};
struct in_addr {
    unsigned long s_addr;          // load with inet_pton()
};

你最大的问题是完全误解了sockaddr结构体!

首先使用sockaddr_in

然后你可以像这样写代码:

sockaddr_in sai;
sai.sin_family = AF_INET;
sai.sin_port   = htons( 12345 );  /// Or whatever port you wish to use.
inet_aton("127.0.0.1", &sai.sin_addr.s_addr);

注:htons将短值从主机格式转换为网络格式。主机可以是大端或小端。网络是大端的