SOCK函数

image

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

connect()

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的事件类型给清空

Q.E.D.