SOCKET函数详解(My整理)
C语言socket()函数

C语言socket()函数:建立一个socket通信相关函数:accept, bind, connect, listen头文件:#include <sys/types.h> #include <sys/socket.h>定义函数:int socket(int domain, int type, int protocol);函数说明:socket()用来建立一个新的socket, 也就是向系统注册, 通知系统建立一通信端口. 参数domain 指定使用何种的地址类型, 完整的定义在/usr/include/bits/socket.h 内, 底下是常见的协议:PF_UNIX/PF_LOCAL/AF_UNIX/AF_LOCAL UNIX 进程通信协议PF_INET?AF_INET Ipv4 网络协议PF_INET6/AF_INET6 Ipv6 网络协议PF_IPX/AF_IPX IPX-Novell 协议PF_NETLINK/AF_NETLINK 核心用户接口装置PF_X25/AF_X25 ITU-T X. 25/ISO-8208 协议PF_AX25/AF_AX25 业余无线AX. 25 协议PF_ATMPVC/AF_ATMPVC 存取原始ATM PVCsPF_APPLETALK/AF_APPLETALK appletalk (DDP)协议PF_PACKET/AF_PACKET 初级封包接口参数type 有下列几种数值:1、SOCK_STREAM 提供双向连续且可信赖的数据流, 即TCP. 支持OOB 机制, 在所有数据传送前必须使用connect()来建立连线状态.2、SOCK_DGRAM 使用不连续不可信赖的数据包连接3、SOCK_SEQPACKET 提供连续可信赖的数据包连接4、SOCK_RAW 提供原始网络协议存取5、SOCK_RDM 提供可信赖的数据包连接6、SOCK_PACKET 提供和网络驱动程序直接通信. protocol 用来指定socket 所使用的传输协议编号, 通常此参考不用管它, 设为0 即可.返回值:成功则返回socket 处理代码, 失败返回-1.错误代码:1、EPROTONOSUPPORT 参数domain 指定的类型不支持参数type 或protocol 指定的协议2、ENFILE 核心内存不足, 无法建立新的socket 结构3、EMFILE 进程文件表溢出, 无法再建立新的socket4、EACCESS 权限不足, 无法建立type 或protocol 指定的协议5、ENOBUFS/ENOMEM 内存不足6、EINVAL 参数domain/type/protocol 不合法范例:参考connect().。
socket函数的三个参数

socket函数的三个参数标题:socket函数的使用方法导语:在计算机网络中,socket函数是一种用于实现网络通信的编程接口。
它是网络应用程序与网络之间的通信端点,通过socket函数可以实现进程间的通信和数据传输。
本文将详细介绍socket函数的三个参数的使用方法,帮助读者理解并能够灵活应用socket函数。
一、参数一:domain(套接字的协议域)在socket函数中,参数domain指定了套接字的协议域。
协议域是一组协议的集合,它定义了套接字可以用于通信的协议类型。
常用的协议域包括AF_INET(IPv4协议)、AF_INET6(IPv6协议)、AF_UNIX(本地通信协议)等。
1. AF_INET(IPv4协议)在使用IPv4协议进行通信时,可以使用AF_INET作为套接字的协议域。
IPv4协议是当前广泛应用的网络协议,它使用32位地址来标识网络中的主机。
2. AF_INET6(IPv6协议)当需要使用IPv6协议进行通信时,可以选择AF_INET6作为套接字的协议域。
IPv6协议是IPv4协议的升级版,它使用128位地址来标识网络中的主机,解决了IPv4地址不足的问题。
3. AF_UNIX(本地通信协议)如果需要在同一台主机上的进程之间进行通信,可以选择AF_UNIX 作为套接字的协议域。
AF_UNIX提供了一种本地通信的方式,不需要通过网络传输数据。
二、参数二:type(套接字的类型)在socket函数中,参数type指定了套接字的类型。
套接字的类型决定了套接字的工作方式和特性。
常用的套接字类型包括SOCK_STREAM(流式套接字)和SOCK_DGRAM(数据报套接字)。
1. SOCK_STREAM(流式套接字)当需要建立可靠的、面向连接的通信时,可以选择SOCK_STREAM作为套接字的类型。
流式套接字提供了一种面向连接的、可靠的通信方式,数据按照顺序传输,不会丢失和重复。
2. SOCK_DGRAM(数据报套接字)如果需要进行无连接的、不可靠的通信,可以选择SOCK_DGRAM作为套接字的类型。
cc++socket函数详解

