此套接字绑定是否失败?如果是这样的话?

时间:2017-05-31 18:41:16

标签: 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;
}

所需行为:此程序的输出应显示此程序创建的绑定套接字的条目。

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

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

使用gcc 4.8.3编译。

2 个答案:

答案 0 :(得分:2)

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

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

然后你会看到它:

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

答案 1 :(得分:2)

要向Barmar的答案添加为什么,虽然netstat --help没有解释,the manpage会这样做:

  

<强> -a, --all
  同时显示监听和非监听(对于TCP,这意味着已建立的连接)套接字

即#34;所有&#34;有点用词不当。

您的套接字既没有收听(因为您还没有呼叫listen())也没有&#34;非收听&#34;根据上面的定义(因为你在任何地方都没有connect()。)

因此,未列出。

你会在lsof输出中看到它的胚胎状态;引用Barmar,它会像:

sock 0,7 0t0 248811876 can't identify protocol