linux下网络编程相关知识.docx
- 文档编号:25459595
- 上传时间:2023-06-09
- 格式:DOCX
- 页数:28
- 大小:30.20KB
linux下网络编程相关知识.docx
《linux下网络编程相关知识.docx》由会员分享,可在线阅读,更多相关《linux下网络编程相关知识.docx(28页珍藏版)》请在冰豆网上搜索。
linux下网络编程相关知识
1.gethostname()
简述:
返回本地主机的标准主机名。
#include
intPASCALFARgethostname(charFAR*name,intnamelen);
name:
一个指向将要存放主机名的缓冲区指针。
namelen:
缓冲区的长度。
注释:
该函数把本地主机名存放入由name参数指定的缓冲区中。
返回的主机名是一个以NULL结束的字符串。
主机名的形式取决于WindowsSockets实现-它可能是一个简单的主机名,或者是一个域名。
然而,返回的名字必定可以在gethostbyname()和WSAAsyncGetHostByName()中使用。
返回值:
如果没有错误发生,gethostname()返回0。
否则它返回SOCKET_ERROR。
应用程序可以通过WSAGetLastError()来得到一个特定的错误代码。
错误代码:
WSAEFAULT名字长度参数太小。
WSANOTINTIALISED在应用这个API前,必须成功地调用WSAStartup()。
WSAENTDOWNWindowsSockets实现检测到了网络子系统的错误。
WSAEINPROGRESS一个阻塞的WindowsSockets操作正在进行。
参见:
gethostbyname(),WSAAsyncGetHostByName
2.gethostbyname()
gethostbyname()返回对应于给定主机名的包含主机名字和地址信息的hostent结构指针。
结构的声明与gethostaddr()中一致。
1.简述
返回对应于给定主机名的主机信息。
#include
structhostentFAR*PASCALFARgethostbyname(constchar
FAR*name);
name:
指向主机名的指针。
Linux版
#include
structhostent*gethostbyname(constchar*hostname);
返回:
非空指针——成功,空指针——出错,同时设置h_errno
2.注释
gethostbyname()返回对应于给定主机名的包含主机名字和地址信息的hostent结构指针。
结构的声明与gethostaddr()中一致。
返回的指针指向一个由WindowsSockets实现分配的结构。
应用程序不应该试图修改这个结构或者释放它的任何部分。
此外,每一线程仅有一份这个结构的拷贝,所以应用程序应该在发出其他WindowsScoketsAPI调用前,把自己所需的信息拷贝下来。
gethostbyname()实现没有必要识别传送给它的IP地址串。
对于这样的请求,应该把IP地址串当作一个未知主机名同样处理。
如果应用程序有IP地址串需要处理,它应该使用inet_addr()函数把地址串转换为IP地址,然后调用gethostbyaddr()来得到hostent结构。
3.返回值
如果没有错误发生,gethostbyname()返回如上所述的一个指向hostent结构的指针,否则,返回一个空指针。
应用程序可以通过WSAGetLastError()来得到一个特定的错误代码。
4.错误代码
WSANOTINITIALISED在应用这个API前,必须成功地调用WSAStartup()。
WSAENTDOWNWindowsSockets实现检测到了网络子系统的错误。
WSAHOST_NOT_FOUND没有找到授权应答主机。
WSATRY_AGAIN没有找到非授权主机,或者SERVERFAIL。
WSANO_RECOVERY无法恢复的错误,FORMERR,REFUSED,NOTIMP。
WSANO_DATA有效的名字,但没有关于请求类型的数据记录。
WSAEINPROGRESS一个阻塞的WindowsSockets操作正在进行。
WSAEINTR阻塞调用被WSACancelBlockingCall()取消了.
需要注意的是gethostbyname()函数属于WinSockAPI库,而在使用WinSockAPI之前,必须调用WSA-Startup函数,只有该函数成功返回(表示应用程序与WinSock库成功地建立起连接),应用程序才可以调用其他WindowsSocketsDLL中的函数。
当程序将要结束时,又必须调用WSACleanup函数进行清理工作,以便释放其占用的资源。
WSACleanup函数用来结束WindowsSocketsDLL的使用。
参见:
WSAAsyncGetHostByName(),gethostbyaddr()
3.select()
简述:
确定一个或多个套接口的状态,如需要则等待。
#include
intPASCALFARselect(intnfds,fd_setFAR*readfds,
fd_setFAR*writefds,fd_setFAR*exceptfds,
conststructtimevalFAR*timeout);
nfds:
是一个整数值,是指集合中所有文件描述符的范围,即所有文件描述符的最大值加1,不能错!
在Windows中这个参数的值无所谓,可以设置不正确。
readfds:
(可选)指针,指向一组等待可读性检查的套接口。
writefds:
(可选)指针,指向一组等待可写性检查的套接口。
exceptfds:
(可选)指针,指向一组等待错误检查的套接口。
timeout:
select()最多等待时间,对阻塞操作则为NULL。
注释:
本函数用于确定一个或多个套接口的状态。
对每一个套接口,调用者可查询它的可读性、可写性及错误状态信息。
用fd_set结构来表示一组等待检查的套接口。
在调用返回时,这个结构存有满足一定条件的套接口组的子集,并且select()返回满足条件的套接口的数目。
有一组宏可用于对fd_set的操作,这些宏与BerkeleyUnix软件中的兼容,但内部的表达是完全不同的。
readfds参数标识等待可读性检查的套接口。
如果该套接口正处于监听listen()状态,则若有连接请求到达,该套接口便被标识为可读,这样一个accept()调用保证可以无阻塞完成。
对其他套接口而言,可读性意味着有排队数据供读取。
或者对于SOCK_STREAM类型套接口来说,相对于该套接口的虚套接口已关闭,于是recv()或recvfrom()操作均能无阻塞完成。
如果虚电路被“优雅地”中止,则recv()不读取数据立即返回;如果虚电路被强制复位,则recv()将以WSAECONNRESET错误立即返回。
如果SO_OOBINLINE选项被设置,则将检查带外数据是否存在(参见setsockopt())。
writefds参数标识等待可写性检查的套接口。
如果一个套接口正在connect()连接(非阻塞),可写性意味着连接顺利建立。
如果套接口并未处于connect()调用中,可写性意味着send()和sendto()调用将无阻塞完成。
〔但并未指出这个保证在多长时间内有效,特别是在多线程环境中〕。
exceptfds参数标识等待带外数据存在性或意味错误条件检查的套接口。
请注意如果设置了SO_OOBINLINE选项为假FALSE,则只能用这种方法来检查带外数据的存在与否。
对于SO_STREAM类型套接口,远端造成的连接中止和KEEPALIVE错误都将被作为意味出错。
如果套接口正在进行连接connect()(非阻塞方式),则连接试图的失败将会表现在exceptfds参数中。
如果对readfds、writefds或exceptfds中任一个组类不感兴趣,可将它置为空NULL。
在winsock.h头文件中共定义了四个宏来操作描述字集。
FD_SETSIZE变量用于确定一个集合中最多有多少描述字(FD_SETSIZE缺省值为64,可在包含winsock.h前用#defineFD_SETSIZE来改变该值)。
对于内部表示,fd_set被表示成一个套接口的队列,最后一个有效元素的后续元素为INVAL_SOCKET。
宏为:
FD_CLR(s,*set):
从集合set中删除描述字s。
FD_ISSET(s,*set):
若s为集合中一员,非零;否则为零。
FD_SET(s,*set):
向集合添加描述字s。
FD_ZERO(*set):
将set初始化为空集NULL。
timeout参数控制select()完成的时间。
若timeout参数为空指针,则select()将一直阻塞到有一个描述字满足条件。
否则的话,timeout指向一个timeval结构,其中指定了select()调用在返回前等待多长时间。
如果timeval为{0,0},则select()立即返回,这可用于探询所选套接口的状态。
如果处于这种状态,则select()调用可认为是非阻塞的,且一切适用于非阻塞调用的假设都适用于它。
举例来说,阻塞钩子函数不应被调用,且WINDOWS套接口实现不应yield。
返回值:
select()调用返回处于就绪状态并且已经包含在fd_set结构中的描述字总数;如果超时则返回0;否则的话,返回SOCKET_ERROR错误,应用程序可通过WSAGetLastError()获取相应错误代码。
错误代码:
WSANOTINITIALISED:
在使用此API之前应首先成功地调用WSAStartup()。
WSAENETDOWN:
WINDOWS套接口实现检测到网络子系统失效。
WSAEINVAL:
超时时间值非法。
WSAEINTR:
通过一个WSACancelBlockingCall()来取消一个(阻塞的)调用。
WSAEINPROGRESS:
一个阻塞的WINDOWS套接口调用正在运行中。
WSAENOTSOCK:
描述字集合中包含有非套接口的元素。
4.socket()
简述:
创建一个套接口。
#include
SOCKETPASCALFARsocket(intaf,inttype,intprotocol);
af:
一个地址描述。
目前仅支持AF_INET格式,也就是说ARPAInternet地址格式。
type:
新套接口的类型描述。
protocol:
套接口所用的协议。
如调用者不想指定,可用0。
注释:
socket()函数用于根据指定的地址族、数据类型和协议来分配一个套接口的描述字及其所用的资源。
如果协议protocol未指定(等于0),则使用缺省的连接方式。
对于使用一给定地址族的某一特定套接口,只支持一种协议。
但地址族可设为AF_UNSPEC(未指定),这样的话协议参数就要指定了。
协议号特定于进行通讯的“通讯域”。
支持下述类型描述:
类型解释
SOCK_STREAM提供有序的、可靠的、双向的和基于连接的字节流,使用带外数据传送机制,为Internet地址族使用TCP。
SOCK_DGRAM支持无连接的、不可靠的和使用固定大小(通常很小)缓冲区的数据报服务,为Internet地址族使用UDP。
SOCK_STREAM类型的套接口为全双向的字节流。
对于流类套接口,在接收或发送数据前必需处于已连接状态。
用connect()调用建立与另一套接口的连接,连接成功后,即可用send()和recv()传送数据。
当会话结束后,调用closesocket()。
带外数据根据规定用send()和recv()来接收。
实现SOCK_STREAM类型套接口的通讯协议保证数据不会丢失也不会重复。
如果终端协议有缓冲区空间,且数据不能在一定时间成功发送,则认为连接中断,其后续的调用也将以WSAETIMEOUT错误返回。
SOCK_DGRAM类型套接口允许使用sendto()和recvfrom()从任意端口发送或接收数据报。
如果这样一个套接口用connect()与一个指定端口连接,则可用send()和recv()与该端口进行数据报的发送与接收。
返回值:
若无错误发生,socket()返回引用新套接口的描述字。
否则的话,返回INVAID_SOCKET错误,应用程序可通过WSAGetLastError()获取相应错误代码。
错误代码:
WSANOTINITIALISED:
在使用此API之前应首先成功地调用WSAStartup()。
WSAENETDOWN:
WINDOWS套接口实现检测到网络子系统失效。
WSAEAFNOSUPPORT:
不支持指定的地址族。
WSAEINPROGRESS:
一个阻塞的WINDOWS套接口调用正在运行中。
WSAEMFILE:
无可用文件描述字。
WSAENOBUFS:
无可用缓冲区,无法创建套接口。
WSAEPROTONOSUPPORT:
不支持指定的协议。
WSAEPROTOTYPE:
指定的协议不适用于本套接口。
WSAESOCKTNOSUPPORT:
本地址族中不支持该类型套接口。
参见:
accept(),bind(),connect(),getsockname(),getsockopt(),setsockopt(),listen(),recv(),recvfrom(),select(),send(),sendto(),shutdown(),ioctlsocket().4.2数据库例程
socket()
函数原型:
SOCKETWSAAPIsocket(
intaf,
inttype,
intprotocol
);
该函数及参数定义包含在winsock2.h头文件中,在MSDN中查不到具体参数。
参数选项及定义:
地址族af:
(常用AF_INET实现TCP/UDP协议)
#defineAF_UNSPEC0/*unspecified*/
#defineAF_UNIX1/*localtohost(pipes,portals)*/
#defineAF_INET2/*internetwork:
UDP,TCP,etc.*/
#defineAF_IMPLINK3/*arpanetimpaddresses*/
#defineAF_PUP4/*pupprotocols:
e.g.BSP*/
#defineAF_CHAOS5/*mitCHAOSprotocols*/
#defineAF_NS6/*XEROXNSprotocols*/
#defineAF_IPXAF_NS/*IPXprotocols:
IPX,SPX,etc.*/
#defineAF_ISO7/*ISOprotocols*/
#defineAF_OSIAF_ISO/*OSIisISO*/
#defineAF_ECMA8/*europeancomputermanufacturers*/
#defineAF_DATAKIT9/*datakitprotocols*/
#defineAF_CCITT10/*CCITTprotocols,X.25etc*/
#defineAF_SNA11/*IBMSNA*/
#defineAF_DECnet12/*DECnet*/
#defineAF_DLI13/*Directdatalinkinterface*/
#defineAF_LAT14/*LAT*/
#defineAF_HYLINK15/*NSCHyperchannel*/
#defineAF_APPLETALK16/*AppleTalk*/
#defineAF_NETBIOS17/*NetBios-styleaddresses*/
#defineAF_VOICEVIEW18/*VoiceView*/
#defineAF_FIREFOX19/*ProtocolsfromFirefox*/
#defineAF_UNKNOWN120/*Somebodyisusingthis!
*/
#defineAF_BAN21/*Banyan*/
#defineAF_ATM22/*NativeATMServices*/
#defineAF_INET623/*InternetworkVersion6*/
#defineAF_CLUSTER24/*MicrosoftWolfpack*/
#defineAF_1284425/*IEEE1284.4WGAF*/
套接字类型type:
#defineSOCK_STREAM1/*streamsocket*/
#defineSOCK_DGRAM2/*datagramsocket*/
#defineSOCK_RAW3/*raw-protocolinterface*/
#defineSOCK_RDM4/*reliably-deliveredmessage*/
#defineSOCK_SEQPACKET5/*sequencedpacketstream*/
协议类型protocol:
#defineIPPROTO_IP0/*dummyforIP*/
#defineIPPROTO_ICMP1/*controlmessageprotocol*/
#defineIPPROTO_IGMP2/*internetgroupmanagementprotocol*/
#defineIPPROTO_GGP3/*gateway^2(deprecated)*/
#defineIPPROTO_TCP6/*tcp*/
#defineIPPROTO_PUP12/*pup*/
#defineIPPROTO_UDP17/*userdatagramprotocol*/
#defineIPPROTO_IDP22/*xnsidp*/
#defineIPPROTO_ND77/*UNOFFICIALnetdiskproto*/
5.bind()
将一本地地址与一套接口捆绑。
本函数适用于未连接的数据报或流类套接口,在connect()或listen()调用前使用。
当用socket()创建套接口后,它便存在于一个名字空间(地址族)中,但并未赋名。
bind()函数通过给一个未命名套接口分配一个本地名字来为套接口建立本地捆绑(主机地址/端口号)。
1.简述
将一本地地址与一套接口捆绑。
#include
intPASCALFARbind(SOCKETs,conststructsockaddrFAR*name,
intnamelen);
s:
标识一未捆绑套接口的描述字。
name:
赋予套接口的地址。
sockaddr结构定义如下:
structsockaddr{
u_shortsa_family;
charsa_data[14];
};
namelen:
name名字的长度。
2.注释
本函数适用于未连接的数据报或流类套接口,在connect()或listen()调用前使用。
当用socket()创建套接口后,它便存在于一个名字空间(地址族)中,但并未赋名。
bind()函数通过给一个未命名套接口分配一个本地名字来为套接口建立本地捆绑(主机地址/端口号)。
在Internet地址族中,一个名字包括几个组成部分,对于SOCK_PROGRAM和SOCK_STREAM类套接口,名字由三部分组成:
主机地址,协议号(显式设置为UDP和TCP)和用以区分应用的端口号。
如果一个应用并不关心分配给它的地址,则可将Internet地址设置为INADDR_ANY,或将端口号置为0。
如果Internet地址段为INADDR_ANY,则可使用任意网络接口;在有多种主机环境下可简化编程。
如果端口号置为0,则WINDOWS套接口实现将给应用程序分配一个值在1024到5000之间的唯一的端口。
应用程序可在bind()后用getsockname()来获知所分配的地址,但必需注意的是,getsockname()只有在套接口连接成功后才会填写Internet地址,这是由于在多种主机环境下若干种Internet地址都是有效的。
如果一个应用程序需要把端口捆绑到超过1024-5000范围的特定端口时,比如rsh需要捆绑到任一保留端口,则可如下编程:
SOCKADDR_INsin;
SOCKETs;
u_shortalport=IPPORT_RESERVED;
sin.sin_family=AF_INET;
sin.sin_addr.s_addr=0;
for(;;){
sin.sin_port=htons(alport);
if(bind(s,(LPSOCKADDR)&sin,sizeof(sin))=0){
/*itworked*/
}
if(GetLastError()!
=WSAEADDRINUSE){
/*fail*/
}
alport-;
if(alport=IPPORT_RESERVED/2){
/*fail-allunassignedreservedportsare*/
/*inuse.*/
}
}
3.返回值
如无错误发生,则bind()返回0。
否则的话,将返回SOCKET_ERROR,应用程序可通过WSAGetLastError()获取相应错误代码。
4.错误代码
WSANOTINITIALISED:
在使用此API之前应首先成功地调用WSAStartup()。
WSAENETDOWN:
WINDOWS套接口实现检测到网络子系统失效。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- linux 网络 编程 相关 知识