cc++socket函数详解c/c++ socket函数详解注意: 使⽤socketAPI前,要先将相关链接库(Ws2_32.lib)加⼊链接,并使⽤WSAStartUp函数初始化。
在linux中地址结构体sockaddr的结构与windows的不太⼀样,具体请百度每个socket函数都可能失败(返回-1),需要判断结果socket分成两种:⼀种专门⽤来监听新链接(或新活动),这种socket叫做master socket,⼀般只存在于服务器⼀种专门⽤来收发数据,这种socket叫做connected socket,客户端和服务器都存在int socket(int af,int type,int protocol);// 建⽴⼀个socket⽤于连接af:address family,如AF_INETtype:连接类型,通常是SOCK_STREAM或SOCK_DGRAMprotocol:协议类型,通常是IPPROTO_TCP或IPPROTO_UDP// 返回值:socket的编号,为-1表⽰失败int bind(int socket,sockaddr * address,uint addrlen);// 将⼀个地址和⼀个端⼝号绑定到⼀个socket连接上// socket:之前创建的socket// sockaddr:⼀个⽤来存放Ip地址和端⼝号的结构体// addrlen:上述结构体的长度// 返回值:为-1表⽰失败,若端⼝被占⽤,会从新绑定⼀个随机端⼝(仍返回失败)// 地址绑定为0表⽰绑定本机所有IPint sendto(int socket,char * buf,uint buflen,int flag,sockaddr * address,uint addrlen);【仅UDP】// 向⼀个指定的地址发送缓冲区内指定长度的消息// socket:之前创建的socket// buf:要发送的缓冲区// buflen:要发送的长度// flag:⼀般为0// sockaddr:⽬标地址// addrlen:上述结构体的长度// 返回值:发送出去的长度int recvfrom(int socket,char * buf,uint buflen,int flag,sockaddr * fromaddr,int * addrlen);【阻塞】【仅UDP】// 接收消息,可以获取发送⽅的地址// fromaddr:发送⽅地址(输出参数)// addrlen:发送⽅地址结构体的长度(输⼊输出参数)// 返回值:>0表⽰收到的字节数,=0表⽰连接被关闭,-1表⽰出错int recv(int socket,char * buf,uint buflen,int flag);【阻塞】// UDP时:接收任何⼀个发送到该socket的消息(⽆法获取发送⽅地址)// TCP时:接收⼀个已连接的socket (connected socket)发送的信息// socket:UDP时,为之前创建的socket,TCP时,为connected socket// buf:接收的缓冲区// buflen:缓冲区的长度// flag:⼀般为0// 返回值:>0表⽰收到的字节数,=0表⽰连接被关闭,-1表⽰出错// 注意:对于TCP,请确保socket是已连接的,因为只有已连接的socket会阻塞此函数// 该函数实际上是从缓冲区取指定长度的数据,如果缓冲区没有数据,则会阻塞;如果没有取完,则下次使⽤此函数的时候不会阻塞// 应注意:当⼀次⽆法获得对⽅发送的全部数据,在数据不完整的时候,程序可能⽆法向下执⾏,可以考虑将数据放在缓冲区中,等数据全部接收完成的时候再使⽤int getsockname(int socket,sockaddr * address,int * addrlen);// 获取指定socket上绑定的IP、端⼝信息(不能获取connected socket上的地址信息)// address:socket上绑定的地址(输出参数)// addrlen:socket上绑定的地址结构体的长度(输⼊输出参数)int getpeername(int socket,,sockaddr * address,int * addrlen);【仅TCP】// 获取⼀个已连接的socket的地址、端⼝信息// 参数含义同上struct sockaddr_in⼀个⽤来指定IP地址和端⼝号的结构体(不太好⽤,建议将其封装) family // 即address family,如AF_INET port // 端⼝号(注意要按位倒序,使⽤htons函数) sin_addr.S_un.S_addr // ⼀个为long类型的ip地址该结构体所有成员的字序为⽹络字序,低字节在前,⾼字节在后int listen(int socket,int maxconn);【仅TCP】【服务器】// 将⼀个socket设置为监听状态,专门⽤来监听的socket叫做master socket// maxconn:最⼤接收连接数// 返回值:失败返回-1,成功返回0int accept(int socket,sockaddr * fromaddr,int * addrlen);【阻塞】【仅TCP】【服务器】// 接收⼀个客户机的连接,返回⼀个socket,来⾃客户机的socket叫connected socket// socket:⽤来监听的socket(master socket)// fromaddr:客户机的地址信息// addrlen:地址结构体的长度(输⼊输出参数)// 返回值:返回⼀个新的socket,这个socket专门⽤来与此客户机通讯(connected socket)int connect(int socket,sockaddr * addr,int addrlen);【仅TCP】【客户端】// 使⽤当前socket连接⼀个地址(与服务器建⽴正式连接),此函数会触发服务器端的accept、select函数// 注意:服务端接收的socket值和客户端socket值不⼀样// addr:⼀般是服务器地址int send(int socket,char * buf,char buflen,int flag);【仅TCP】// 向⼀个已连接的socket发送信息,这个socket应该是connected socket(⾮master socket)int closesocket(int socket);// 关闭⼀个已存在的socket【正常关闭】// 失败返回-1,成功返回0UDP通讯流程WSAStartup()socket()bind()sendto(connected socket)/recv()/recvfrom()TCP通讯流程(服务器):WSAStartup()socket()bind()listen()accept()send()/recv()TCP通讯流程(客户端):WSAStartup()socket()bind()connect()send()/recv()。
Socket调用方式(同步,异步,阻塞,非阻塞)

