getservbyname函数的疑惑?100分赠英雄

flypuma 2001-09-25 10:23:08
getservbyname在 delphi5+win98下的正常,可在windows2000 advance server
上失败,用法都是:
getservbyname('echo',nil)
后者返回结果是nil,表示出错,用WSAGetlasterror返回11004,意思是no_data,
不知道为什么? 请教!
windows2000的service在 c:\winnt\system32\drivers\etc下面,已经有echo这个
项了。
...全文
34 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
perl函数手册英文版 Perl提供了可以直接调用的、数目众多的函数。可以对以下对象进行操作: 数组:chomp, join, keys, map, pop, push, reverse, shift, sort, splice, split, unshift, values 数据库:dbmclose, dbmopen 目录:chdir, closedir, mkdir, opendir, readdir, rewinddir, rmdir, seekdir, telldir 文件:binmode, chdir, chmod, chown, chroot, close, eof, fnctl, fileno, flock, getc, glob, ioctl, link, lstat, open, print, printf, read, readdir, readlink, rename, rmdir, seek, select, stat, symlink, sysopen, sysread, syswrite, tell, truncate, umask, unlink, utime, write 组:endgrent, getgrent, getgrgid, getgrname, getpgrp, setgrent, setpgrp Hash: delete, each, exists, keys, values 主机:endhostent, gethostbyaddr, gethostbyname, sethostent 输入:getc, read, sysread 处理器间通讯:msgctl, msgget, msgrcv, msgsnd, pipe, semctl, semget, semop, shmctl, shmget, hmread, shmwrite 数学:abs, atan2, cos, exp, hex, int, log, oct, rand, sin, sqrt, srand 消息队列:msgctl, msgget, msgrcv, msgsnd 其他:bless, defined, do, eval, formline, import, ref, scalar, syscall, tie, tied, undef, untie, wantarray 网络:endnetent, getnetbyaddr, getnetbyname, getnetent, setnetent 输出:die, print, printf, syswrite, warn, write 口令:endpwent, getpwent, getpwname, getpwuid, setpwent 进程:alarm, die, dump, exec, exit, fork, getlogin, getpgrp, getppid, getpriority, kill, setpriority, sleep, system, times, umask, wait, waitpid 协议:endprotent, getprotobyname, getprotobynumber, getprotoent, getservbyname, getservbyport, getservent, setprotoent 正则表达式:grep, pos, quotemeta, reset, split, study 范围:caller, local, my 服务:endservent, getservbyname, getservbyport, getservent, setservent 套节字:accept, bind, connect, gethostbyaddr, gethostbyname, gethostent, getpeername, getservbyname, getservbyport, getservent, getsockname, getsockopt, listen, recv, select, send, setsockopt, shutdown, socket, socketpair 字符串:chop, chr, crypt, hex, index, join, lc, lcfirst, length, oct, Ord, pack, q, qq, quotemeta, qw, qx, reverse, rindex, split, sprintf, substr, uc, ucfirst, unpack, vec 时间:gmtime, localtime, time UNIX: chmod, chown, chroot, dump, endgrent, endhostent, endnetent, endprotent, endpwent, endservent, fnctl, fork, getgrent, getgrgid, getgrname, gethostent, getlogin, getnetent, getpgrp, getppid, getpriority, getprotobyname, getprotobynumber, getprotoent, getpwent, getpwname, getpwuid, getservbyname, getservbyport, getservent, ioctl, link, lstat, readlink, select, setgrent, sethostent, setnetent, setpgrp, setpriority, setprotoent, setpwent, setservent, sleep, syscall, times, umask, wait, waitpid
内容简介 《Linux高性能服务器编程》是Linux服务器编程领域的经典著作,由资深Linux软件开发工程师撰写,从网络协议、服务器编程核心要素、原理机制、工具框架等多角度全面阐释了编写高性能Linux服务器应用的方法、技巧和思想。不仅理论全面、深入,抓住了重点和难点,还包含两个综合性案例,极具实战意义。 《Linux高性能服务器编程》共17章,分为3个部分:第一部分对Linux服务器编程的核心基础——TCP/IP协议进行了深入的解读和阐述,包括TCP/IP协议族、TCP/IP协议,以及一个经典的TCP/IP通信案例;第二部分对高性能服务器编程的核心要素进行了全面深入的剖析,包含Linux网络编程API、高级I/O函数、Linux服务器程序规范、高性能服务器程序框架、I/O复用、信号、定时器、高性能I/O框架库Libevent、多进程编程、多线程编程、进程池和线程池等内容,原理、技术与方法并重;第三部分从侧重实战的角度讲解了高性能服务器的优化与监测,包含服务器的调制、调试和测试,以及各种实用系统监测工具的使用等内容。 本书另外免费赠送一个负载均衡服务器程序的完整实际项目的源代码! 作者简介 游 双,资深Linux软件开发工程师,对Linux网络编程,尤其是服务器端的编程,有非常深入的研究,实战经验也十分丰富。曾就职于摩托罗拉,担任高级Linux软件工程师。此外,他还精通C++、Android、QT等相关的技术。活跃于Chinaunix等专业技术社区,发表了大量关于Linux网络编程的文章,深受社区欢迎。 目录 前言 第一篇 TCPIP协议详解 第1章 TCPIP协议族 1.1 TCPIP协议族体系结构以及主要协议 1.1.1 数据链路层 1.1.2 网络层 1.1.3 传输层 1.1.4 应用层 1.2 封装 1.3 分用 1.4 测试网络 1.5 ARP协议工作原理 1.5.1 以太网ARP请求应答报文详解 1.5.2 ARP高速缓存的查看和修改 1.5.3 使用tcpdump观察ARP通信过程 1.6 DNS工作原理 1.6.1 DNS查询和应答报文详解 1.6.2 Linux下访问DNS服务 1.6.3 使用tcpdump观察DNS通信过程 1.7 socket和TCPIP协议族的关系 第2章 IP协议详解 2.1 IP服务的特点 2.2 IPv4头部结构 2.2.1 IPv4头部结构 2.2.2 使用tcpdump观察IPv4头部结构 2.3 IP分片 2.4 IP路由 2.4.1 IP模块工作流程 2.4.2 路由机制 2.4.3 路由表更新 2.5 IP转发 2.6 重定向 2.6.1 ICMP重定向报文 2.6.2 主机重定向实例 2.7 IPv6头部结构 2.7.1 IPv6固定头部结构 2.7.2 IPv6扩展头部 第3章 TCP协议详解 3.1 TCP服务的特点 3.2 TCP头部结构 3.2.1 TCP固定头部结构 3.2.2 TCP头部选项 3.2.3 使用tcpdump观察TCP头部信息 3.3 TCP连接的建立和关闭 3.3.1 使用tcpdump观察TCP连接的建立和关闭 3.3.2 半关闭状态 3.3.3 连接超时 3.4 TCP状态转移 3.4.1 TCP状态转移总图 3.4.2 TIME_WAIT状态 3.5 复位报文段 3.5.1 访问不存在的端口 3.5.2 异常终止连接 3.5.3 处理半打开连接 3.6 TCP交互数据流 3.7 TCP成块数据流 3.8 带外数据 3.9 TCP超时重传 3.10 拥塞控制 3.10.1 拥塞控制概述 3.10.2 慢启动和拥塞避免 3.10.3 快速重传和快速恢复 第4章 TCPIP通信案例:访问Internet上的Web服务器 4.1 实例总图 4.2 部署代理服务器 4.2.1 HTTP代理服务器的工作原理 4.2.2 部署squid代理服务器 4.3 使用tcpdump抓取传输数据包 4.4 访问DNS服务器 4.5 本地名称查询 4.6 HTTP通信 4.6.1 HTTP请求 4.6.2 HTTP应答 4.7 实例总结 第二篇 深入解析高性能服务器编程 第5章 Linux网络编程基础API 5.1 socket地址API 5.1.1 主机字节序和网络字节序 5.1.2 通用socket地址 5.1.3 专用socket地址 5.1.4 IP地址转换函数 5.2 创建socket 5.3 命名socket 5.4 监听socket 5.5 接受连接 5.6 发起连接 5.7 关闭连接 5.8 数据读写 5.8.1 TCP数据读写 5.8.2 UDP数据读写 5.8.3 通用数据读写函数 5.9 带外标记 5.10 地址信息函数 5.11 socket选项 5.11.1 SO_REUSEADDR选项 5.11.2 SO_RCVBUF和SO_SNDBUF选项 5.11.3 SO_RCVLOWAT和SO_SNDLOWAT选项 5.11.4 SO_LINGER选项 5.12 网络信息API 5.12.1 gethostbyname和gethostbyaddr 5.12.2 getservbynamegetservbyport 5.12.3 getaddrinfo 5.12.4 getnameinfo 第6章 高级IO函数 6.1 pipe函数 6.2 dup函数和dup2函数 6.3 readv函数和writev函数 6.4 sendfile函数 6.5 mmap函数和munmap函数 6.6 splice函数 6.7 tee函数 6.8 fcntl函数 第7章 Linux服务器程序规范 7.1 日志 7.1.1 Linux系统日志 7.1.2 syslog函数 7.2 用户信息 7.2.1 UID、EUID、GID和EGID 7.2.2 切换用户 7.3 进程间关系 7.3.1 进程组 7.3.2 会话 7.3.3 用ps命令查看进程关系 7.4 系统资源限制 7.5 改变工作目录和根目录 7.6 服务器程序后台化 第8章 高性能服务器程序框架 8.1 服务器模型 8.1.1 CS模型 8.1.2 P2P模型 8.2 服务器编程框架 8.3 IO模型 8.4 两种高效的事件处理模式 8.4.1 Reactor模式 8.4.2 Proactor模式 8.4.3 模拟Proactor模式 8.5 两种高效的并发模式 8.5.1 半同步半异步模式 8.5.2 领导者追随者模式 8.6 有限状态机 8.7 提高服务器性能的其他建议 8.7.1 池 8.7.2 数据复制 8.7.3 上下文切换和锁 第9章 IO复用 9.1 select系统调用 9.1.1 select API 9.1.2 文件描述符就绪条件 9.1.3 处理带外数据 9.2 poll系统调用 9.3 epoll系列系统调用 9.3.1 内核事件表 9.3.2 epoll_wait函数 9.3.3 LT和ET模式 9.3.4 EPOLLONESHOT事件 9.4 三组IO复用函数的比较 9.5 IO复用的高级应用一:非阻塞connect 9.6 IO复用的高级应用二:聊天室程序 9.6.1 客户端 9.6.2 服务器 9.7 IO复用的高级应用三:同时处理TCP和UDP服务 9.8 超级服务xinetd 9.8.1 xinetd配置文件 9.8.2 xinetd工作流程 第10章 信号 10.1 Linux信号概述 10.1.1 发送信号 10.1.2 信号处理方式 10.1.3 Linux信号 10.1.4 中断系统调用 10.2 信号函数 10.2.1 signal系统调用 10.2.2 sigaction系统调用 10.3 信号集 10.3.1 信号集函数 10.3.2 进程信号掩码 10.3.3 被挂起的信号 10.4 统一事件源 10.5 网络编程相关信号 10.5.1 SIGHUP 10.5.2 SIGPIPE 10.5.3 SIGURG 第11章 定时器 11.1 socket选项SO_RCVTIMEO和SO_SNDTIMEO 11.2  SIGALRM信号 11.2.1 基于升序链表的定时器 11.2.2 处理非活动连接 11.3 IO复用系统调用的超时参数 11.4 高性能定时器 11.4.1 时间轮 11.4.2 时间堆 第12章 高性能IO框架库Libevent 12.1 IO框架库概述 12.2 Libevent源码分析 12.2.1 一个实例 12.2.2 源代码组织结构 12.2.3 event结构体 12.2.4 往注册事件队列中添加事件处理器 12.2.5 往事件多路分发器中注册事件 12.2.6 eventop结构体 12.2.7 event_base结构体 12.2.8 事件循环 第13章 多进程编程 13.1 fork系统调用 13.2 exec系列系统调用 13.3 处理僵尸进程 13.4 管道 13.5 信号量 13.5.1 信号量原语 13.5.2 semget系统调用 13.5.3 semop系统调用 13.5.4 semctl系统调用 13.5.5 特殊键值IPC_PRIVATE 13.6 共享内存 13.6.1 shmget系统调用 13.6.2 shmat和shmdt系统调用 13.6.3 shmctl系统调用 13.6.4 共享内存的POSIX方法 13.6.5 共享内存实例 13.7 消息队列 13.7.1 msgget系统调用 13.7.2 msgsnd系统调用 13.7.3 msgrcv系统调用 13.7.4 msgctl系统调用 13.8 IPC命令 13.9 在进程间传递文件描述符 第14章 多线程编程 14.1 Linux线程概述 14.1.1 线程模型 14.1.2 Linux线程库 14.2 创建线程和结束线程 14.3 线程属性 14.4 POSIX信号量 14.5 互斥锁 14.5.1 互斥锁基础API 14.5.2 互斥锁属性 14.5.3 死锁举例 14.6 条件变量 14.7 线程同步机制包装类 14.8 多线程环境 14.8.1 可重入函数 14.8.2 线程和进程 14.8.3 线程和信号 第15章 进程池和线程池 15.1 进程池和线程池概述 15.2 处理多客户 15.3 半同步半异步进程池实现 15.4 用进程池实现的简单CGI服务器 15.5 半同步半反应堆线程池实现 15.6 用线程池实现的简单Web服务器 15.6.1 http_conn类 15.6.2 main函数 第三篇 高性能服务器优化与监测 第16章 服务器调制、调试和测试 16.1 最大文件描述符数 16.2 调整内核参数 16.2.1 procsysfs目录下的部分文件 16.2.2 procsysnet目录下的部分文件 16.3 gdb调试 16.3.1 用gdb调试多进程程序 16.3.2 用gdb调试多线程程序 16.4 压力测试 第17章 系统监测工具 17.1 tcpdump 17.2 lsof 17.3 nc 17.4 strace 17.5 netstat 17.6 vmstat 17.7 ifstat 17.8 mpstat
netstat 命令 netstat是用来显示网络的连接,路由表和接口统计等网络的信息.netstat有许多的 选项 我们常用的选项是 -an 用来显示详细的网络状态.至于其它的选项我们可以使用帮 助手册获得详细的情况. telnet telnet是一个用来远程控制的程序,但是我们完全可以用这个程序来调试我们的服务端程 序的. 比如我们的服务器程序在监听 8888 端口,我们可以用 telnet localhost 8888来查 看服务端的状况. TCP(Transfer Control Protocol)传输控制协议是一种面向连接的协议,当我们的网络程 序使用 这个协议的时候,网络可以保证我们的客户端和服务端的连接是可靠的,安全的. UDP(User Datagram Protocol)用户数据报协议是一种非面向连接的协议,这种协议并不能保证 我们的网络程序的连接是可靠的,所以我们现在编写的程序一般是采用 TCP协议的 socket int socket(int domain, int type,int protocol) domain:说明我们网络程序所在的主机采用的通讯协族(AF_UNIX 和AF_INET 等). AF_UN IX 只能够用于单一的 Unix 系统进程间通信,而 AF_INET 是针对Internet的,因而可以允许在 远程 主机之间通信(当我们 man socket 时发现 domain 可选项是 PF_*而不是AF_*,因为 glibc 是 posix 的实现 所以用 PF代替了 AF,不过我们都可以使用的). type:我们网络程序所采用的通讯协议(SOCK_STREAM,SOCK_DGRAM 等) SOCK_STREAM 表明 我们用的是 TCP协议,这样会提供按顺序的,可靠,双向,面向连接的比特流. SOCK_DGRAM 表明我们用的是 UDP协议,这样只会提供定长的,不可靠,无连接的通信. protocol:由于我们指定了 type,所以这个地方我们一般只要用 0 来代替就可以了 sock et 为网络通讯做基本的准备.成功时返回文件描述符,失败时返回-1,看 errno 可知道出错 的详细情况. bind int bind(int sockfd, struct sockaddr *my_addr, int addrlen) sockfd:是由socket调用返回的文件描述符. addrlen:是 sockaddr结构的长度. my_addr:是一个指向 sockaddr的指针. 在;中有 sockaddr的定义 struct sockaddr{ unisgned short as_family; char sa_data[14]; }; 不过由于系统的兼容性,我们一般不用这个头文件,而使用另外一个结构(struct sock addr_in) 来代替.在;中有 sockaddr_in 的定义 struct sockaddr_in{ unsigned short sin_family; unsigned short int sin_port; struct in_addr sin_addr; unsigned char sin_zero[8]; 我们主要使用 Internet所以 sin_family 一般为 AF_INET,sin_addr设置为 INADDR_ANY 表 示可以 和任何的主机通信,sin_port 是我们要监听的端口号.sin_zero[8]是用来填充的 .. bind 将本地的端口同 socket返回的文件描述符捆绑在一起.成功是返回 0,失败的情况和 socket一样 listen int listen(int sockfd,int backlog) sockfd:是 bind 后的文件描述符. backlog:设置请求排队的最大长度.当有多个客户端程序和服务端相连时, 使用这个表示 可以介绍的排队长度. listen函数将 bind 的文件描述符变为监听套接字.返回的情况和 b ind 一样. accept int accept(int sockfd, struct sockaddr *addr,int *addrlen) sockfd:是 listen后的文件描述符. addr,addrlen是用来给客户端的程序填写的,服务器端只要传递指针就可以了. bind,li sten和 accept是服务器端用的函数,accept调用时,服务器端的程序会一直阻塞到有一个 客户程序发出了连接. accept 成功时返回最后的服务器端的文件描述符,这个时候服务 器端可以向该描述符写信息了. 失败时返回-1 connect int connect(int sockfd, struct sockaddr * serv_addr,int addrlen) sockfd:socket返回的文件描述符. serv_addr:储存了服务器端的连接信息.其中 sin_add 是服务端的地址 addrlen:serv_addr的长度 connect函数是客户端用来同服务端连接的.成功时返回 0,sockfd 是同服务端通讯的文件 描述符 失败时返回-1. 总的来说网络程序是由两个部分组成的--客户端和服务器端.它们的建立步骤一般是: 服务器端 socket-->;bind-->;listen-->;accept 客户端 socket-->;connect 字节转换函数 在网络上面有着许多类型的机器,这些机器在表示数据的字节顺序是不同的, 比如 i386 芯 片是低字节在内存地址的低端,高字节在高端,而 alpha 芯片却相反. 为了统一起来,在 Li nux 下面,有专门的字节转换函数. unsigned long int htonl(unsigned long int hostlong) unsigned short int htons(unisgned short int hostshort) unsigned long int ntohl(unsigned long int netlong) unsigned short int ntohs(unsigned short int netshort) 在这四个转换函数中,h 代表 host, n 代表 network.s 代表 short l 代表 long 第一个函 数的意义是将本机器上的 long 数据转化为网络上的 long. 其他几个函数的意义也差不多 .. IP 和域名的转换 在网络上标志一台机器可以用 IP或者是用域名.那么我们怎么去进行转换呢? struct hostent *gethostbyname(const char *hostname) struct hostent *gethostbyaddr(const char *addr,int len,int type) 在;中有 struct hostent的定义 struct hostent{ char *h_name; /* 主机的正式名称 */ char *h_aliases; /* 主机的别名 */ int h_addrtype; /* 主机的地址类型 AF_INET*/ int h_length; /* 主机的地址长度 对于IP4 是 4 字节 32 位*/ char **h_addr_list; /* 主机的 IP地址列表 */ } #define h_addr h_addr_list[0] /* 主机的第一个 IP地址*/ gethostbyname 可以将机器名(如 linux.yessun.com)转换为一个结构指针.在这个结构里 面储存了域名的信息 gethostbyaddr可以将一个 32 位的 IP地址(C0A80001)转换为结构指针. 这两个函数失败时返回 NULL 且设置 h_errno 错误变量,调用 h_strerror()可以得到详细的 出错信息 字符串的 IP 和 32位的 IP 转换. 在网络上面我们用的 IP都是数字加点(192.168.0.1)构成的, 而在 struct in_addr结构中 用的是 32 位的 IP, 我们上面那个 32 位IP(C0A80001)是的 192.168.0.1 为了转换我们可以 使用下面两个函数 int inet_aton(const char *cp,struct in_addr *inp) char *inet_ntoa(struct in_addr in) 函数里面 a 代表 ascii n 代表 network.第一个函数表示将 a.b.c.d 的 IP转换为 32 位的 I P,存储在 inp 指针里面.第二个是将 32 位 IP转换为 a.b.c.d 的格式 服务信息函数 在网络程序里面我们有时候需要知道端口.IP和服务信息.这个时候我们可以使用以下几 个函数 int getsockname(int sockfd,struct sockaddr *localaddr,int *addrlen) int getpeername(int sockfd,struct sockaddr *peeraddr, int *addrlen) struct servent *getservbyname(const char *servname,const char *protoname) struct servent *getservbyport(int port,const char *protoname) struct servent { char *s_name; /* 正式服务名 */ char **s_aliases; /* 别名列表 */ int s_port; /* 端口号 */ char *s_proto; /* 使用的协议 */ } 一般我们很少用这几个函数.对应客户端,当我们要得到连接的端口号时在 connect调用成 功后使用可得到 系统分配的端口号.对于服务端,我们用 INADDR_ANY 填充后,为了得到连 接的 IP我们可以在 accept 调用成功后 使用而得到IP地址. 在网络上有许多的默认端口和服务,比如端口 21 对 ftp80 对应 WWW.为了得到指定的端口号 的服务 我们可以调用第四个函数,相反为了得到端口号可以调用第三个函数.

5,379

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