1: 创建socket ---socket
原型: int socket(int family, int type, int protocol)
返回值: 创建成功返回socket描述符,失败则返回-1
第一个参数(family)表示协议族,常用值有AF_INET,AF_INET6, AF_LOCAL(Unix域协议), AF_ROUTE(路由套接字), AF_KEY(密钥套接字)
第二个参数(type)表示所需创建的socket的类型,主要有SOCK_STREAM(字节流套接字),SOCK_DRAM(数据包套接字),SOCK_SEQPACKET(有序分组套接字),SOCK_RAW(原始套接字)
第三个参数(protocal)表示使用的协议,常用TCP,UDP,SCTP
int Socket(int family, int type, int protocal)
{
int sockfd;
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
return -1;
return sockfd;
}
2: 绑定bind
原型: int bind(int sockfd, const struct sockaddr *socketaddr, socklen_t addrlen)
返回值: 成功返回0, 失败返回-1
这个函数要注意的地方是第二个参数,由于一般在自己函数里面定义的地址结构使用的是sockaddr_in类型,在使用bind时主要进行强制转换,同样在accept函数中也是如此。
struct sockadd_in {
uint8_t sin_len;
sa_family_t sin_family;
in_port_t sin_port;
struct in_addr sin_addr;
char sin_zero[8];
}
struct sockadd {
uint8_t sa_len;
sa_family_t sa_family;
char sa_date[14];
}
3; 接受函数accept
原型:
int accept(int sockfd, struct sockaddr *cliaddr, socklen_t *addrlen)
返回值: 成功则返回非负的描述符,失败返回-1
注意点: 第一个参数是监听的socket的描述符,同时注意返回的地址,这里使用的是值-结果的传递方式。
4: 监听listen
原型:int listen(int sockfd, int backlog)
返回值: 成功返回0,失败返回-1
注意点:第二个参数,表示改监听能同时接受到的客户端连接。
5: 连接connect函数
原型: int connect(int sockfd, const struct sockaddr *servaddr, socklen_t addrlen)
返回值: 成功返回0, 失败返回-1