Socket调⽤⽅式(同步,异步,阻塞,⾮阻塞)同步:我调⽤⼀个功能,该功能没有结束前,我死等结果。
异步:当⼀个异步过程调⽤发出后,调⽤者不能⽴刻得到结果。
该功能在完成后,通过状态、通知和回调来通知调⽤者。
同步和⾮同步关注的是调⽤者是否等待等待调⽤结果。
举个通俗的例⼦:你打电话问书店⽼板有没有《分布式系统》这本书,如果是同步通信机制,书店⽼板会说,你稍等,”我查⼀下",然后开始查啊查,等查好了(可能是5秒,也可能是⼀天)告诉你结果(返回结果)。
⽽异步通信机制,书店⽼板直接告诉你我查⼀下啊,查好了打电话给你,然后直接挂电话了(不返回结果)。
然后查好了,他会主动打电话给你。
在这⾥⽼板通过“回电”这种⽅式来回调。
阻塞:调⽤我(函数),我(函数)没有接收完数据或者没有得到结果之前,我不会返回。
⾮阻塞:调⽤我(函数),我(函数)⽴即返回通知调⽤者以最常⽤的send和recv两个函数为例⽐如你调⽤send函数发送⼀定的Byte,在系统内部send做的⼯作其实只是把数据传输(Copy)到TCP/IP协议栈的输出缓冲区,它执⾏成功并不代表数据已经成功的发送出去了,如果TCP/IP协议栈没有⾜够的可⽤缓冲区来保存你Copy过来的数据的话...这时候就体现出阻塞和⾮阻塞的不同之处了:对于阻塞模式的socket send函数将不返回直到系统缓冲区有⾜够的空间把你要发送的数据Copy过去以后才返回,⽽对于⾮阻塞的socket来说send会⽴即返回WSAEWOULDDBLOCK告诉调⽤者说:"发送操作被阻塞了!!!你想办法处理吧..."对于recv函数,同样道理,对于阻塞模式的socket来说如果TCP/IP协议栈的接收缓冲区没有通知⼀个结果给它它就⼀直不返回:耗费着系统资源....对于⾮阻塞模式的socket该函数会马上返回,然后告诉你:WSAEWOULDDBLOCK---"现在没有数据,回头再来看看"阻塞I/O模型:⾮阻塞I/O模型:阻塞和⾮阻塞关注的是调⽤者在等待调⽤结果时的状态。
Linux下C语言的socket函数解析

