Linux服务器上的黑名单

Linux服务器上的黑名单
一 环境配置
我的电脑是win7的,装的是虚拟机,Ubuntu系统(老师给的),系统可能不健全...
先看看能上网不ping www.baidu.com/
更新系统 (我用的都是终端命令)apt-get update
查看Vim( vim -v )安装(sudo apt-get insitall vim )
Ubuntu下没有root用户,拥有管理员权限sudo su
export PATH=$PATH:/sbin(这句我也不太懂,见老师安装gcc安装出错时把这句话添上就对了)估计有的电脑用,有的就不用添加这句话了
g++ gcc 安装(sudo apt-get insitall 安装名字)
数据库用的是mySQL安装(sudo apt-get insitall 安装名字)sudo apt-get install mysql-server-5.5
Mysql 数据库连接之 C 语言 API 首先要安装一个包 libmysql++-dev 包 sudo apt-get install libmysql++-dev(需要这句话才能编译成功)

安装时MySQL为root用户(不是Linux的root用户和Linux Ubuntu没关系,不要搞混淆了)密码自己设定
安装成功后查看是否安装成功sudo /etc/init.d/mysql status
进入mysql -u root -p 然后输入密码...
显示数据库show datebases;
用数据库(我用的是安装生成的MySQL,命令;use mysql,也可以自己创建数据库)

写代码(我是在Vim中写的)
运行
gcc -I/usr/include/mysql demo.c -L/usr/lib/mysql -lmysqlclient -o demo
./demo
成功...

二.C API 连接数据库
头文件#include "mysql.h"//定义数据库连接的句柄,它被用于几乎所有的MySQL函数
定义MySQL对象 MYSQL my_connection;//定义数据库连接的句柄,它被用于几乎所有的MySQL函数
MYSQL_RES *res; //查询结果集,结构类型
MYSQL_FIELD *fd ; //包含字段信息的结构
MYSQL_ROW row ; //存放一行查询结果的字符串数组
char qbuf[160]; //存放查询sql语句字符串

初始化: mysql_init(&my_connection);
为mysql_real_connect()分配或初始化一个MYSQL对象。若mysql为NULL,函数为其分配,初始化并返回一个 新对象;否则对象被初始化并返回该对象的地址。
返回值:一个被初始化了的MYSQL* handle,若内存不足返回NULL。
int mysql_options(MYSQL *mysql, enum mysql_option option, const void *arg)
为连接设置一些连接项。必须在mysql_init()之后,mysql_real_connect()之前调用该函数。
连接:mysql_real_connect(&my_connection, "localhost","root", "zb19931213", "mysql", 0, NULL, 0)
MYSQL *mysql_real_connect(MYSQL *mysql, const char *host, const char *user, const char *passwd, const char *db, unsigned int port, const char *unix_socket, unsigned long client_flag)

试图与运行在host上的mysql数据库建立一个连接。在调用该函数之前,必须先调用mysql_init()初始化MYSQL结构体。
返回值:连接成功返回A MYSQL* connection handle,连接失败返回NULL

4. int mysql_query(MYSQL *mysql, const char *stmt_str)
执行由stmt_str指向的SQL语句。不能执行包含二进制的数据(字符“\0”是二进制数据),但mysql_real_query()可以;通常使用单独的SQL语句(不带“;”的),也可调用mysql_real_connect() 或mysql_set_server_option()指定以分号分隔的多个SQL语句
返回值:SQL语句执行成功返回0,出错返回非0

5、int mysql_real_query(MYSQL *mysql, const char *stmt_str, unsigned long length)
length是字符串stmt_str的字节数。除能执行二进制的SQL语句外,其他与mysql_query()相同。


6、MYSQL_RES *mysql_use_result(MYSQL *mysql)
在调用mysql_query()或mysql_real_query()之后,必须调用mysql_store_result()或mysql_use_result()才能产生一个结果集,在完成对结果集的处理之后,必须调用mysql_free_result()释放结果集
初始化一个结果集检索,但并不像mysql_store_result()那样把结果集读到client,而是通过调用mysql_fetch_row()进行逐行检索,直到返回一个NULL,直接从server读取,节省时间和空间
返回值:成功返回一个MYSQL_RES结构体,出错返回NULL
7、MYSQL_RES *mysql_store_result(MYSQL *mysql)
同mysql_use_result()
8、int mysql_next_result(MYSQL *mysql)

该函数用来在由多个SQL语句构成的单独语句字符串时执行。在每次调用该函数之前,一定要使用 mysql_free_result()释放当前的语句的结果集。

