【问题标题】:BSD Sockets Invalid Argument at connectionBSD 套接字连接时的参数无效
【发布时间】:2011-10-05 18:03:45
【问题描述】:

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

服务器 -

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);
    }

客户 -

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);
    }

我看不出有什么问题,但我想我可能只是忽略了某些事情或没有意识到某些事情。任何帮助表示赞赏。

【问题讨论】:

    标签: c++ connection client-server sockets invalid-argument


    【解决方案1】:

    你的大问题是完全误解了 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 将短值从主机转换为网络格式。主机可以是大端或小端。网络是大端的。

    【讨论】:

      【解决方案2】:
      strcpy(name.sa_data, "127.0.0.1");
      

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

      这是 AF_INET 的结构(来自here):

      // 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()
      };
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多