c++ - 这个套接字绑定(bind)失败了吗?如果是,为什么?

标签 c++ linux sockets bind

(为什么这段代码不起作用?)

我正在学习 Linux 套接字编程。以下代码基于 this site 中的示例我正在学习的东西:

#include <iostream>
#include <arpa/inet.h>
#include <cstring>
#include <cstdlib>
#include <unistd.h>

int main( int argc, char* argv[] )
{
  // Create a socket with domain AF_INET and type SOCK_STREAM.
  int sd_inet;
  if ( -1 == ( sd_inet = socket( AF_INET, SOCK_STREAM, 0 ) ) )
  {
    std::cout << "socket() failed." << std::endl;
    return 1;
  }

  // Create an AF_INET address.
  struct sockaddr_in si;
  memset( &si, 0, sizeof( si ) );
  si.sin_family = AF_INET;
  si.sin_port = htons( 9000 );
  const unsigned char addr[] = { 127, 0, 0, 23 }; // Local loopback.
  std::memcpy( &si.sin_addr.s_addr, addr, sizeof( addr ) );
  int si_len = sizeof( si );

  // Bind the address to the socket.
  if ( -1 == bind( sd_inet, (struct sockaddr*)&si, si_len ) )
  {
    std::cout << "bind() failed." << std::endl;
    close( sd_inet );
    return 1;
  }

  system( "netstat -pa --tcp 2>/dev/null " );
  close( sd_inet );

  return 0;
}

期望的行为:此程序的输出应显示此程序创建的绑定(bind)套接字的条目。

问题/疑问:netstat 的输出未显示预期的绑定(bind)套接字。有人可以帮忙找出问题所在吗?

我还尝试了什么:我不清楚 "127.0.0.23" 地址是否应该正常工作,或者它是否应该是一个有效的 IP 地址我已经“分配”到我盒子上的网卡,所以我尝试将“127.0.0.1”和 htonl( INADDR_ANY ) 分配给 si.sin_addr.s_addr,如以及尝试 0sin_port 值,但这些实验都没有产生不同的结果。

使用 gcc 4.8.3 编译。

最佳答案

您需要在套接字上调用 listen()connect() 以使其进入显示在 netstat 中的状态.在调用 bind() 的 block 之后,添加:

  if (-1 == listen(sd_inet, 5)) {
      std::cout << "listen() failed." <<std::endl;
      close(sd_inet);
      return 1;
  }

然后你会看到它:

tcp        0      0 *:9000                  *:*                     LISTEN      9912/testbind   

关于c++ - 这个套接字绑定(bind)失败了吗?如果是,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44292428/

相关文章:

C++ Visual Studio 库

linux - 在 Debian 8 上安装 Docker

linux - 我需要构建什么才能直接访问 InfiniBand HCA 端口并注入(inject) IPoIB 帧位?

linux - 在多次 sed 运行中获取重复条目

java - 调用 socket.bind() 时应用程序关闭 - Android 上的 JeroMQ

c++ - 如何在 OpenCV 中使用 gpu::Stream?

c++ - 如何在不使用 C++ 中的全局变量的情况下存储对象的状态

c++ - 为什么在声明对象 std::vector 但从未使用时编译器不发出警告?

java - 套接字打开和关闭 1 秒或保持打开

sockets - 在sails v0.11(客户端)中发出消息