13.2.3 bind函数
bind函数用于将套接字与指定端口相连,其具体信息如表13.4所示。
表13.4 bind函数
头文件 |
<sys/types.h> <sys/socket.h> | ||
函数形式 |
int bind(int sockfd, const struct sockaddr *my_addr, socklen_t addrlen); | ||
返回值 |
成功 |
失败 |
是否设置errno |
0 |
−1 |
是 |
说明:
当调用socket函数创建套接字后,该套接字并没有与本机地址和端口等信息相连,bind函数将完成这些工作。bind函数中的sockfd参数为调用socket函数后返回的文件描述符。my_addr参数为指向sockaddr结构体的指针(该结构体中保存有端口和IP地址信息)。addlen参数为结构体sockaddr的长度。
错误信息:
EACCES:地址受到保护,用户非超级用户。
EADDRINUSE:指定的地址已经在使用。
EBADF:sockfd参数为非法的文件描述符。
EINVAL:socket已经和地址绑定。
ENOTSOCK:参数sockfd为文件描述符。
实例演练:
下面的代码来自于Linux系统的man帮助,注意创建套接字和使用bind函数实现socket的文件描述符与地址信息绑定的过程。
|
13.2.4 listen函数
服务器必须等待客户的连接请求,listen函数用于实现等待功能,该函数的具体信息如表13.5所示。
表13.5 listen函数
头文件 |
<sys/socket.h> | ||
函数形式 |
int listen(int sockfd, int backlog); | ||
返回值 |
成功 |
失败 |
是否设置errno |
0 |
−1 |
是 |
说明:
listen函数中,参数sockfd为调用socket函数获得的套接字的文件描述符信息。backlog参数为提出连接请求后,在服务器接收该连接请求时的等待队列中的连接数。默认情况,该值为20。
系统调用listen只用于套接字类型为SOCK_STREAM或SOCK_SEQPACKET的场合。
错误信息:
EADDRINUSE:另一个socket也在监听同一个端口。
EBADF:参数sockfd为非法的文件描述符。
ENOTSOCK:参数sockfd不是文件描述符。
EOPNOTSUPP:套接字类型不支持listen操作。
13.2.5 accept函数
处于监听状态的服务器在获得客户机的连接请求后,会将其放置在等待队列中。当系统空闲时,将接受客户机的连接请求。接收客户机的连接请求使用accept函数,该函数的具体信息如表13.6所示。
表13.6 accept函数
头文件 |
<sys/types.h> <sys/socket.h> | ||
函数形式 |
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen); | ||
返回值 |
成功 |
失败 |
是否设置errno |
返回新的套接字文件描述符 |
−1 |
是 |
说明:accept函数用于面向连接类型的套接字类型(SOCK_STREAM和SOCK_SEQPACKET)。accept函数将从连接请求队列中获得连接信息,创建新的套接字,并返回该套接字的文件描述符。新创建的套接字用于服务器与客户机的通信,而原来的套接字仍然处于监听状态。
accept函数的sockfd参数为监听的套接字描述符。addr参数为指向结构体sockaddr的指针。参数addrlen为addr参数指向的内存空间的长度。
错误信息:
EAGAIN:套接字处于非阻塞状态,当前没有连接请求。
EBADF:非法的文件描述符。
ECONNABORTED:连接中断。
EINTR:系统调用被信号中断。
EINVAL:套接字没有处于监听状态,或非法的addrlen参数。
EMFILE:达到进程打开文件描述符限制。
ENFILE:达到打开文件数限制。
ENOTSOCK:文件描述符为文件的文件描述符。
EOPNOTSUPP:套接字类型不是SOCK_STREAM。
13.2.6 connect函数
对于客户机而言,要与服务器进行通信,需要向服务器发出连接请求。connect函数用于完成这项功能,该函数的具体信息如表13.7所示。
表13.7 connect函数
头文件 |
<sys/types.h> <sys/socket.h> | ||
函数形式 |
int connect(int sockfd, const struct sockaddr *serv_addr, socklen_t addrlen); | ||
返回值 |
成功 |
失败 |
是否设置errno |
0 |
−1 |
是 |
说明:connect函数将使用参数sockfd中的套接字连接到参数serv_addr中指定的服务器。参数addrlen为serv_addr指向的内存空间大小。
如果参数sockfd的类型为SOCK_DGRAM,serv_addr参数为数据报发往的地址,且将只接收该地址的数据报。如果sockfd的类型为SOCK_STREAM或SOCK_SEQPACKET,调用该函数将连接serv_addr中的服务器地址。
错误信息:
EACCES, EPERM:用户试图在套接字广播标志没有设置的情况下连接广播地址或由于防火墙策略导致连接失败。
EADDRINUSE:本地地址处于使用状态。
EAFNOSUPPORT:参数serv_add中的地址非合法地址。
EAGAIN:没有足够空闲的本地端口。
EALREADY:套接字为非阻塞套接字,并且原来的连接请求还未完成。
EBADF:非法的文件描述符。
ECONNREFUSED:远程地址并没有处于监听状态。
EFAULT:指向套接字结构体的地址非法。
EINPROGRESS:套接字为非阻塞套接字,且连接请求没有立即完成。
EINTR:系统调用的执行由于捕获中断而中止。
EISCONN:已经连接到该套接字。
ENETUNREACH:网络不可到达。
ENOTSOCK:文件描述符不与套接字相关。
ETIMEDOUT:连接超时。