Linux下C语言的socket函数解析socketsocket()我们使用系统调用socket()来获得文件描述符:#include#includeint socket(int domain,int type,int protocol);第一个参数domain设置为“AF_INET”。
第二个参数是套接口的类型:SOCK_STREAM或SOCK_DGRAM。
第三个参数设置为0。
系统调用socket()只返回一个套接口描述符,如果出错,则返回-1。
bind()一旦你有了一个套接口以后,下一步就是把套接口绑定到本地计算机的某一个端口上。
但如果你只想使用connect()则无此必要。
下面是系统调用bind()的使用方法:#include#includeintbind(int sockfd,struct sockaddr*my_addr,int addrlen);第一个参数sockfd是由socket()调用返回的套接口文件描述符。
第二个参数my_addr是指向数据结构sockaddr的指针。
数据结构sockaddr中包括了关于你的地址、端口和IP地址的信息。
第三个参数addrlen可以设置成sizeof(structsockaddr)。
下面是一个例子:#include#include#include#define MYPORT 3490main(){int sockfd;struct sockaddr_inmy_addr;sockfd=socket(AF_INET,SOCK_STREAM,0);/*do someerror checking!*/my_addr.sin_family=AF_INET;/*hostbyteorder*/my_addr.sin_port=htons(MYPORT);/*short,network byte order*/my_addr.sin_addr.s_addr=inet_addr("132.241.5.10");bzero(&(my_addr.sin_zero),8);/*zero the rest of the struct*//*don't forget your error checking for bind():*/bind(sockfd,(struct sockaddr*)&my_addr,sizeof(struct sockaddr));...如果出错,bind()也返回-1。
SOCKET常用函数的返回值分析

SOCKET常用函数的返回值分析
from /icedmilk/article/details/53361) accept()
如果成功就返回生成的SOCKET,如果失败就返回INVALID_SOCKET.
#define INVALID_SOCKET (SOCKET)(~0)
实际上是 0xFFFFFFFF 4bytes
bind() listen() connect()
如果成功就返回0,如果失败就返回SOCKET_ERROR,需要通过WSAGetLastError获得进一步的错误信息.
#define SOCKET_ERROR (-1)
实际上是 0xFFFFFFFF 4bytes
send() sendto()
如果成功就返回发送的字节数,如果失败就返回SOCKET_ERROR,需要通过WSAGetLastError获得进一步的错误信息.
recv() recvfrom()
如果成功就返回收到的字节数,如果如果失败就返回SOCKET_ERROR,需要通过WSAGetLastError获得进一步的错误信息.
如果连接被温和的关闭,返回0,但是recvfrom通常是用于无连接的UDP socket.
socket的accept函数解析

