简单select

  1 #include <iostream>
  2 using namespace std;
  3
  4 #include <WinSock2.h>
  5 #pragma comment(lib, "ws2_32.lib")
  6
  7 #include "incl/pthread.h"
  8 #pragma comment(lib, "pthreadVCE2.lib")
  9
 10 class SockIp
 11 {
 12 public:
 13 SockIp(SOCKET sock, SOCKADDR_IN addr)
 14 {
 15 mSock = sock;
 16 mAddr = addr;
 17 }
 18
 19 SOCKET getSock()
 20 {
 21 return mSock;
 22 }
 23
 24 SOCKADDR_IN getAddr()
 25 {
 26 return mAddr;
 27 }
 28
 29 private:
 30 SOCKET mSock;
 31 SOCKADDR_IN mAddr;
 32 };
 33
 34 void* RecvThread(void* p)
 35 {
 36 //SOCKET skClient = *(SOCKET*)p;
 37 SockIp *si = (SockIp*)p;
 38 SOCKET skClient = si->getSock();
 39 SOCKADDR_IN addr = si->getAddr();
 40 cout<<"conn IP:"<<inet_ntoa(addr.sin_addr)
 41 <<",PORT:"<<ntohs(addr.sin_port)<<endl;
 42
 43
 44
 45 char buf[1024];
 46 while (true)
 47 {
 48 int ret = recv(skClient, buf, 1024, 0);
 49 if (ret == -1)
 50 {
 51 break;
 52 }
 53 buf[ret] = ‘\0‘;
 54 cout<<ret<<","<<buf<<endl;
 55 }
 56 closesocket(skClient);
 57 cout<<"disconn IP:"<<inet_ntoa(addr.sin_addr)
 58 <<",PORT:"<<ntohs(addr.sin_port)<<endl;
 59
 60 return NULL;
 61 };
 62
 63
 64 int main()
 65 {
 66 //1.init
 67 WSADATA wsa;
 68 if (WSAStartup(MAKEWORD(2,2), &wsa))
 69 {
 70 cout<<"1"<<endl;
 71 }
 72
 73 //2.socket
 74 SOCKET skListen = socket(AF_INET, SOCK_STREAM, 0);
 75
 76 //3.bind
 77 SOCKADDR_IN addr;
 78 addr.sin_family = AF_INET;
 79 addr.sin_port = htons(8888);
 80 addr.sin_addr.s_addr = htonl(INADDR_ANY);
 81 bind(skListen, (SOCKADDR*)&addr, sizeof(addr));
 82
 83 //4.listen
 84 listen(skListen, 5);
 85
 86
 87 //a.select+thread
 88 /*
 89 fd_set fdset;
 90 while(true)
 91 {
 92 FD_ZERO(&fdset);
 93 FD_SET(skListen, &fdset);
 94
 95 int num = select(0, &fdset, 0, 0, 0);
 96 if (num > 0)
 97 {
 98 //read 1.accept 2.recv
 99 if(FD_ISSET(skListen, &fdset))
100 {
101 //accept
102 SOCKADDR_IN accptAddr;
103 int len = sizeof(accptAddr);
104 SOCKET skClient = accept(skListen, (SOCKADDR*)&accptAddr, &len);
105
106 SockIp *si = new SockIp(skClient, accptAddr);
107 pthread_t trd;
108 pthread_create(&trd, 0, RecvThread, si);
109 }
110 }
111 }
112 */
113
114 //b.select
115
116 fd_set fdset;
117 FD_ZERO(&fdset);
118 FD_SET(skListen, &fdset);
119 while(true)
120 {
121
122 fd_set fdRead = fdset;
123 int num = select(0, &fdRead, 0, 0, 0);
124 if (num > 0)
125 {
126 for (unsigned int i=0; i<fdset.fd_count; i++)
127 {
128 if (FD_ISSET(fdset.fd_array[i], &fdRead))
129 {
130 SOCKADDR_IN acceptAddr;
131 int len = sizeof(acceptAddr);
132 //accept
133 if(fdset.fd_array[i] == skListen)
134 {
135 if (fdset.fd_count < FD_SETSIZE)
136 {
137 SOCKET skClient = accept(skListen, (SOCKADDR*)&acceptAddr, &len);
138 cout<<"conn IP:"<<inet_ntoa(acceptAddr.sin_addr)
139 <<",PORT:"<<ntohs(acceptAddr.sin_port)<<endl;
140
141 FD_SET(skClient, &fdset);
142 }
143 }
144 else//recv
145 {
146 char buf[1024];
147 SOCKET skCur = fdset.fd_array[i];
148 int ir = recv(skCur, buf, 1024, 0);
149 if (ir == -1)
150 {
151 getpeername(skCur, (SOCKADDR*)&acceptAddr, &len);
152 cout<<"diss conn IP:"<<inet_ntoa(acceptAddr.sin_addr)
153 <<",PORT:"<<ntohs(acceptAddr.sin_port)<<endl;
154
155 closesocket(skCur);
156 FD_CLR(skCur, &fdset);
157 }
158 else if (ir == 0)
159 {
160 cout<<"0:disconnect"<<endl;
161
162 closesocket(skCur);
163 FD_CLR(skCur, &fdset);
164 }
165 else
166 {
167 buf[ir]=‘\0‘;
168 cout<<buf<<endl;
169 }
170
171 }
172 }
173 }
174 }
175 }
176
177 system("pause");
178 return 0;
179 }
时间: 2024-10-14 16:11:10

