文档介绍:网络编程是一门神秘且复杂的艺术,当然也十分有趣。Perl语言提供了丰富的TCP/IP网络函数,所有这些函数都直接来源于C语言的socket库函数
由于Perl语言和C语言的socket库函数在型式和使用方法上都是一样的,因此会使用Perl语言进行Socket编程, 当然也就会使用C语言进行Socket编程
下面是Perl语言中有关的socket库函数列表:
一。函数原型 使用说明
socket()
socket()系统调用为客户机或服务器创建一个套接字,套接字函数在如下定义:
#include<sys/typesh>
#include<sys/socketh>
int socket(int family, int type, int protocol)
在Linux中family=AF_UNIXtype可以是SOCK_STREAM它是可靠的虽然通讯速度
较慢,也可以是SOCK_DGRAM它通讯速度较快但不可靠如果type=SOCK_STREAM那么protocol=IPPROTO_TCP如果type=SOCK_DGRAM那么protocol=IPPROTO_UDP
如果出错,函数将返回-1否则返回一个套接字描述符你可以在程序后面的调用
中通过套接字描述符使用这个套接字
套接字创建时没有指定名字客户机用套接字的名字读写它这就是如下绑定函
数所要做之事
listen()
listen()系统调用被服务器所使用下面有它的定义:
#include<sys/typesh>
#include<sys/socketh>
int listen(int sockfd, int backlog);
sockfd是套接字描述符backlog是在一时间内尚未被决定是否拒绝的连接的号
码一般使用标准值5如发生错误则返回值小于1
如果这个调用成功,你就已经可以接受连接了
setsockopt()和getsockopt()
Linux所提供的socket库含有一个错误(bug)此错误表现为你不能为一个套接
字重新启用同一个端口号,即使在你正常关闭该套接字以后例如,比方说,你编写一个服务
器在一个套接字上等待的程序服务器打开套接字并在其上侦听是没有问题的无论如何,总
有一些原因(不管是正常还是非正常的结束程序)使你的程序需要重新启动然而重启动后你
就不能把它绑定在原来那个端口上了从bind()系统调用返回的错误代码总是报告说你试图
连接的端口已经被别的进程所绑定
问题就是Linux内核在一个绑定套接字的进程结束后从不把端口标记为未用在
大多数UNIX系统中,端口可以被一个进程重复使用,甚至可以被其它进程使用
在Linux中绕开这个问题的办法是,但套接字已经打开但尚未有连接的时候用s
etsockopt()系统调用在其上设定选项(options)setsockopt()调用设置选项而getsockopt
()从给定的套接字取得选项
这里是这些调用的语法:
#include<sys/typesh>
#include<sys/socketh>
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 LINUX
opt = 1; len = sizeof(opt);
setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&opt,&len);