linux nc命令使用详解
功能说明:功能强大的网络工具
语 法:nc [-hlnruz][-g<网关...>][-G<指向器数目>][-i<延迟秒数>][-o<输出文件>][-p<通信端口>][-s<来源位址>][-v...][-w<超时秒数>][主机名称][通信端口...]
参 数:
-g<网关> 设置路由器跃程通信网关,最丢哦可设置8个。
-G<指向器数目> 设置来源路由指向器,其数值为4的倍数。
-h 在线帮助。
-i<延迟秒数> 设置时间间隔,以便传送信息及扫描通信端口。
-l 使用监听模式,管控传入的资料。
-n 直接使用IP地址,而不通过域名服务器。
-o<输出文件> 指定文件名称,把往来传输的数据以16进制字码倾倒成该文件保存。
-p<通信端口> 设置本地主机使用的通信端口。
-r 乱数指定本地与远端主机的通信端口。
-s<来源位址> 设置本地主机送出数据包的IP地址。
-u 使用UDP传输协议。
-v 详细输出--用两个-v可得到更详细的内容
-w<超时秒数> 设置等待连线的时间。
-z 使用0输入/输出模式,只在扫描通信端口时使用。
nc使用示例
1. 端口扫描
# nc -v -w 2 192.168.2.34 -z 21-24
nc: connect to 192.168.2.34 port 21 (tcp) failed: Connection refused
Connection to 192.168.2.34 22 port [tcp/ssh] succeeded!
nc: connect to 192.168.2.34 port 23 (tcp) failed: Connection refused
nc: connect to 192.168.2.34 port 24 (tcp) failed: Connection refused
2. 从192.168.2.33拷贝文件到192.168.2.34
在192.168.2.34上: nc -l 1234 > test.txt
在192.168.2.33上: nc 192.168.2.34 < test.txt
3. 简单聊天工具
在192.168.2.34上: nc -l 1234
在192.168.2.33上: nc 192.168.2.34 1234
这样,双方就可以相互交流了。使用ctrl+C(或D)退出。
4. 用nc命令操作memcached
1)存储数据:printf“set key 0 10 6rnresultrn” |nc 192.168.2.34 11211
2)获取数据:printf“get keyrn” |nc 192.168.2.34 11211
3)删除数据:printf“delete keyrn” |nc 192.168.2.34 11211
4)查看状态:printf“statsrn” |nc 192.168.2.34 11211
5)模拟top命令查看状态:watch“echo stats” |nc 192.168.2.34 11211
6)清空缓存:printf“flush_allrn” |nc 192.168.2.34 11211 (小心操作,清空了缓存就没了)
5. nc -p 1234 -w 5 host.example.com 80
建立从本地1234端口到host.example.com的80端口连接,5秒超时
nc -u host.example.com 53
u为UDP连接
6. echo -n "GET / HTTP/1.0"r"n"r"n" | nc host.example.com 80
连接到主机并执行
7. nc -v -z host.example.com 70-80
扫描端口(70到80),可指定范围。-v输出详细信息。
8. 远程拷贝文件
从server1拷贝文件到server2上。需要先在server2上,用nc激活监听,
server2上运行:
root@hatest2 tmp]# nc -lp 1234 > install.log
目前我们有两个库,不在同一个服务器上,如:A服务器上库有个account表,B服务器上有个两个库:其实就是把一个大数据表拆分成两个库(这块我不明白为什么负责这个开发的人把一个表放在两个库里,而且每个库有多个表结构相同的表),比如 follow1有个表A B和C,follow2有个C D和E表,其实都是存放相同的数据,这六个表的数据差不多有1000W,现在建索引我这边需要一个多小时,data-config.xml配置如下
<dataConfig> <dataSource type="JdbcDataSource" name="ds-1" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://IP1:3306/data1" user="***" password="*******" batchSize="-1"/> <dataSource type="JdbcDataSource" name="ds-2" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://IP2:3306/data2" user="***" password="********" batchSize="-1"/> <dataSource type="JdbcDataSource" name="ds-3" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://IP2:3306/data3" user="****" password="******" batchSize="-1"/> <document name="follow_log"> <field column="logId" name="logId"/> <field column="accountId" name="accountId"/> <field column="targetAccount" name="targetAccount"/> <field column="followFlag" name="followFlag"/> <field column="friendFlag" name="friendFlag"/> <field column="followTime" name="followTime"/> <field column="friendTime" name="friendTime"/> <field column="friendly" name="friendly"/> <field column="blockFlag" name="blockFlag"/> <field column="blockReason" name="blockReason"/> <field column="blockTime" name="blockTime"/> <field column="joinFlag" name="joinFlag"/> <entity dataSource="ds-3" name="account" query="select name,photoPath,l99NO,accountType,online from account where accountId = '${following1.targetAccount}'"> <field column="name" name="name"/> <field column="photoPath" name="photoPath"/> <field column="l99NO" name="l99NO"/> <field column="accountType" name="accountType"/> <field column="online" name="online"/> </entity> </entity> <entity dataSource="ds-2" name="following2" pk="logId" query="select cast(CONCAT(accountId,targetAccount) as SIGNED INTEGER) logId, accountId,targetAccount,followFlag,friendF lag,followTime,friendTime,friendly,blockFlag,blockReason,blockTime,joinFlag from ((select * from relationship_following_2 ) union all (select * from relationship_following_4 ) u nion all (select * from relationship_following_6 )) as f" deltaImportQuery="select cast(CONCAT(accountId,targetAccount) as SIGNED INTEGER) logId, accountId,targetAccount,followF lag,friendFlag,followTime,friendTime,friendly,blockFlag,blockReason,blockTime,joinFlag from ((select * from relationship_following_2 where cast(CONCAT(accountId,targetAccount) a s SIGNED INTEGER) = '${dih.delta.logId}') union all (select * from relationship_following_4 where cast(CONCAT(accountId,targetAccount) as SIGNED INTEGER) = '${dih.delta.logId}') union all (select * from relationship_following_6 where cast(CONCAT(accountId,targetAccount) as SIGNED INTEGER) = '${dih.delta.logId}')) as f" deltaQuery="select f.logId from ( (select cast(CONCAT(accountId,targetAccount) as SIGNED INTEGER) logId from relationship_following_2 where followTime >= '${dih.last_index_time}' or friendTime >= '${dih.last_ind ex_time}') union all (select cast(CONCAT(accountId,targetAccount) as SIGNED INTEGER) logId from relationship_following_4 where followTime >= '${dih.last_index_time}' or friendTi me >= '${dih.last_index_time}') union all (select cast(CONCAT(accountId,targetAccount) as SIGNED INTEGER) logId from relationship_following_6 where followTime >= '${dih.last_ind ex_time}' or friendTime >= '${dih.last_index_time}')) as f"> <field column="logId" name="logId"/> <field column="accountId" name="accountId"/> <field column="targetAccount" name="targetAccount"/> <field column="followFlag" name="followFlag"/> <field column="friendFlag" name="friendFlag"/> <field column="followTime" name="followTime"/> <field column="friendTime" name="friendTime"/> <field column="friendly" name="friendly"/> <field column="blockFlag" name="blockFlag"/> <field column="blockReason" name="blockReason"/> <field column="blockTime" name="blockTime"/> <field column="joinFlag" name="joinFlag"/> <entity dataSource="ds-3" name="account" query="select name,photoPath,l99NO,accountType,online from account where accountId = '${following2.targetAccount}'"> <field column="name" name="name"/> <field column="photoPath" name="photoPath"/> <field column="l99NO" name="l99NO"/> <field column="accountType" name="accountType"/> <field column="online" name="online"/> </entity> </entity> </document> </dataConfig>
学习这个没多久,不知道有没有更好的办法来实现
链表反转是面试笔试常考题目,直接贴代码。
反转函数如下:
//思路为将节点从前到后依次放到表头,最后最后的节点到了最前面,最前面的节点到了最后面 ListNode * ReverseList(ListNode * head) { //如果链表为空或者链表中只有一个元素 if(head==NULL || head->m_pNext==NULL) return head; ListNode * p=head->m_pNext; ListNode * q=head; while(p!=NULL) { q->m_pNext=p->m_pNext;//记录下p的下一个节点 p->m_pNext=head; head=p; p=q->m_pNext;//准备将p的下一个节点放到表头 } return head; } //递归方式 ListNode * ReverseList2(ListNode * head) { //如果链表为空或者链表中只有一个元素 if(head==NULL || head->m_pNext==NULL) return head; else { ListNode * newhead=ReverseList2(head->m_pNext);//先反转后面的链表 head->m_pNext->m_pNext=head;//再将当前节点设置为其然来后面节点的后续节点 head->m_pNext=NULL; return newhead; } }
整体测试代码如下:
// 反转链表.cpp : 定义控制台应用程序的入口点。 #include "stdafx.h" #include <iostream> using namespace std; //定义一个链表节点 typedef struct ListNode { int m_nKey; struct ListNode * m_pNext; }ListNode; //插入一个新节点到链表中(放在链表头部) void CreateList(ListNode * & head,int data) { //创建新节点 ListNode * p=(ListNode*)malloc(sizeof(ListNode)); p->m_nKey=data; p->m_pNext=NULL; if(head==NULL) { head=p; return; } p->m_pNext=head; head=p; } void printList(ListNode* head) { ListNode * p=head; while(p!=NULL) { cout<<p->m_nKey<<" "; p=p->m_pNext; } cout<<endl; } //思路为将节点从前到后依次放到表头,最后最后的节点到了最前面,最前面的节点到了最后面 ListNode * ReverseList(ListNode * head) { //如果链表为空或者链表中只有一个元素 if(head==NULL || head->m_pNext==NULL) return head; ListNode * p=head->m_pNext; ListNode * q=head; while(p!=NULL) { q->m_pNext=p->m_pNext;//记录下p的下一个节点 p->m_pNext=head; head=p; p=q->m_pNext;//准备将p的下一个节点放到表头 } return head; } //递归方式 ListNode * ReverseList2(ListNode * head) { //如果链表为空或者链表中只有一个元素 if(head==NULL || head->m_pNext==NULL) return head; else { ListNode * newhead=ReverseList2(head->m_pNext);//先反转后面的链表 head->m_pNext->m_pNext=head;//再将当前节点设置为其然来后面节点的后续节点 head->m_pNext=NULL; return newhead; } } int _tmain(int argc, _TCHAR* argv[]) { ListNode * Head=NULL; for(int i=0;i<10;i++) CreateList(Head,i); printList(Head); Head=ReverseList(Head); printList(Head); system("PAUSE"); return 0; }
运行结果如下: