PHP Socket编程 之使用fsockopen()函数

Socket可以理解为两台计算机相互通信的通道。

用法:使用fsockopen()函数

具体用法详见上篇文章。函数的参数为URL、端口号、一个存放错误编号的变量、一个存放错误信息字符串的变量和超时等待时间。(只有第一个参数是必须的)

常见的端口表:


端口号


主要用途


21


FTP


22


SSH


23


Telnet


25


SMTP


80


Web


110


POP

其中,组成URl的几个部分为:协议名(scheme),主机(host),端口号(port),文件路径(path),查询参数(query)。

当url是http://www.example.com/view.php?week=1#demo时:


指标



Scheme


http


Host


www.example.com


Port


80


User


Pass


Path


View.php


Query


Week=1


Fragment


#demo

常见的HTTP状态码:


代码


含义


200


OK


204


NO Content


400


Bad Request


401


Unauthorized


403


Forbidden


404


Not Found


408


Time out


5**


Server error

【示例】:

<?PHP
       function check_url($url){
              //解析url
              $url_pieces = parse_url($url);
              //设置正确的路径和端口号
              $path =(isset($url_pieces[‘path‘]))?$url_pieces[‘path‘]:‘/‘;
              $port =(isset($url_pieces[‘port‘]))?$url_pieces[‘port‘]:‘80‘;
              //用fsockopen()尝试连接
              if($fp =fsockopen($url_pieces[‘host‘],$port,$errno,$errstr,30)){
                     //建立成功后,向服务器写入数据
                     $send = "HEAD $path HTTP/1.1\r\n";
                     $send .= "HOST:$url_pieces[‘host‘]\r\n";
                     $send .= "CONNECTION: CLOSE\r\n\r\n";
                     fwrite($fp,$send);
                     //检索HTTP状态码
                     $data = fgets($fp,128);
                     //关闭连接
                     fclose($fp);
                     //返回状态码和类信息
                     list($response,$code) = explode(‘ ‘,$data);
                     if(code == 200){
                            return array($code,‘good‘);
                     }else{
                            return array($code,‘bad‘);//数组第二个元素作为css类名
                     }
              }else{
                     //没有连接
                     return array($errstr,‘bad‘);
              }  

       }
       //创建URL列表
       $urls = array(
              ‘http://www.sdust.com‘,
              ‘http://www.example.com‘
       )
       //调整PHP脚本的时间限制:
       set_time_limit(0);//无限长时间完成任务
       //逐个验证url:
       foreach($urls as $url){
              list($code,$class) = check_url($url);
              echo "<p><a href =\"$url\">$url</a>(<span class =\"$class\">$code</span>)</p>";  

       }
?>  

使用fsockopen()函数比fopen()函数的优点:fopen()只会在PHP中已经将allow_url_fopen设置为真时才能使用,而fsockopen()并没有限制。

时间: 2024-08-10 19:11:22

PHP Socket编程 之使用fsockopen()函数的相关文章

socket编程中服务器端常用函数 以及简单实现

1 常用函数 1.1   socket() int socket(int family, int type, int protocol); socket()打开一个网络通讯端口,如果成功的话,返回一个文件描述符,应用程序可以像读写文件一样用read/write在网络上收发数据,如果socket()调用出错则返回-1.对于IPv4,family参数指定为AF_INET.对于TCP协议,type参数指定为SOCK_STREAM,表示面向流的传输协议.如果是UDP协议,则type参数指定为SOCK_D

socket编程中客户端常用函数 以及简单实现

1 常用函数 1.1   connect() int connect(int sockfd, const struct sockaddr *servaddr, socklen_taddrlen); 客户端需要调用connect()连接服务器,connect和bind的参数形式一致,区别在于bind的参数是自己的地址,而connect的参数是对方的地址.connect()成功返回0,出错返回-1. 1.2   bind():很少用 由于客户端不需要固定的端口号,因此不必调用bind(),客户端的端

基于UDP的socket编程

一.相关函数说明 UDP是无连接的,即发送数据之前不需要建立连接. 除了基于TCP中的socket编程所需的函数之外,基于UDP的socket编程中还需要用到两个函数. 1.sendto函数:用于客户端中指定一目的地发送数据. (1)函数原型 (2)参数说明 sockfd:套接字 buf:待发送数据的缓冲区 len:缓冲区长度 flags:调用方式标志位,一般为0:若改变flags,则sendto发送数据的形式会变成阻塞 dest_addr:指向目的套接字的地址 addrlen:指向目的套接字的

最近关于socket编程的理解

最近看了看socket网络编程,对于我这种一点经验都没有的选手来说只能理解一点点吧.所以在此记录一下最近的收获. socket编程无非就那几个函数,对于服务端来说,主要的为socket(),bind(),listen(),accept(),close().对于客户端来说主要为connect(),close()等.当然,我所说的只是针对tcp协议而言的.对于udp而言,就可以简单很多,服务端和客户端都建立socket并进行绑定,从而用sendto()和recvfrom()通信即可. 以下直接上一个

1.socket编程:socket编程,网络字节序,函数介绍,IP地址转换函数,sockaddr数据结构,网络套接字函数,socket相关函数,TCP server和client

 1  Socket编程 socket这个词可以表示很多概念: 在TCP/IP协议中,"IP地址+TCP或UDP端口号"唯一标识网络通讯中的一个进程,"IP 地址+端口号"就称为socket. 在TCP协议中,建立连接的两个进程各自有一个socket来标识,那么这两个socket组成的socket pair就唯一标识一个连接.socket本身有"插座"的意思,因此用来描述网络连 接的一对一关系. TCP/IP协议最早在BSD UNIX上实现,

socket编程之三:socket网络编程中的常用函数

这节本来打算先给出常用函数介绍,再给两个代码实例,写着写着发现越来越长,决定把代码放在下一节. 本节内容持续更新...... 1 socket()函数 原型: int socket(int domain, int type, int protocol); 描述: 类似打开一个文件,返回一个socket描述符,唯一标识一个socket,后面相应的操作都是这用这个socket描述符. 参数: domain:协议族,常用的协议族有AF_INET.AF_INET6.AF_LOCAL.AF_ROUTE等:

socket编程中recv与send函数

recv函数会将套接字缓冲区中的内容读出,但不清空,与read函数的区别在此.此函数有一个flag标志位,设为MSG_PEEK. send函数会将缓冲区中的内容写入到套接字,也不清空,与write函数的区别在此. 用这两个函数可以先接收或发送缓冲区中的内容,然后再用readn(此时缓冲区中的内容依然存在)与write函数去继续判断换行符/n,对缓冲区内容实现换行输出. echocli.c #include <unistd.h> #include <sys/types.h> #inc

socket编程中最常用的几个数据类型和转换函数

高位字节优先和低位字节优先.Internet上数据以高位字节优先顺序在网络上传输,所以对于在内部是以低位字节优先方式存储数据的机器,在Internet上传输数据时就需要进行转换. 第一个结构类型是:struct sockaddr 该类型是用来保存socket信息的 struct sockaddr {   unsigned short sa_family;   /* 地址族, AF_xxx */   char sa_data[14];  /* 14 字节的协议地址 */ }; sa_family一

socket编程:recvmsg 和 sendmsg 函数

背景 复习 socket 编程的时候发现了以前没有留意到的 2个函数:recvmsg 和 sendmsg ref : Linux编程之recvmsg和sendmsg函数 知识 先来看看函数原型: #include <sys/types.h> #include <sys/socket.h> ... ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags); ... ssize_t sendmsg(int sockfd, co