#include <sys/types.h>
#include <sys/socket.h>
int socket(int domain, int type, int protocol);
域(domain),又称协议族(protocal family),指定套接字通信中使用的网络介质类型。如AF_UNIX(UNIX文件系统套接字)、AF_INET(UNIX网络套接字)、AF_INET6(用于IPv6)、AF_ISO(ISO标准协议)等。最常用的套接字域是AF_UNIX(代表UNIX文件系统套接字,可用于本地进程间通信)和AF_INET(代表UNIX网络套接字)。
套接字类型,用于指定套接字的通信特性。AF_UNIX域没有这样的问题。对于AF_INET域,type的取值包括 SOCK_STREAM(流,stream)和 SOCK_DGRAP(数据报,datagram)。在AF_INET域中, SOCK_STREAM 通过 TCP/IP 实现, SOCK_DGRAP通过 UDP/IP 实现。
通信所用的协议一般由套接字类型和套接字域来决定,通常不需要选择。一般设为 0,即使用默认协议。
套接字地址:
AF_UNIX域:
struct sockaddr_un {
sa_family_t sun_family; // AF_UNIX
char sun_path[ ]; // pathname
};
AF_INET域:
struct sockaddr_in {
short int sin_family; // AF_INET
unsigned short int sin_port; // Port number
struct in_addr sin_addr; // Internet address
};
IP地址结构 struct in_addr 被定义为:
struct in_addr {
unsigned long int s_addr;
};
主机字节序和网络字节序:
#include <netinet/in.h>
unsigned long int htonl(unsigned long int hostlong); // host to network, long
unsigned long int ntohl(unsigned long int netlong); // network to host, long
unsigned short int htons(unsigned short int hostshort); // host to network, short
unsigned short int ntohs(unsigned short int netshort); // network to host, short
客户端:
(1)请求连接:
int connet(int socket, const struct sockaddr *address, size_t address_len);
成功时,connect 调用返回 0,失败时返回 -1 。具体错误信息可查看 errno 。struct sockaddr *为 struct sockaddr_in *和 struct sockaddr_un *的强制类型转换。
服务器端:
(1)命名套接字:
int bind(int socket, const struct sockaddr *address, size_t address_len);
成功时,bind 调用返回 0,失败时返回 -1 。具体错误信息可查看 errno 。struct sockaddr *为 struct sockaddr_in *和 struct sockaddr_un *的强制类型转换。
(2)创建套接字队列:
int listen(int socket, int backlog);
backlog 为队列中可以容纳的未处理连接的最大数目,再往后的连接将被拒绝,导致客户的连接请求失败。、
(3)接受连接
int accept(int socket, const struct sockaddr *address, size_t address_len);
如果套接字对列中没有未处理的连接,accept将阻塞,直到有客户建立连接为止。当有未处理的客户连接时,accept函数将返回一个新的套接字文件描述符。发生错误时,accept 将返回 -1。一般需要在循环中处理accept。
TCP/IP读写:
size_t write(int fd, void *buff, size_t nbytes);
size_t read(int fd, void *buff, size_t nbytes);
UDP/IP读写:
int sendto(int sockfd, void *buffer, size_t len, int flags, struct sockaddr *to, socklen_t tolen);
int recvform(int sockfd, void *buffer, size_t len, int flags, struct sockaddr *from, socklen_t fromlen);
关闭socket:
int close(int fd);
实用API:
in_addr_t inet_addr(const char *cp); //点分十进制IP转换成网络字节序IP
char*inet_ntoa(struct in_addr in); //网络字节序IP转换成点分十进制IP
int inet_aton(const char *string, struct in_addr *addr); //点分十进制IP转换成网络字节序IP