#网络编程

套接字--socket  特殊IO/文件描述符
流式套接字---SOCK_STREAM  sockaddr_in 
sockaddr_in p160
sockaddr_in结构体解决了sockaddr的缺陷,把port和addr 分开储存在两个变量中
sin_family指代协议族,在socket编程中只能是AF_INET
sin_port存储端口号(使用网络字节顺序)使用htons(atoi(argv[2])) atoi转变int  htons转变字节序  #include<netinet/in.h>
sin_addr存储IP地址,使用in_addr这个数据结构    #include <arpa/inet.h>
struct in_addr 
{
       in_addr_t s_addr;  结构体in_addr 用来表示一个32位的IPv4地址  使用inet_addr(argv[1])进行IP地址格式转换  ntoa反向转换
 };
sin_zero是为了让sockaddr与sockaddr_in两个数据结构保持大小相同而保留的空字节。
s_addr按照网络字节顺序存储IP地址

TCP socket编程流程:
客户端:socket---------------------connect---send-----recv----close
服务器:socket---bind---listen-----accept-----recv-----send---close
socket创建
#include <sys/types.h>          
#include <sys/socket.h>
int socket(int domain, int type, int protocol);  success:描述符  fail:-1
domain:协议族 IPv4 AF_INET  type:套接字类型:SOCK_STREAM

bind:与套接字进行绑定 用于服务器端 客户端不用绑定
int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
sockfd:套接字描述符  addr:绑定的地址  addrlen:地址长度  success:0  fail:-1

listen 监听模式 准备接收连接请求  listen()函数的作用是设置监听上限(同一时刻接收到连接的个数),而不是设置监听。accept()函数才是阻塞监听客户端连接。
int listen(int sockfd, int backlog);
sockfd:套接字描述符  backlog:请求队列中允许的最大请求数  success: 0  fail:-1

connect:客户端发送连接请求
int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
sockfd:套接字描述符  addr:服务器端地址: addrlen:地址长度 success:0  fail:-1

accept:接受客户端连接请求
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
sockfd:套接字描述符  addr:服务器端地址: addrlen:地址长度 success:建立好连接的套接字描述符  fail:-1

send:发送数据
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
sockfd:套接字描述符  buf:发送缓冲区的地址,即结构体地址  len:发送数据的长度  flags:一般为0  success:实际发送的字节数  fail:-1

recv:接收数据
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
sockfd:套接字描述符  buf:发送缓冲区的地址,即结构体地址  len:发送数据的长度  flags:一般为0  success:实际接收的字节数  fail:-1

fd_set 
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
int select(int nfds, fd_set *readfds, fd_set *writefds,fd_set *exceptfds, struct timeval *timeout);
void FD_CLR(int fd, fd_set *set);
int  FD_ISSET(int fd, fd_set *set);
void FD_SET(int fd, fd_set *set);
void FD_ZERO(fd_set *set);

fd_set结合select()判断句柄状态
fd_set是一个长度为64的数组
fd_set set;
FD_ZERO(&set);       /* 将set清零使集合中不含任何fd*/
FD_SET(fd, &set);    /* 将fd加入set集合 */
FD_CLR(fd, &set);    /* 将fd从set集合中清除 */
FD_ISSET(fd, &set);  /* 测试fd是否在set集合中*/
FD_ZERO就是把当前fd_set所有位的数字都置为0。
FD_SET实现了句柄和fd_set的联系,可以把fd(FD_SET(int fd, fd_set *fdset);       // 将fd加入set集合),也就是句柄加入到fd_set中。
FD_CLR清除所绑定的联系,这里只清除你传进去的fd和fd_set之间的联系。
需要注意的是,FD_CLR的操作类似于链表节点的删除(后续节点会填补被删除节点)。

int select(int nfds, fd_set *readfds, fd_set *writefds,fd_set *exceptfds, struct timeval *timeout);
功能:测试指定的fd可读、可写、有异常条件待处理
select()的第一个参数nfds的意思是“最大文件描述符编号加1”
需要检查的文件描述字个数(即检查到fd_set的第几位),数值应该比三组fd_set中所含的最大fd值更大,一般设为三组fd_set中所含的最大fd值加1
(如在readset,writeset,exceptset中所含最大的fd为5,则nfds=6,因为fd是从0开始的)。设这个值是为提高效率,使函数不必检查fd_set的所有1024位。
设置为FD_SETSIZE。这是<sys/select.h>的一个常量,它指定最大描述符数(通常是1024)。
但是一般情况下,该数过于大,一般的程序也就是3~10个描述符。所以一般情况下,选择手动指定。
readset来检查可读性的一组文件描述字。
writeset用来检查可写性的一组文件描述字。
exceptset用来检查是否有异常条件出现的文件描述字。(注:错误不包括在异常条件之内)
timeout=NULL(阻塞:直到有一个fd位被置为1函数才返回)
timeout所指向的结构设为非零时间(等待固定时间:有一个fd位被置为1或者时间耗尽,函数均返回)
timeout所指向的结构,时间设为0(非阻塞:函数检查完每个fd后立即返回)

sqlite3:数据库
int sqlite3_open(const char *filename, sqlite3 **ppdb); 创建数据库
filename: 数据库的名称  ppDb:数据库的句柄 
int sqlite3_close(sqlite3 *db);关闭数据库接口
int sqlite3_exec(sqlite3 *db, const char *sql, int (*sqlite3_callback)(void *,int, char**,char**), void *, char **errmsg);执行sql语句函数接口
db:数据库的句柄  sql:SQL的语句  sqlite_callback:回调函数   void *:回调函数的第一个传参    char **errmsg:错误信息
char *sqlite3_mprintf(const char*, va_list); 将结果存放于内存中
int sqlite3_free(char *); 释放内存数据
int sqlite3_get_table(sqlite3 *, const char *sql, char **resultp, int *nrow, int *ncolumn, char **errmsg); 查询数据 
也可以使用exec查询  sql = “select * from tablename where xx = xx”找到n个数据就callback n次
int sqlite3_get_table(
  sqlite3 *db,          /* 数据库句柄 */
  const char *zSql,     /* SQL语句*/
  char ***pazResult,    /* 结果*/
  int *pnRow,           /* 行数 */
  int *pnColumn,        /* 列数 */
  char **pzErrmsg       /* 错误信息*/
);
void sqlite3_free_table(char **resultp);
 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值