socket的accept函数解析socket的accept函数解析今天与同学争执⼀个话题:由于socket的accept函数在有客户端连接的时候产⽣了新的socket⽤于服务该客户端,那么,这个新的socket到底有没有占⽤⼀个新的端⼝?讨论完后,才发现,⾃⼰虽然熟悉socket的编程套路,但是却并不是那么清楚socket的原理,今天就趁这个机会,把有关socket编程的⼏个疑问给搞清楚吧。
先给出⼀个典型的TCP/IP通信⽰意图。
问题⼀:socket结构体对象究竟是怎样定义的?我们知道,在使⽤socket编程之前,需要调⽤socket函数创建⼀个socket对象,该函数返回该socket对象的描述符。
1. 函数原型:int socket(int domain, int type, int protocol);那么,这个socket对象究竟是怎么定义的呢?它记录了哪些信息呢?只记录了本机IP及端⼝、还是⽬的IP及端⼝、或者都记录了?关于这个问题,⼤家可以在内核源码⾥⾯找,也可以参考这篇⽂章《struct socket 结构详解》,我们可以看到 socket 结构体的定义如下:1. struct socket2. {3. socket_state state;4. unsigned long flags;5. const struct proto_ops *ops;6. struct fasync_struct *fasync_list;7. struct file *file;8. struct sock *sk;9. wait_queue_head_t wait;10. short type;11. };其中,struct sock 包含有⼀个 sock_common 结构体,⽽sock_common结构体⼜包含有struct inet_sock 结构体,⽽struct inet_sock 结构体的部分定义如下:1. struct inet_sock2. {3. struct sock sk;4. #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)5. struct ipv6_pinfo *pinet6;6. #endif7. __u32 daddr; //IPv4的⽬的地址。
C Socket

bytes_sent = send(sockfd, msg,len,0);
……
recv()函数原型为:
int recv(int sockfd,void *buf,int len,unsigned int flags);
Sockfd是接受数据的socket描述符;buf 是存放接收数据的缓冲区;len是缓冲的长度。Flags也被置为0。Recv()返回实际上接收的字节数,当出现错误时,返回-1并置相应的errno值。
Send()函数原型为:
int send(int sockfd, const void *msg, int len, int flags);
Sockfd是你想用来传输数据的socket描述符;msg是一个指向要发送数据的指针;Len是以字节为单位的数据的长度;flags一般情况下置为0(关于该参数的用法可参照man手册)。
Listen函数使socket处于被动的监听模式,并为该socket建立一个输入数据队列,将到达的服务请求保存在此队列中,直到程序处理它们。
int listen(int sockfd, int backlog);
Sockfd 是Socket系统调用返回的socket 描述符;backlog指定在请求队列中允许的最大请求数,进入的连接请求将在队列中等待accept()它们(参考下文)。Backlog对队列中等待 服务的请求的数目进行了限制,大多数系统缺省值为20。如果一个服务请求到来时,输入队列已满,该socket将拒绝连接请求,客户将收到一个出错信息。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Socket 函数说明1.1 库函数综述1.1.1 套接字函数表 1.1 Windows Sockets 1.1 版本Berkeley Sockets函数函数名说明accept()确认外来连接,并将它与一个立即建立的数据套接字联系起来。
原始套接字返回到监听状态bind() 给未命名套接字赋一个本地名closesocket()从进程对象参考表中删去一个套接字,只有当SO_LINGER设置时才阻塞connect()在指定套接字上初始化连接getpeername() 获取与指定套接字连接的对等方的名字getsockname() 获取指定套接字的当前名字getsockopt() 获取与指定套接字相关的选项htonl() 将一个32位数从主机字节顺序转换为网络字节顺序htons() 将一个16 位数从主机字节顺序转换为网络字节顺序inet_addr() 将一个用网际标准点分表示法表示的字符串地址转换成网际地址值inet_ntoa() 将一个网际地址值转换成一个用点分十进制表示法表示的字符串地址ioctlsocket() 为套接字提供控制listen() 在指定套接字上监听外来连接ntohl() 将一个32位数从网络字节顺序转换为主机字节顺序ntohs() 将一个16 位数从网络字节顺序转换为主机字节顺序recv()从一个连接的套接字上接收数据recvfrom()从一个连接或未连接的套接字上接收数据select()执行多路同步I/Osend()给一个连接套接字发送数据sendto()给一个连接或未连接套接字发送数据setsockopt() 设置与指定套接字相关的选项shutdown() 关闭全双工连接的一部分socket() 建立一个通讯用的末端点,返回一个套接字注:标红函数作用在阻塞套接字上可以阻塞。
这些函数根据功能的不同可以分为如下几类:(1) 套接字函数。
此类函数包括socket(),bind(),getpeername(),getsockname()和closesocket(),它们主要完成创建,关闭套接字功能,以及对套接字命名与名字获取。
(2) 网络连接函数。
此类函数包括listen() ,accept(),connect()和shutdown(),它们完成网络连接(如虚电路)的建立与关闭。
此类函数中有部分可阻塞。
(3) 数据传输函数。
此类函数包括send(),recv() ,sendto()和recvfrom() ,它们完成网络数据的发送与接收,全部是可以阻塞的函数。
(4) 字节定序函数。
此类函数包括htonl(),htons(),ntohl()和ntohs(),它们完成主机/网络之间数据字节顺序的转换。
(5) 地址转换函数。
此类函数包括inet_addr(),inet_ntoa(),它们完成网络字符串地址和Internet 地址之间的转换。
(6) 套接字控制函数。
此类函数包括getsockopt(),setsockopt(),ioctlsocket()和select(),它们设置/获取套接字的选项,控制/检测套接字的工作状态。
其中select()函数在必要时可能阻塞。
只使用了上述函数Berkeley Sockets 源程序基本上可以不加修改地移植到Windows Sockets 环境中来。
但是,移植过来的程序有一个最大的问题是“阻塞”。
在Berkeley Sockets 中,套接字默认的工作模式是操作处于阻塞方式,一个阻塞操作可能阻塞整个Windows 环境。
在非抢先Windows环境,强烈推荐程序员使用非阻塞(异步)操作,也就是说,推荐使用Windows Sockets 提供的异步选择函数代替可能阻塞的select()函数,并且用网络事件消息来驱动可能阻塞的网络连接函数(accept()和connect())和数据传输函数,这样设计的程序能更好地工作。
1.1.2 数据库函数Windows Sockets定义了如表1.2 所示的“数据库”函数:表 1.2 Windows Sockets 1.1 版本定义的“数据库”函数函数名说明gethostbyaddr() 通过网络地址获取主机名字和地址等信息gethostbyname() 通过主机名字获取主机名字和地址等信息gethostname()获取本地主机名getprotobyname() 通过协议名获取协议名和协议号等信息getprotobynumber() 通过协议号获取协议名和协议号等信息getservbyname() 通过服务名获取服务的名字和端口等信息getservbyport() 通过端口获取服务的名字和端口等信息注:标红函数在某些条件下可以阻塞。
提供这类函数是为了获取网络特定的信息,在最初的Berkeley版本中,它们是作为在文本数据库文件中寻找信息的机构。
在Windows Sockets实现中,可能使用了不依赖于本地数据库文件的方法(如域名服务),但是对应用程序来说请求这些信息的格式是一致的,并且对应用程序来说是透明的。
调用这些函数所获得的信息存放在由Windows Sockets实现分配的一个结构中,函数返回此结构的地址。
因此,应用程序可以通过此结构指针获取所需要的信息,但它决不能试图修改此结构,更不能释放结构的任一部分。
另外,对一个线程来说,Windows Sockets实现只分配了结构的一个备份,任何Windows Sockets API 调用都可能修改此结构。
也就是说,结构指针指向的数据只在此线程的下一次Windows Sockets API 调用之前才是正确的,应用程序应该在发布任何其它Windows Sockets API 调用之前将任何需要的信息拷贝出来。
数据库函数除gethostname()之外都是阻塞的,Windows Sockets提供它们是为了Berkeley Sockets网络程序的可移植性。
在设计实现Windows Sockets 应用程序时,推荐使用Windows Sockets 提供的数据库函数的异步版本。
1.2 标准Socket 函数1.2.1 accept()语法:SOCKET WSAAPIaccept ( IN SOCKET s,OUT struct sockaddr FAR* addr,OUT int FAR* addrlen );此函数用于从套接字上接收一个连接。
它提取挂在套接字s 上的连接队列中的第一个连接,创建一个和s 有相同属性(包括使用函数WSAAsyncSelect()或WSAEventSelect()注册的异步事件,但不包括监听套接字的套接字组ID)的新数据套接字,并返回一个指向新套接字的句柄。
如果连接队列上没有等待的连接,并且套接字没有标志为非阻塞,那么accept() 阻塞调用直到出现一个连接。
如果套接字标志为非阻塞,并且队列上没有等待的连接,那么accept()返回错误WSAEWOULDBLOCK。
新创建的数据套接字不能用来接收更多的连接,它只能用于数据传输;原来的套接字仍然打开,处于监听连接状态。
参数描述:s,这是一个套接字描述符,该套接字在用作accept()函数的参数前必须先调用过listen()函数,此时它正处于监听连接的状态。
addr ,一个可选的指向缓冲区的指针,用来接收连接实体的地址,在通讯层使用。
addr的确切格式由套接字创建时建立的地址族决定。
addrlen ,一个可选的指向整数的指针,它调用时含有地址addr指向的空间的大小,返回时含有返回的地址的确切长度(字节数)。
返回值:如果没有错误发生,accept()返回一个SOCKET类型的值,表示接收到的套接字的描述符。
否则返回值INVALID_SOCKET,错误码可通过调用WSAGetLastError()函数得到。
错误码:WSANOTINITIALISED :未初始化Windows Sockets DLL,在使用此函数之前必须有一次成功的WSAStartup()函数调用。
WSAENETDOWN: Windows Sockets 实现检测到网络系统已经失败。
WSAEFAULT: 参数addrlen 太小(小于结构sockaddr 的大小),或参数addr不是用户地址空间的合法部分。
WSAEINTR:此(阻塞)调用已被WSACancelBlockingCall()函数取消。
WSAEINPROGRESS:一个阻塞的Windows Sockets 操作正在进行。
WSAEINVAL:在accept()调用之前没有执行过listen()。
WSAEMFILE:accept()队列入口空,但没有文件描述符可用(即打开的文件描述符过多)。
WSAENOBUFS:无缓冲区空间可用。
WSAENOTSOCK:描述符s不是套接字描述符。
WSAEOPNOTSUPP:s 指向的套接字不是一种支持面向连接服务类型的套接字。
WSAEWOULDBLOCK:套接字标志为非阻塞,但现在没有接收到连接。
注释:该调用只能和基于连接的套接字类型如SOCK_STREAM 一起使用。
如果参数addr 和/或addrlen 等于NULL,那么没有关于接收套接字的远程地址信息返回。
参见:bind(), connect(), listen(), select(), socket(), WSAAsyncSelect(), WSAAccept()。
1.2.2 bind()语法:int WSAAPIbind ( IN SOCKET s,IN const struct sockaddr FAR* name,IN int namelen );此函数用于未连接的数据报或流套接字,它将一本地地址与套接字连接,即建立半相关。
当一套接字用socket()创建后,它存在于一名字空间(地址族), 但它没有赋予名字。
bind()通过将一本地名字赋予一未命名的套接字, 建立起套接字的本地连接(主机地址/端口号)。
参数描述:s,指示未连接的数据报或流套接字的描述符。
name,赋给套接字的本地地址(名字)。
结构sockaddr 定义如下:struct sockaddr { u_short sa_family;char sa_data[14];}; //除sa_family 外,其它内容都以网络字节顺序表示。
namelen,地址缓冲区长度。
返回值:如果没有错误发生,bind()返回0。
否则返回值SOCKET_ERROR,错误码可通过调用WSAGetLastError()函数得到。
错误码:WSANOTINITIALISED:未初始化Windows Sockets DLL,在使用此函数之前必须有一次成功的WSAStartup()函数调用。
WSAENETDOWN :Windows Sockets 实现检测到网络系统已经失败。