目录
SOCK函数
socket()
#include<sys/types.h>
#include<sys/socket.h>
int socket(int domain, int type, int protocol);
domain:
-
AF_INET:表示IPV4网络协议
-
AF_INET6:表示IPV6网络协议
type:
-
SOCK_STREAM:基于流式套接字,TCP
-
SOCK_DGRAM:数据报,UDP
bind()
int bind(int sockfd, const struct sockaddr, socklen_t addrlen);
服务器函数
绑定套接字与地址、端口号
sockfd:套接字描述符
sockaddr :结构体地址
addrlen:结构体大小
成功返回0,失败返回SOCK_ERROR
listen()
int listen(int sockfd, int backlog);
服务器函数
当socket函数创建一个套接字时,它被假设为一个主动套接字,listen函数把一个未连接的套接字转换成一个被动套接字,接受来自其他主动套接字的连接请求。
sockfd:套接字描述符
backlog:等待连接队列的最大长度,超过这个数的连接请求将被拒绝
成功返回0,失败返回-1
accept()
int accept(
SOCKET s,
struct sockaddr * addr,
int FAR * addrlen
服务器函数
处于监听状态的服务器在获得客户机的连接请求后,会将其放置在等待队列中。当系统空闲时,将接受客户机的连接请求。接收客户机的连接请求使用accept函数
s :套接字描述符
addr:结构体地址
addelen:结构体大小
连接成功返回套接字描述符,连接失败返回-1
connetct()
int connect(int sockfd,conststruct sockaddr *addr, socklen_t addrlen)
客户端函数,向服务器请求连接
sockfd:本地描述符,由socket()函数返回
addr:sockaadr结构体地址,存放IP,端口号等信息
addrlen:结构体长度
连接成功返回0,连接失败返回 SOCKET_ERROR
使用时需要类型转换
connect(sock,(const sockaddr*)&addr,sizeof(addr));
closesock()
int closesock(SOCKET sockfd)
关闭套接字
关闭成功返回0,关闭失败返回SOCKET_ERROR(宏定义为-1)
send()
int send( SOCKET s, const char FAR *buf, int len, int flags );
发送数据
s:套接字描述符
buf:发送缓冲区
len:发送的字节数
flags:一般为0
发送成功返回发送字节数(true),发送失败返回SOCKET_ERROR(宏定义为-1)
发送数据时防止粘包问题发生一般先发送包大小,再发送包
recv()
int recv( SOCKET s, char FAR *buf, int len, int flags );
接收数据
s:套接字描述符
buf:接收缓冲区
len:接收长度
flags:一般为0
接收成功返回接收字节数(true),接受失败返回-1并设置errno为EAGAIN.
接收数据时,防止粘包发生,一般先接收包大小,再接收包
sockaddr_in 结构体
struct sockaddr_in {
short sin_family; //地址族
u_short sin_port; //端口号
struct in_addr sin_addr; //ip地址
char sin_zero[8];
};
其中IP和端口号默认为网络字节序(大端存储),可视化数字一般为本地字节序
对于字节转换:
-
htons():把主机字节序转为网络字节序的整数值
-
inet_addr():把IP地址字符串转为网络字节序的整数值
-
inet_ntoa():把IP转为字符串,一般用在 inet_ntoa(sockaddr.sin_addr)
gethostname()
返回本地主机的标准主机名
#include <unistd.h>
int gethostname(char *name, size_t len);
参数说明:
这个函数需要两个参数:
接收缓冲区name,其长度必须为len字节或是更长,存获得的主机名。
接收缓冲区name的最大长度:
gethostbyname()
用域名或主机名获取IP地址
#include <netdb.h>
#include <sys/socket.h>
struct hostent *gethostbyname(const char *name);
//返回hostent结构体类型指针:
struct hostent {
char *h_name; //主机名
char **h_aliases;
int h_addrtype; //IP地址类型,IPV4,IPV6
int h_length; //IP地址长度
char **h_addr_list; //ip地址列表
}
setsockopt()
int setsockopt(
SOCKET sockfd,
int level,
int optname,
const char* optval,
int optlen
);
sockfd:返回的sockfd
level:
-
IPPROTO_IP: IPv4套接口
-
IPPROTO_IPV6: IPv6套接口
-
IPPROTO_TCP: TCP套接口
optval:TCP_NODELAY 禁用nagle算法
optLen:长度
MySQL函数
mysql_init()
MYSQL mysql_init(MYSQL* conn)
初始化一个mysql对象用于连接mysql
mysql_real_connect()
MYSQL mysql_real_connect(
MYSQL mysql,
const char host,
const char user,
const char passwd,
const char db,
unsigned int port,
const char unixsocket,
unsigned intclientflag)
mysql:mysql_init()返回的对象
host:主机名,NULL为本机
user:MySQL的用户ID
passwd:登录密码
db:数据库名字
port:端口号
unixsocket:NULL
intclientflag:0
连接成功返回 MYSQL*连接句柄,连接失败返回NULL
mysql_store_result
MYSQL_RES * mysql_store_result(MYSQL* conn)
每次调用mysql_query()后调用该函数将结果保存起来
conn为mysql_real_init的返回值
mysql_fetch_row
MYSQL_ROW STDCALL mysql_fetch_row(MYSQL_RES *result);
获取mysql_store_result函数保存起来的结果
result为mysql_store_result函数的返回值
epoll
epoll_ceeate
int epoll_create(int size)
创建epoll文件描述符
size:最大的sockfd数
epoll_ctl
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event)
该函数用于控制某个epoll文件描述符上的事件,可以注册事件,修改事件,删除事件。
epfd:由epoll_create创建的文件描述符
op:宏
EPOLL_CTL_ADD: 注册新的fd到epfd中; EPOLL_CTL_MOD: 修改已经注册的fd的监听事件; EPOLL_CTL_DEL: 从epfd中删除一个fd;
fd:关联的文件描述符
event:指向结构体的指针,包含:
events可以是以下几个宏的集合: EPOLLIN: 触发该事件,表示对应的文件描述符上有可读数据。(包括对端SOCKET正常关闭); EPOLLOUT: 触发该事件,表示对应的文件描述符上可以写数据; EPOLLPRI: 表示对应的文件描述符有紧急的数据可读(这里应该表示有带外数据到来); EPOLLERR: 表示对应的文件描述符发生错误; EPOLLHUP: 表示对应的文件描述符被挂断; EPOLLET: 将EPOLL设为边缘触发(Edge Triggered)模式,这是相对于水平触发(Level Triggered)来说的。 EPOLLONESHOT: 只监听一次事件,当监听完这次事件之后,如果还需要继续监听这个socket的话,需要再次把这个socket加入到EPOLL队列里。
epoll_wait
int epoll_wait(int epfd,struct epoll_event * events,int maxevents,int timeout)
epfd:由epoll_create创建的文件描述符
events:用于回传待处理事件的数组
maxevents:每次能处理的事件数
timeout:超时值
等侍注册在epfd上的socket fd的事件的发生,如果发生则将发生的sokct fd和事件类型放入到events数组中。 并 且将注册在epfd上的socket fd的事件类型给清空