简单select的相关文章

分布式数据库中间件–(3) Cobar对简单select命令的处理过程

友情提示:非原文链接可能会影响您的阅读体验,欢迎查看原文.(http://blog.geekcome.com) 原文地址:http://blog.geekcome.com/archives/284 在上一篇中介绍了Cobar和client初次建立连接的过程,Cobar监听端口,client发起连接请求,Cobar发送握手数据包,client发送认证数据包最后依据认证的结果Cobar向client发送认证结果. 在认证成功后Cobar会将该连接的回调处理函数由FrontendAuthenticat

php学习之道:mysql SELECT FOUND_ROWS()与COUNT(*)用法区别

在mysql中 FOUND_ROWS()与COUNT(*)都可以统计记录,如果都一样为什么会有两个这样的函数呢,下面我来介绍SELECT FOUND_ROWS()与COUNT(*)用法区别 SELECT语句中经常可能用LIMIT限制返回行数.有时候可能想要知道如果没有LIMIT会返回多少行,但又不想再执行一次相同语句.那么,在SELECT查询中包含SQL_CALC_FOUND_ROWS选项,然后执行FOUND_ROWS()就可以了:  代码如下 复制代码 mysql> SELECT SQL_CA

MySql学习(六) —— 数据库优化理论(二) —— 查询优化技术

逻辑查询优化包括的技术 1)子查询优化  2)视图重写  3)等价谓词重写  4)条件简化  5)外连接消除  6)嵌套连接消除  7)连接消除  8)语义优化 9)非SPJ优化 一.子查询优化 1. 什么是子查询:当一个查询是另一个查询的子部分时,称之为子查询. 2. 查询的子部分,包含的情况: a) 目标列位置:子查询如果位于目标列,则只能是标量子查询,否则数据库可能返回类似“错误:子查询只能返回一个字段 ( [Err] 1242 - Subquery returns more than 1

MyBatis中的OGNL教程

MyBatis中的OGNL教程 有些人可能不知道MyBatis中使用了OGNL,有些人知道用到了OGNL却不知道在MyBatis中如何使用,本文就是讲如何在MyBatis中使用OGNL. 如果我们搜索OGNL相关的内容,通常的结果都是和Struts有关的,你肯定搜不到和MyBatis有关的,虽然和Struts中的用法类似但是换种方式理解起来就有难度. MyBatis常用OGNL表达式 e1 or e2 e1 and e2 e1 == e2,e1 eq e2 e1 != e2,e1 neq e2

MyBatis 杂项(分页,缓存,处理BLOB\CLOB数据)

1.处理CLOB,BLOB数据 oracle中的 clob:clob blob:blobmysql中的 clob:longtext blob:longblob 2.传入多个输入参数,mybatis自带的param属性(但是不经常用,我们用map就足够了) 3.MyBatis分页 逻辑分页:将数据全部取出先放到内存中,之后在内存中进行分页,性能不好.不推荐使用 物理分页:通过语句进行分页. 4.MyBatis缓存 MyBatis默认情况下:MyBatis默认使用一级缓存,即同一个SqlSessio

Mysql Explain 详解

一.语法 explain < table_name > 例如: explain select * from t3 where id=3952602; 二.explain输出解释 +----+-------------+-------+-------+-------------------+---------+---------+-------+------+-------+| id | select_type | table | type  | possible_keys     | key 

HiveQL编译基础

由客户端提交的HiveQL语句将最终被转换为一个或多个MapReduce任务并提交由Hadoop执行.不包含聚合和连接的简单SELECT语句可以使用一个单独的只包含Map阶段的任务实现.使用GROUP BY子句的聚合可以使用一个独立的MapReduce任务实现.包含大量多表连接的复杂查询需要依靠多个MapReduce任务的顺序执行来实现.  HiveQL编译器的操作分为好几个阶段.  在第一个阶段中,查询语句被解析并转化成抽象的语法树.随后语法树将被传给语义分析器,在这一过程中,通过使用元数据存

Java39: 数据库三(Oracle)

Oracle 高级查询 1 集合运算 union 并集 把两张表合成一张表 intersect 交集 一样的留下,不一样的不要 minus 减去 前面的结果减去后面的结果 create table emp3 as  select * from emp2 where deptno=20; create table emp4 as  select * from emp2 where deptno=30; alter table emp3 rename to emp20; alter table em

SQL函数说明大全

一旦成功地从表中检索出数据,就需要进一步操纵这些数据,以获得有用或有意义的结果.这些要求包括:执行计算与数学运算.转换数据.解析数值.组合值和聚合一个范围内的值等. 下表给出了T-SQL函数的类别和描述. 函数类别 作用 聚合函数 执行的操作是将多个值合并为一个值.例如 COUNT.SUM.MIN 和 MAX. 配置函数 是一种标量函数,可返回有关配置设置的信息. 转换函数 将值从一种数据类型转换为另一种. 加密函数 支持加密.解密.数字签名和数字签名验证. 游标函数 返回有关游标状态的信息.