9、MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)

检索结果集中的下一行,使用完mysql_store_result()后,无要检索的行返回NULL。使用完mysql_use_result()后,无要检索的行或出错返回NULL。
每行的值的个数可由mysql_num_fields(result)获知,如果row保存mysql_fetch_row()的返回值,则指向值的指针是row[0] to row[mysql_num_fields(result)-1],空值由NULL指向
返回值:成功返回下一行的MYSQL_ROW structure,出错或没有要检索的行返回NULL


10、void mysql_close(MYSQL *mysql)

关闭先前打开的连接,同时也释放由mysql指向的连接handle,若handle是由mysql_init() or mysql_connect()分配的。
三Tcp IP传输
服务器端
把网络地址转换成字符串 inet_ntoa(remote_addr.sin_addr));
可能用到的头文件
#include”sys/types.h”
#include” sys/socket.h”
#include” netinet/in.h”
#include <sys/wait.h>

#define SERVPORT 3333
#define BACKLOG 10
#define MAXDATASIZE 100
定义变量
Int sockfd ,client_fd recvbytes;//sockfd 监听scoket;client_fd 数据传输socket

Struct sockadd_in my_add,remote_add/* 本机地址信息 *//* 客户端地址信息 */
创建socket :socket(AF_INET, SOCK_STREAM, 0)
绑定地址:my_addr.sin_family=AF_INET;
My_addr.sin_port=htons(端口号)
My_addr.sin_addr.s_addr=INADDR_ANY;
bzero(&(my_addr.sin_zero),8); /*保持与struct sockaddr同样大小 vc tc 没有.....gcc有*/
bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr))
1.socket描述符2. 绑定的结构体的地址3.地址的长度
监听:listen(sockfd, BACKLOG)
1.socket描述符2.等待队列的最大长度
接收:accept(sockfd, (struct sockaddr *)&remote_addr, &sin_size)//int sin_size = sizeof(struct sockaddr_in);
2.接入地址信息3.接入地址的长度(可选参数)
我们在这里用(client_fd = accept(sockfd, (struct sockaddr *)&remote_addr, &sin_size))
发送数据:send(client_fd, "连接上了 \n", 26, 0)
1.已连接的socket描述符2.发送的字符串3.发送的长度4.用于影响函数的行为(可选值0 MSG_DONTROUTE MSG_OOB)
接受数据:recvbytes=recv(client_fd, buf, MAXDATASIZE, 0)
Recvbytes接受数据的字节数(buf)3.buf 的长度4.用于影响函数的行为
buf[recvbytes] = '\0';//字符串加\0结束
printf("收到: %s",buf);
关闭连接close(client_fd);
客户端
客户端运行程序是还要输入服务器地址..
So: int main (int argc int *argv[])
struct hostent *host;//存储主机信息
(host=gethostbyname(argv[1]))
struct hostent *gethostbyname(const char *name);
gethostbyname函数根据域名解析出服务器的ip地址,它返回一个结构体struct hostent


hostent简介编辑
hostent的定义如下:
1
2
3
4
5
6
7
8
9 structhostent{
char*h_name;
char*h_aliases;
shorth_addrtype;
shorth_length;
char**h_addr_list;
};
 
#defineh_addrh_addr_list[0]
2详细资料编辑
struct hostent
h_name – 地址的正式名称。
h_aliases – 空字节-地址的预备名称的指针。
h_addrtype –地址类型; 通常是AF_INET。
h_length – 地址的比特长度。
h_addr_list – 零字节-主机网络地址指针。网络字节顺序。
h_addr - h_addr_list中的第一地址。
connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(struct sockaddr))
(recvbytes=recv(sockfd, buf, MAXDATASIZE, 0))
close(sockfd);


四补充

fflush(stdout);立即输出
以前做程序时好像用过该函数是一个while循环输入一行字后.用gets()接受后在次输入时出错需用fflush();清除在百度百科没看到这个用法
Eg:
在while循环里面加句:
fflush(stdin);是干什么用的
还有楼上的这个 rewind(stdin); 是什么,
这两个区别是什么
 
回答:
好像rewind(stdin); 是标准的,fflush(stdin);好像移植性方面存在问题,但是这里应该没问题。
清空键盘缓存区,参数stdin就是标准输入设备。
你遇到的问题是后面的gets读取了前面输入的回车。。。
rewind(stdin); http://bbs.bccn.net/thread-248420-1-1.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值