struct sockaddr {
sa_family_t sa_family; /* unsigned short , 指定了通信协议家族 */
char sa_data[14];
};
通用结构体:
struct sockaddr {
sa_family_t sa_family; /* unsigned short , 指定了通信协议家族 */
char sa_data[14];
};
IPV4网络通信地址结构体:
struct sockaddr_in {
pa_family_t sin_family;
port_t sin_port;
struct in_addr {
unsigned int s_addr;
}sin_addr;
};
UNIX本地通信地址结构体:
struct sockaddr_un {
sa_family_t sun_family;
char sun_path[108];
};
函数名:int socket (int domain, int type, int protocl)
功能:打开一个套接字,并返回一个相关的文件描述符。
返回值:成功,一个新的文件描述符;失败, -1;
参数表:
int domain, 通信域:
AF_INET | AF_INET6 | AF_UNIX | AF_PACKET
int type, 套接字类型:
SOCK_STREAM 流式套接字
SOCK_DGRAM 数据报套接字
SOCK_RAW 原始套接字
int protocl, 协议(在原始套接字中根据需要选择使用,流式或数据报套接字中为 0)
函数名: int bind(int sockfd, const struct sockaddr * addr, socklen_t addrlen);
功能:为一个打开的套接字,绑定一个地址(IP+PORT)。
返回值:成功, 0;失败, -1;
参数表:
int sockfd, 通过socket打开并返回的文件描述符。
const struct sockaddr * addr, 通用结构体地址,具体根据通信域选择相关的地址格式。
socklen_t addrlen, 实际地址结构体的大小。
函数名: int sendto(int sockfd, void *buff, size_t size, int flag, const struct sockaddr *addr, socklen_t addrlen);
功能:向一个指定的目标主机发送数据包。
返回值:成功,实际发送的字节数;失败, -1;
参数表:
int sockfd, 通过socket打开并返回的文件描述符。
void *bufff, 即将发送的数据。
size_t size,数据大小。
int flag, 发送标志位(阻塞、非阻塞等,如果无特殊要求则设置为0)。
const struct sockaddr * addr, 目标主机的地址结构体(IP+PORT)。
socklen_t addrlen, 目标主机地址结构体大小。
函数名: int recvfrom(int sockfd, void *buff, size_t size, int flag, struct sockaddr *addr, socklen_t *addrlen);
功能:接受一个数据包,并带回数据包的来源地址。
返回值:成功,实际接收的字节数;失败, -1;对方关闭, 0;
参数表:
int sockfd, 通过socket打开并返回的文件描述符。
void *bufff, 接受数据的缓冲区。
size_t size,缓冲区大小。
int flag, 接收标志位(阻塞、非阻塞等,如果无特殊要求则设置为0)。
struct sockaddr * addr, 用来保存数据源主机的地址的结构体(IP+PORT)。
socklen_t *addrlen, 期望接收的数据源主机的地址结构体大小(在使用前由用户自己初始化);一旦该函数调用结束,该变量会被修改为实际大小。
函数名: int listen(int sockfd, int backlog);
功能:将一个经过bind的套接字置为被动状态,以便将来使用accept接受新的请求。
返回值:成功, 0;失败, -1;
参数表:
int sockfd, 通过socket创建,并通过bind后的套接字描述符。
int backlog, 握手请求队列的最大值。
函数名: int accept(int sockfd, struct sockaddr * addr, socklen_t addrlen);
功能:接受一个握手请求,并返回一个新的文件描述符。
返回值:成功,新的文件描述符(用来收发数据的通道);失败, -1;
参数表:
int sockfd, 经过socket创建,bind后并且listen后的文件描述符。
struct sockaddr *addr, 用来带回握手请求方的地址结构体。
socklen_t addrlen, 期望接收的对方的地址大小,该值会被修改为实际大小,调用者需提前初始化。
函数名: int select(int nfds, fd_set *rdfds, fd_set *wrfds, fd_set *exceptfds, struct timeval * timval);
功能:在多路IO复用模型中,负责检测多个文件描述符资源。但没有资源可操作时,进程阻塞;有资源操作时返回可操作的资源个数。
返回值:成功,资源个数;失败, -1;超时, 0;
参数表:
int nfds, 检测的最大描述符值+1.
fd_set *rdfds, 希望监测的读资源描述符集合。
fd_set *wrfds, 希望监测的写资源描述符集合。
fd_set *wrfds, 希望监测的其他资源描述符集合。
struct timeval *timval, 超时监测,设定秒+微秒。
select相关函数:
FD_SET(int fd, fd_set * fds): 将描述加入集合中。
FD_CLR(int fd, fd_set *fds): 将指定描述从集合中移除。
FD_ZERO(fd_set *fds): 清空一个描述符集合。
FD_ISSET(Iint fd, fd_set *fds): 测试一个描述符是否在集合中(测试该描述符资源是否可操作);
其他函数接口:
int send(int sockfd, const void *buff, size_t size, int flag);
int recv(int sockfd, void *buff, size_t size, int flag);
getpeername(int connfd, struct sockaddr *addr, socklen_t *addrlen);
getsockname(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
setsockopt(int level, int optname, const void *optval, socklen_t optlen);
short htons(short );
int htonl(int);
short ntohs(short);
int ntohl(int);