1.socket函数
int socket(int domain, int type, int protocol);
作用:创建套接字描述符
domain:协议族
AF_UNIX: AF_UNIX域协议族,本机的进程通信时使用
AF_INET: Internet协议族
AF_ISO: ISO协议族
type:指定套接字类型
SOCK_STREAM: 流套接字,面向连接的和可靠的通信类型
SOCK_DGRAM: 数据包套接字,面向非连接的和不可靠的通信类型
SOCK_RAW: 原始套接字,只对Internet协议有效,可以用来直接访问IP协议
protocol: 指定使用哪种协议
通常设置为0,表示使用默认协议,
Internet 协议族的SOCK_STREAM套接字使用TCP协议;
Internet 协议族的SOCK_DGRAM套接字使用UDP协议;
2. bind函数
int bind(int sockfd, struct sockaddr *server_address, int addrlen);
作用:将本地地址和套接字绑定
3. listen函数
int listen(int sockfd, int backlog);
作用:将一个套接字转换为监听套接字
因为socket函数创建的套接字只具有主动connect的功能,不具备接受连接请求的能力,listen将一个尚未连接的主动套接字转换成为被动套接字。
在此处完成三次握手。
4. accept函数
int accept(int sockfd, struct sockaddr *addr, int *addrlen);
作用:从倾听套接字的完成连接队列中接收一个连接,如果完成连接队列为空,那么这个进程休眠。
返回值:新的套接字,标识这个接收的连接;addr存储客户机地址;addrlen指向客户机地址长度。
如果对客户机的地址和地址长度不感兴趣,可以将参数addr和addrlen设置为NULL。
5. close函数
int close(int sockfd);
关闭一个套接字描述符,与文件操作类似。
返回值:成功返回0,失败返回-1
6. 设置套接字类型
fcntl(listenFd, F_SETFL, O_NONBLOCK);-------------------设置非阻塞
void setnonblocking(int sock)------------------设置非阻塞
{
int opts;
opts=fcntl(sock,F_GETFL);
if(opts<0)
{
perror("fcntl(sock,GETFL)");
exit(1);
}
opts = opts|O_NONBLOCK;
if(fcntl(sock,F_SETFL,opts)<0)
{
perror("fcntl(sock,SETFL,opts)");
exit(1);
}
}
int read(int sockfd, char *buf, int len);
int write(int sockfd, char *buf, int len);
8. send和recv函数
int send(int sockfd, void *buf, size_t len, int flags);
int write(int sockfd, void *buf,size_t len, int flags);
9. sendto和recvfrom函数
int sendto(int sockfd, void *buf, size_t len, int flags, struct sockaddr *to, size_t addrlen);
int recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *from, size_t *addrlen);
10. getsockname和getpeername
int getsockname(iint socket, struct sockaddr *address, socklen_t *address_len);
int getpeername(iint socket, struct sockaddr *address, socklen_t *address_len);