这个套接字绑定失败了吗?如果是,为什么?
Does this socket bind fail? If so why?
(为什么这段代码不起作用?)
我正在学习 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;
}
期望的行为:此程序的输出应显示此程序创建的绑定套接字的条目。
Problem/Question:netstat
的输出未显示预期的绑定套接字。有人可以帮忙找出问题所在吗?
我还尝试了什么:我不清楚 "127.0.0.23"
地址是否应该正常工作,或者它是否应该是我拥有的有效 IP 地址"assigned" 到我盒子上的网卡,所以我尝试将“127.0.0.1”和 htonl( INADDR_ANY )
分配给 si.sin_addr.s_addr
,并尝试 sin_port
值 0
,但其中 none 个实验产生了不同的结果。
使用 gcc 4.8.3 编译。
您需要在套接字上调用 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
要在 Barmar 的回答中添加一个 为什么,虽然 netstat --help
没有解释这个,the manpage 可以:
-a, --all
Show both listening and non-listening (for TCP this means established connections) sockets
也就是说,"all"有点用词不当。
根据上面的定义,你的套接字既没有在监听(因为你还没有调用 listen()
)也没有在监听 "non-listening"(因为你也没有在任何地方调用 connect()
)。
因此未列出。
您会在 lsof
输出中看到它处于萌芽状态;引用 Barmar,它会是这样的:
sock 0,7 0t0 248811876 can't identify protocol
(为什么这段代码不起作用?)
我正在学习 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;
}
期望的行为:此程序的输出应显示此程序创建的绑定套接字的条目。
Problem/Question:netstat
的输出未显示预期的绑定套接字。有人可以帮忙找出问题所在吗?
我还尝试了什么:我不清楚 "127.0.0.23"
地址是否应该正常工作,或者它是否应该是我拥有的有效 IP 地址"assigned" 到我盒子上的网卡,所以我尝试将“127.0.0.1”和 htonl( INADDR_ANY )
分配给 si.sin_addr.s_addr
,并尝试 sin_port
值 0
,但其中 none 个实验产生了不同的结果。
使用 gcc 4.8.3 编译。
您需要在套接字上调用 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
要在 Barmar 的回答中添加一个 为什么,虽然 netstat --help
没有解释这个,the manpage 可以:
-a, --all
Show both listening and non-listening (for TCP this means established connections) sockets
也就是说,"all"有点用词不当。
根据上面的定义,你的套接字既没有在监听(因为你还没有调用 listen()
)也没有在监听 "non-listening"(因为你也没有在任何地方调用 connect()
)。
因此未列出。
您会在 lsof
输出中看到它处于萌芽状态;引用 Barmar,它会是这样的:
sock 0,7 0t0 248811876 can't identify protocol