#include <sys/types.h>
#include <sys/socket.h>
1、创建套接字
int socket(int domain,int type,int protocol);
domain:AF_INET/AF_INET6/AF_UNIX
type:SOCK_STREAM(流式协议,默认是tcp)/SOCK_DGRAM(报式协议,默认是udp)
protocol:传0表示使用默认协议,即tcp,,,,udp..
成功:返回创建的文件描述符,失败返回-1,errno查看具体错误
if(fd < 0)
{
if((errno == EINTR) || (errno == EAGAIN))
{
printf("*********");
return -1;
}
}
socket相当于普通文件的open函数
2、int bind(int sockfd,const struct sockaddr *addr, socklen_t addrlen);
addrlen是addr的大小
成功:返回创建的文件描述符,失败返回-1,errno查看具体错误
3、listen//用来指定同时允许多少个客户端建立连接,即处于tcp三次握手过程的客户端数
int listen(int sockfd,int backlog);
backlog:排队建立3次握手队列和刚刚建立3次握手队列的链接和数
成功返回0,失败返回-1
4、accept//
int accept(int sockfd,struct sockaddr *addr,socklen_t *addrlen);
addr:返回链接客户端地址信息,传出参数,不需要初始化。
addrlen:是个传入传出参数
成功返回一个新的socket文件描述符,用于和客户端通信,失败返回-1,设置errno
即返回的这个文件描述符才是与客户端成对存在的那个socket
5、connect
int connect(int sockfd,const struct sockaddr *addr,socklen_t addrlen);
成功:返回创建的文件描述符,失败返回-1,errno查看具体错误
注意:上图中,accept在没有客户端连接的时候,会发生阻塞,select() 函数则不会阻塞。
另外,客户端也可以调用bind()函数,绑定自己的ip和端口号,但是这个不是必须的。默认不写的话,会给其自动分配。
最后要close是因为,socket也是个文件,open之后要进行关闭。