(为什么这段代码不起作用?)
我正在学习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编译。
答案 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