用Perl语言进行Socket编程网络编程是一门神秘且复杂的艺术,固然也十分有趣。
Perl语言提供了丰硕的TCP/IP网络函数,所有这些函数都直接来源于C语言的socket库函数.由于Perl语言和C语言的socket库函数在型式和使用方法上都是一样的,因此会使用Perl语言进行Socket编程, 当然也就会使用C语言进行Socket编程.下面是Perl语言中有关的socket库函数列表:一。
函数原型利用说明socket()socket()系统挪用为客户机或服务器创建一个套接字,套接字函数在如下概念:#include<sys/>#include<sys/>int socket(int family, int type, int protocol)在Linux中family=能够是SOCK_STREAM它是靠得住的虽然通信速度较慢,也可以是SOCK_DGRAM它通信速度较快但不靠得住.若是type=SOCK_STREAM那么protocol=IPPROTO_TCP.若是type=SOCK_DGRAM那么protocol=IPPROTO_UDP.若是犯错,函数将返回-1.不然返回一个套接字描述符你能够在程序后面的挪用中通过套接字描述符利用那个套接字.套接字创建时没有指定名字.客户机用套接字的名字读写它.这就是如下绑定函数所要做之事.listen()listen()系统挪用被服务器所利用.下面有它的概念:#include<sys/>#include<sys/>int listen(int sockfd, int backlog);sockfd是套接字描述符.backlog是在一时间内尚未被决定是否拒绝的连接的号码.一般利用标准值5.如发生错误则返回值小于1.若是那个挪用成功,你就已经能够同意连接了.setsockopt()和getsockopt()Linux所提供的socket库含有一个错误(bug).此错误表现为你不能为一个套接字从头启用同一个端口号,即便在你正常关闭该套接字以后.例如,例如说,你编写一个服务器在一个套接字上等待的程序.服务器打开套接字并在其上侦听是没有问题的.无论如何,总有一些原因(无论是正常仍是非正常的结束程序)使你的程序需要从头启动.但是重启动后你就不能把它绑定在原来那个端口上了.从bind()系统挪用返回的错误代码老是报告说你试图连接的端口已经被别的进程所绑定.问题就是Linux内核在一个绑定套接字的进程结束后从不把端口标记为未用.在大多数UNIX系统中,端口能够被一个进程重复利用,乃至能够被其它进程利用.在Linux中绕开那个问题的办法是,但套接字已经打开但尚未有连接的时候用setsockopt()系统调用在其上设定选项(options).setsockopt()调用设置选项而getsockopt ()从给定的套接字取得选项.这里是这些挪用的语法:#include<sys/>#include<sys/>int getsockopt(int sockfd, int level, int name, char *value, int *optlen)int setsockopt(int sockfd, int level, int name, char *value, int *optlen)sockfd必须是一个已打开的套接字.level是函数所使用的协议标准(protocol level)(TCP/IP协议利用IPPROTO_TCP,套接字标准的选项实用SOL_SOCKET),选项的名称(name)在套接字说明书中(man page)有详细说明.*value指向为getsockopt()函数所获取的值或setsockopt()函数所设置的值的地址.optlen指针指向一个整数,该整数包括参数以字节计算的长度.其值被getsockopt()设置且其值必需被程序员设定当利用一个经由setsockopt().选项的所有细节能够在利用手册中setsockopt的第二节(setsockopt(2))找到.此刻咱们再回到Linux的错误上来.当你打开一个套接字时必需同时用下面的代码段来挪用setsockopt()函数:#ifdef LINUXopt = 1; len = sizeof(opt);setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&opt,&len);#endif只有当你想让程序不可是在Linux系统下使历时,#ifdef和#endif描述才是必需的.有些UNIX系统可能不支持或不需要SO_REUSEADDR标志.sendto()recvfrom()recvfrom()系统挪用是如此概念的:#include <sys/>#include <sys/>int recvfrom(int sockfd,const void *message__, /* the pointer to message */int length, /* of message */unsigned int flags, /* of routing, leave 0 */const struct sockaddr * client, /* where to send it */int length ); /* of sockaddr */若是一个信息大得缓冲区都放不下,那么附加信息将被砍掉.该挪用能够当即返回,也可以永久的等待.这取决于你把flags设置成什么类型.你乃至能够设置超时(timeou t)值.在说明书(man pages)中能够找到recvfrom的更多信息.accept(NEWSOCKET,GENERICSOCKET)同意请求的socket连接.若是成功,则返回紧缩形式的网络地址;不然返回FALSE.范例:if (!$Connect = accept(NEW,HANDLE)){die "Connection failed: $!";}bind(SOCKET,NAME)成立NAME与SOCKET的绑定,其中NAME应该是对应socket正确类型的紧缩地址.如果成功,则返回真;否则返回假.在使用socket进行网络编程时,这一函数十分重要,因为它建立了socket句柄与网络上某个地址的关联.范例:bind(SH,$SocketAddress);connect(SOCKET,NAME)试图与已经挪用了accept()函数并等待成立连接的另外一个进程进行对话.connect()挪用被在面向连接的系统中客户机连接服务器时利用.connect()调用必需被用在bind()挪用以后.若是成功,则返回真;不然返回假.NAME应该是对应SOCKET句柄正确类型的紧缩地址范例:connect(SOCK,$address) || die "Can’t connect with remote host: $!";gethostbyaddr(ADDRESS,TYPE)将紧缩形式的网络地址转换为更易于人阅读理解的名字与地址.当只知道主机的IP地址时,可以使用本函数查询主机名及其他网络信息.它返回一个列表,包含如下信息:($name, $alias, $addrtype, $length, $address)其中, $name是与IP地址对应的主机名, $alias是对应$name的其他别名,$addrtype是网络地址的类型, $length是地址的长度,而$address则是压缩形式IP地址的列表.二。