1. 套接字与地址绑定
用bind函数讲地址绑定到一个套接字。
#include <sys/socket.h>
int bind (int sockfd, const struct sockaddr *addr, socklen_t len); 返回值:若成功则返回0,若出错则返回-1.
调用函数getsockname来发现绑定到一个套接字的地址。
#include <sys/socket.h>
int getsockname (int sockfd, struct sockaddr *restrict addr, socklen_t *restrict alenp);
如果套接字已经和对方链接,调用getpeername来找到对方的地址。
#include <sys/socket.h>
int getpeername (int sockfd, struct sockaddr *restrict addr, socklen_t *restrict alenp);
如果处理的是面向连接的网络服务,需要在请求服务的套接字(客户端)和提供服务的进程套接字(服务器)之间建立连接。
#include <sys/socket.h>
int connect (int sockfd, const struct sockaddr *addr, socklen_t len); 若成功则返回0,失败返回-1.
服务器调用listen来宣告可以接受连接请求。
#include <sys/socket.h>
int listen (int sockfd, int backlog);
使用accept获得连接请求并建立连接。
#include <sys/socket.h>
int accept (int sockfd, struct sockaddr *restrict addr, socklen_t *restrict len); 若成功返回文件描述符,错误返回-1.
2.数据传输
三个函数用来发送数据,三个函数用来接受数据。
#include <sys/socket.h>
ssize_t send(int sockfd, const void *buf, size_t nbytes, int flags); 返回值:若成功返回发送的字节数,若出错则返回-1.
函数 sendto允许在无连接的套接字上指定一个目标地址。
#include <sys/socket.h>
sszize_t sendto(int sockfd, const void *buf, size_t nbytes, int flags, const struct sockaddr *destaddr, socklen_t destlen);
返回值: 若成功则返回发送的字节数,若出错则返回-1.
调用带有msghdr结构的sendmsg来指定多重缓冲区传输数据。
#include <sys/socket.h>
ssize_t sendmsg (int socket, const struct msghdr *msg, int flags);
返回值:若成功则返回发送的字节数,若出错则返回-1.
函数recv和read很像,但是允许指定选项来控制如何接收数据。
#include <sys/socket.h>
ssize_t recv(int sockfd, void *buf, size_t nbytes, int flags); 返回值:以字节计数的消息长度,若无可用消息或对方已经按序结束则返回0,若出错则返回-1.
如果兴趣定位发送者,可以使用recvfrom来得到数据发送者的源地址。
#include <sys/socket.h>
ssize_t recvfrom(int sockfd, void *restrict buf, size_t len, int flags, struct sockaddr *restrict addr, socklen_t *restrict addrlen);
返回值:以字节计数的消息长度,若无可用消息或对方已经按序结束则返回0,若出错则返回-1.
为了将接收到的数据送入多个缓冲区,或者想接收辅助数据,可以使用recvmsg.
#include <sys/socket.h>
ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags);
返回值:以字节计数的消息长度,若无可用消息或对方已经按序结束则返回0,若出错则返回-1.