以下代码是socket教程的示例php代码,我成功运行以收集远程站点或localhost网页。我用于socket_create的协议号是0或6,两者都是 数字也在处理那段代码,为什么?我认为网络编程需要将今天的窗口计算机中的TCP和IP包括在一起才能使通信成为可能。为什么只需要TCP或IP协议num可以使程序代码工作,不包括协议num? TCP是传输层的协议,IP是OSI或传统TCP / IP模型的网络层协议
<?php
$protocol = 'tcp';
$get_prot = getprotobyname($protocol);
echo $get_prot."----protocol\n";
if(!($sock = socket_create(AF_INET, SOCK_STREAM, 6)))
{
$errorcode = socket_last_error();
$errormsg = socket_strerror($errorcode);
die("Couldn't create socket: [$errorcode] $errormsg \n");
}
echo "Socket created \n";
if(!socket_connect($sock , '127.0.0.1' , 80))
{
$errorcode = socket_last_error();
$errormsg = socket_strerror($errorcode);
die("Could not connect: [$errorcode] $errormsg \n");
}
echo "Connection established \n";
$message = "GET / HTTP/1.1 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 \r\n\r\n";
$message = "GET / HTTP/1.1\r\n";
$message .= "Host: \r\n";
$message .= "Connection: Close\r\n\r\n";
//Send the message to the server
if( ! socket_send ( $sock , $message , strlen($message) , 0))
{
$errorcode = socket_last_error();
$errormsg = socket_strerror($errorcode);
die("Could not send data: [$errorcode] $errormsg \n");
}
echo "Message send successfully \n";
//Now receive reply from server
if(socket_recv ( $sock , $buf , 6144 , MSG_WAITALL ) === FALSE)
{
$errorcode = socket_last_error();
$errormsg = socket_strerror($errorcode);
die("Could not receive data: [$errorcode] $errormsg \n");
}
//print the received message
echo $buf;
?>
答案 0 :(得分:0)
传递0作为协议将为您提供默认协议。 AF_INET说你想要 IP协议套件(特别是IPv4)。对于AF_INET和SOCK_STREAM的组合,tcp是默认值。 AF_INET6和SOCK_DGRAM的组合将默认为IPv6和UDP。
TCP具有协议号6,如果您想要明确,也可以传递。