资源描述:
《用perl语言进行socket编程》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、用Perl语言进行Socket编程网络编程是一门神秘且复杂的艺术,当然也十分有趣。Perl语言提供了丰富的TCP/IP网络函数,所有这些函数都直接来源于C语言的socket库函数.由于Perl语言和C语言的socket库函数在型式和使用方法上都是一样的,因此会使用Perl语言进行Socket编程,当然也就会使用C语言进行Socket编程.下面是Perl语言中有关的socket库函数列表:一。函数原型使用说明socket()socket()系统调用为客户机或服务器创建一个套接字,套接字函数在如下定义:#i
2、nclude#includeintsocket(intfamily,inttype,intprotocol)在Linux中family=AF_UNIX.type可以是SOCK_STREAM它是可靠的虽然通讯速度较慢,也可以是SOCK_DGRAM它通讯速度较快但不可靠.如果type=SOCK_STREAM那么protocol=IPPROTO_TCP.如果type=SOCK_DGRAM那么protocol=IPPROTO_UDP.如果出错,函数将返回-1
3、.否则返回一个套接字描述符你可以在程序后面的调用中通过套接字描述符使用这个套接字.套接字创建时没有指定名字.客户机用套接字的名字读写它.这就是如下绑定函数所要做之事.listen()listen()系统调用被服务器所使用.下面有它的定义:#include#includeintlisten(intsockfd,intbacklog);sockfd是套接字描述符.backlog是在一时间内尚未被决定是否拒绝的连接的号码.一般使用标准值5.如发生错误则返回
4、值小于1.如果这个调用成功,你就已经可以接受连接了.setsockopt()和getsockopt()Linux所提供的socket库含有一个错误(bug).此错误表现为你不能为一个套接字重新启用同一个端口号,即使在你正常关闭该套接字以后.例如,比方说,你编写一个服务器在一个套接字上等待的程序.服务器打开套接字并在其上侦听是没有问题的.无论如何,总有一些原因(不管是正常还是非正常的结束程序)使你的程序需要重新启动.然而重启动后你就不能把它绑定在原来那个端口上了.从bind()系统调用返回的错误代码总是报
5、告说你试图连接的端口已经被别的进程所绑定.问题就是Linux内核在一个绑定套接字的进程结束后从不把端口标记为未用.在大多数UNIX系统中,端口可以被一个进程重复使用,甚至可以被其它进程使用.在Linux中绕开这个问题的办法是,但套接字已经打开但尚未有连接的时候用setsockopt()系统调用在其上设定选项(options).setsockopt()调用设置选项而getsockopt()从给定的套接字取得选项.这里是这些调用的语法:#include#include6、cket.h>intgetsockopt(intsockfd,intlevel,intname,char*value,int*optlen)intsetsockopt(intsockfd,intlevel,intname,char*value,int*optlen)sockfd必须是一个已打开的套接字.level是函数所使用的协议标准(protocollevel)(TCP/IP协议使用IPPROTO_TCP,套接字标准的选项实用SOL_SOCKET),选项的名称(name)在套接字说明书中(manpag
7、e)有详细说明.*value指向为getsockopt()函数所获取的值或setsockopt()函数所设置的值的地址.optlen指针指向一个整数,该整数包含参数以字节计算的长度.其值被getsockopt()设置且其值必须被程序员设定当使用一个经由setsockopt().选项的所有细节可以在使用手册中setsockopt的第二节(setsockopt(2))找到.现在我们再回到Linux的错误上来.当你打开一个套接字时必须同时用下面的代码段来调用setsockopt()函数:#ifdefLINUX
8、opt=1;len=sizeof(opt);setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&opt,&len);#endif只有当你想让程序不光是在Linux系统下使用时,#ifdef和#endif描述才是必须的.有些UNIX系统可能不支持或不需要SO_REUSEADDR标志.sendto()recvfrom()recvfrom()系统调用是这样定义的:#include#inc