linux可以使用lsof命令能查看到端口对应的进程号:
[root@www ~]# lsof -i
COMMAND PID USER FD TYPE DEVICESIZE NODE NAME
Sshd 2444 root 3u IPv4 7376 TCP 172.20.1.104:ssh (LISTEN)
Sshd 16187 root 3u IPv4 327678 TCP 172.20.1.104:ssh->172.20.1.181:56600 (ESTABLISHED)
在windows, 使用netstat -o参数:
-o 显示与每个连接相关的所属进程 ID。
来源:http://hi.baidu.com/fanniwz/blog/item/be108037a50f051b91ef3935.html
[root@www ~]# lsof -i
COMMAND PID USER FD TYPE DEVICESIZE NODE NAME
Sshd 2444 root 3u IPv4 7376 TCP 172.20.1.104:ssh (LISTEN)
Sshd 16187 root 3u IPv4 327678 TCP 172.20.1.104:ssh->172.20.1.181:56600 (ESTABLISHED)
在windows, 使用netstat -o参数:
-o 显示与每个连接相关的所属进程 ID。
来源:http://hi.baidu.com/fanniwz/blog/item/be108037a50f051b91ef3935.html
指针指向结构体数组实例
Unix/LinuxC技术 jackxiang 2010-12-28 22:56
#include <iostream>
using namespace std;
struct ENTINFO {
char ent_add[255];
};
typedef struct ENTINFO _ENTINFO;
int main(int argc, char *argv[])
{
_ENTINFO *ent_info_pointer;
_ENTINFO ent_info[1024];
memset(ent_info,0,sizeof(_ENTINFO)*1024);
strcpy(ent_info[0].ent_add,"guangdong shenzhen nanshan new haofang garden");
strcpy(ent_info[1].ent_add,"guangdong shenzhen nanshan haofang garden");
strcpy(ent_info[2].ent_add,"guangdong shenzhen nanshan haofang garden 6 floor");
ent_info_pointer = ent_info;
printf("ent_info_pointer->ent_add=%s\n",ent_info[0].ent_add);
printf("ent_info_pointer->ent_add=%s\n",ent_info[1].ent_add);
printf("ent_info_pointer->ent_add=%s\n",ent_info[2].ent_add);
printf("ent_info_pointer->ent_add=%s\n",ent_info_pointer->ent_add);
ent_info_pointer++;
printf("ent_info_pointer->ent_add=%s\n",ent_info_pointer->ent_add);
ent_info_pointer++;
printf("ent_info_pointer->ent_add=%s\n",ent_info_pointer->ent_add);
return 0;
}
using namespace std;
struct ENTINFO {
char ent_add[255];
};
typedef struct ENTINFO _ENTINFO;
int main(int argc, char *argv[])
{
_ENTINFO *ent_info_pointer;
_ENTINFO ent_info[1024];
memset(ent_info,0,sizeof(_ENTINFO)*1024);
strcpy(ent_info[0].ent_add,"guangdong shenzhen nanshan new haofang garden");
strcpy(ent_info[1].ent_add,"guangdong shenzhen nanshan haofang garden");
strcpy(ent_info[2].ent_add,"guangdong shenzhen nanshan haofang garden 6 floor");
ent_info_pointer = ent_info;
printf("ent_info_pointer->ent_add=%s\n",ent_info[0].ent_add);
printf("ent_info_pointer->ent_add=%s\n",ent_info[1].ent_add);
printf("ent_info_pointer->ent_add=%s\n",ent_info[2].ent_add);
printf("ent_info_pointer->ent_add=%s\n",ent_info_pointer->ent_add);
ent_info_pointer++;
printf("ent_info_pointer->ent_add=%s\n",ent_info_pointer->ent_add);
ent_info_pointer++;
printf("ent_info_pointer->ent_add=%s\n",ent_info_pointer->ent_add);
return 0;
}
运行结果:
ent_info_pointer->ent_add=guangdong shenzhen nanshan new haofang garden
ent_info_pointer->ent_add=guangdong shenzhen nanshan haofang garden
ent_info_pointer->ent_add=guangdong shenzhen nanshan haofang garden 6 floor
ent_info_pointer->ent_add=guangdong shenzhen nanshan new haofang garden
ent_info_pointer->ent_add=guangdong shenzhen nanshan haofang garden
ent_info_pointer->ent_add=guangdong shenzhen nanshan haofang garden 6 floor
strcture_array_test.cpp
root@17*.2*.38.78:~/c++/struct# ./a.out
No. Name sex age Score
10101Tom M 18 0
10102John M 19 0
10103Mary F 17 0
[实践OK]Linux下用Grep -E参数实现$grep -E ^[a-Z] supervisord.conf显示非注释项,ABC def abc,加上正则表达式实现,多个函数查找的方法,及实现查看所查找单词的前三行后两行的环绕搜索,grep一个多行单独IP间隔包含文字里的IP列表出来,grep查找时显示找到那行的后面N行-A,和前面N行参数-B的实际应用。
Php/Js/Shell/Go jackxiang 2010-12-28 20:14
cat xxxx.txt|grep -Ev "无锡|腾讯云|华为云|微软云|阿里云|百度云|金山云" #grep 正则接合v排除的查询
api-itv-xxxx-cn-master-php-db578496b-zxxnj 6/6 Running 0 65m
kubectl get po -l pro=itv_api|grep -E "Running +0" #加号+:匹配1个或多个前面的字符,它和星号*的作用相似,但它不匹配0个字符的情况。比如,"ab+c"将匹配"abc"、“abbc”、“abbb...c”等。
不用加正则参数也成,直接用egrep:
rpm -qf /bin/egrep
grep-2.20-3.el6_7.1.x86_64
rpm -ql grep-2.20-3.el6_7.1.x86_64|grep grep
/bin/egrep
/bin/fgrep
/bin/grep
cat videoupload.php |grep upload --color //给加点颜色。
背景:实现一次性查找多个函数的awk实现,以及grep一个文件里的所有IP行:
-n :grep 行输出,--line-number print line number with output lines
一)Grep -E参数,加上正则表达式实现,多个函数查找,如下:
配上shell 文件 findfunPath.sh如下:
简单示例:
二)查看所查找单词的前三行后两行的环绕搜索:
[root@iZ25dcp92ckZ multepoolserver]# grep -rin -B 3 -A 2 "pthread_create Failed" ./multepoolser.c
569- threadNum[i]=i;//给数组赋值,传入线程编号值,后传入线程里。
570- //if(pthread_create(&handleEpollRd[i],NULL,pthread_handle_message, (void *)&i)){
571- if(pthread_create(&handleEpollRd[i],NULL,pthread_handle_message, (void *)&threadNum[i])){
572: sprintf(errOut,"pthread_create Failed : %s - %m\n",strerror(errno));
573- loger(errOut);
574- return -1;
--
591- writeThreadNum[i]=i;//给数组赋值,传入线程编号值,后传入线程里。
592- //if(pthread_create(&saveUpFilePart2Diskk[i],NULL,sync_additional_writing_worker, NULL )){
593- if(pthread_create(&saveUpFilePart2Diskk[i],NULL,sync_additional_writing_worker, (void *)&writeThreadNum[i])){
594: sprintf(errOut,"pthread_create Failed : %s - %m\n",strerror(errno));
595- loger(errOut);
596- return -1;
三)grep一个多行单独IP间隔包含文字里的IP列表出来:
四)grep查找时显示找到那行的后面N行-A,和前面N行参数-B的实际应用之查找域名里的root有哪些路径:
grep -Er "common.jackxiang.com|vote.jackxiang.com|answer.jackxiang.com|scratch.jackxiang.com|api.itv.jackxiang.com|common.itv.jackxiang.com|api.itv.cctv.com|common.itv.cctv.com" ./ -A 7|grep root
./answer.jackxiang.com.conf- root /data/www/api.jackxiang.com/;
./api.itv.jackxiang.com.conf: root /data/www/api.itv.jackxiang.com/;
./vote.jackxiang.com.conf- root /data/www/api.jackxiang.com/;
./scratch.jackxiang.com.conf- root /data/www/api.jackxiang.com/;
./common.jackxiang.com.conf- root /data/www/api.jackxiang.com/;
api-itv-xxxx-cn-master-php-db578496b-zxxnj 6/6 Running 0 65m
kubectl get po -l pro=itv_api|grep -E "Running +0" #加号+:匹配1个或多个前面的字符,它和星号*的作用相似,但它不匹配0个字符的情况。比如,"ab+c"将匹配"abc"、“abbc”、“abbb...c”等。
不用加正则参数也成,直接用egrep:
rpm -qf /bin/egrep
grep-2.20-3.el6_7.1.x86_64
rpm -ql grep-2.20-3.el6_7.1.x86_64|grep grep
/bin/egrep
/bin/fgrep
/bin/grep
cat videoupload.php |grep upload --color //给加点颜色。
背景:实现一次性查找多个函数的awk实现,以及grep一个文件里的所有IP行:
-n :grep 行输出,--line-number print line number with output lines
一)Grep -E参数,加上正则表达式实现,多个函数查找,如下:
grep -Erin 'atoi|itoa|atol|ltoa|intval' ./
配上shell 文件 findfunPath.sh如下:
#!/bin/bash
findPath=$1
#judge folder is exist
if [ ! -d "$findPath" ]; then
echo "Sorry,Input path is not exist.";
echo "You can try follow command to check it: ls ${findPath}";
exit 0
fi
grep -Erin 'atoi|itoa|atol|ltoa|intval' ${findPath}|awk -F":" '{print "\nFileLineNumber=" $2 " ExistFileName=" $1 "\nDetailInfo
=" $0}'
findPath=$1
#judge folder is exist
if [ ! -d "$findPath" ]; then
echo "Sorry,Input path is not exist.";
echo "You can try follow command to check it: ls ${findPath}";
exit 0
fi
grep -Erin 'atoi|itoa|atol|ltoa|intval' ${findPath}|awk -F":" '{print "\nFileLineNumber=" $2 " ExistFileName=" $1 "\nDetailInfo
=" $0}'
简单示例:
findfunPath.sh /usr/local/pro/
二)查看所查找单词的前三行后两行的环绕搜索:
[root@iZ25dcp92ckZ multepoolserver]# grep -rin -B 3 -A 2 "pthread_create Failed" ./multepoolser.c
569- threadNum[i]=i;//给数组赋值,传入线程编号值,后传入线程里。
570- //if(pthread_create(&handleEpollRd[i],NULL,pthread_handle_message, (void *)&i)){
571- if(pthread_create(&handleEpollRd[i],NULL,pthread_handle_message, (void *)&threadNum[i])){
572: sprintf(errOut,"pthread_create Failed : %s - %m\n",strerror(errno));
573- loger(errOut);
574- return -1;
--
591- writeThreadNum[i]=i;//给数组赋值,传入线程编号值,后传入线程里。
592- //if(pthread_create(&saveUpFilePart2Diskk[i],NULL,sync_additional_writing_worker, NULL )){
593- if(pthread_create(&saveUpFilePart2Diskk[i],NULL,sync_additional_writing_worker, (void *)&writeThreadNum[i])){
594: sprintf(errOut,"pthread_create Failed : %s - %m\n",strerror(errno));
595- loger(errOut);
596- return -1;
三)grep一个多行单独IP间隔包含文字里的IP列表出来:
四)grep查找时显示找到那行的后面N行-A,和前面N行参数-B的实际应用之查找域名里的root有哪些路径:
grep -Er "common.jackxiang.com|vote.jackxiang.com|answer.jackxiang.com|scratch.jackxiang.com|api.itv.jackxiang.com|common.itv.jackxiang.com|api.itv.cctv.com|common.itv.cctv.com" ./ -A 7|grep root
./answer.jackxiang.com.conf- root /data/www/api.jackxiang.com/;
./api.itv.jackxiang.com.conf: root /data/www/api.itv.jackxiang.com/;
./vote.jackxiang.com.conf- root /data/www/api.jackxiang.com/;
./scratch.jackxiang.com.conf- root /data/www/api.jackxiang.com/;
./common.jackxiang.com.conf- root /data/www/api.jackxiang.com/;
使用Memcached实现Session共享阅读全文
shell中如何一行写while:
From:http://blog.sina.com.cn/s/blog_ac843e330101c55g.html
if elif else demo:
wile demo:
函数示例:
From:http://blog.sina.com.cn/s/blog_ac843e330101c55g.html
if elif else demo:
#example
if [ $1 -gt 90 ];then
echo "Good, $1"
elif [ $1 -gt 70 ];then
echo "OK, $1"
else
echo "Bad, $1"
fi
if [ $1 -gt 90 ];then
echo "Good, $1"
elif [ $1 -gt 70 ];then
echo "OK, $1"
else
echo "Bad, $1"
fi
wile demo:
#example
i=1
sum=0
while test $i -le 100
do
let sum=$sum+$i
let i=$i+1
done
echo "1+2+3...+100="$sum
i=1
sum=0
while test $i -le 100
do
let sum=$sum+$i
let i=$i+1
done
echo "1+2+3...+100="$sum
函数示例:
#example
function add()
{
let $3=$1+$2
}
add 1 2 ret
echo $ret
function add()
{
let $3=$1+$2
}
add 1 2 ret
echo $ret
这让我想到一个很有意思的事情就是大家熟悉的琼瑶阿姨,她是“追求爱情顺便结婚”。在华人历史上他可以说是唯一一个追求爱情,享受爱情,靠爱情养活自己,最终成就爱情的女性。她的故事已广为人知,在中学因为谈恋爱而被家里人责怪,最后失恋写了窗外,之后投稿投了十几年,最后和出版社老板爱上了,这个过程本身就是一个故事。最后所有作品拍成电视剧,在台湾广受欢迎,最后养活了她自己,改善了她的生活。大陆开放这些作品,在大陆重新贩卖,重新在大陆掀起新的爱情故事,她又收获了新的视野,她现在在享受她爱情的生活。
会改变一切。 第二个就是和谁做非常重要,和谁做呢?我们经常开玩笑说大家都熟悉天上人间有很多劳动妇女最近被清退。如果她碰到是坏人就是卖淫嫖娼,是蔡锷就是千古风流,如果是更伟大的人也许就是国母,姿势一样,行为一样,跟的人不一样,结果就很不一样。 《风马牛:冯仑和他的快意人生》当当网订购专线卓越网订购专线欢迎访问“风马牛集中营”www.fengmaniu.com 我们身边也常常看到另外一类女孩子,她们追求婚姻,顺便爱情。同样,我们身边也有一些人开会的时候和对外发言的时候讲一讲理想,实际上关起门来总是庆幸自己赚多少钱。甚至一些上市的创业板公司,也是追求金钱顺便谈谈理想。
会改变一切。 第二个就是和谁做非常重要,和谁做呢?我们经常开玩笑说大家都熟悉天上人间有很多劳动妇女最近被清退。如果她碰到是坏人就是卖淫嫖娼,是蔡锷就是千古风流,如果是更伟大的人也许就是国母,姿势一样,行为一样,跟的人不一样,结果就很不一样。 《风马牛:冯仑和他的快意人生》当当网订购专线卓越网订购专线欢迎访问“风马牛集中营”www.fengmaniu.com 我也看到很多做房地产企业,他们真的是只在考虑自己赚钱的事情,做出短视的决策。比如说客户有投诉,追求理想的企业会第一时间反应让客户满意,要改善,这是追求理想,很简单的事情,他要考虑长期的公司价值以及社会责任。追求金钱公司会怎么样,他会找保安把这个客户威胁,收拾,当下把这个事摁下去,处理这类事两个老板看见的东西不一样,前者看到是未来,后者看到是现在的问题。一远一近处理事情的方法是差之千里。
会改变一切。 第二个就是和谁做非常重要,和谁做呢?我们经常开玩笑说大家都熟悉天上人间有很多劳动妇女最近被清退。如果她碰到是坏人就是卖淫嫖娼,是蔡锷就是千古风流,如果是更伟大的人也许就是国母,姿势一样,行为一样,跟的人不一样,结果就很不一样。 《风马牛:冯仑和他的快意人生》当当网订购专线卓越网订购专线欢迎访问“风马牛集中营”www.fengmaniu.com 追求理想也会让我们算帐的方法跟普通人不一样,企业最难的是算帐,创业者之所以会面临算不清楚的帐,大体三个原因,第一是时间原因,一个事情的时间会决定这个事情的价值。比如我在这里喝水喝一下是解渴,喝很多是艺术,喝死就是文物。我们只要坚持,时间会改变一切。
会改变一切。 第二个就是和谁做非常重要,和谁做呢?我们经常开玩笑说大家都熟悉天上人间有很多劳动妇女最近被清退。如果她碰到是坏人就是卖淫嫖娼,是蔡锷就是千古风流,如果是更伟大的人也许就是国母,姿势一样,行为一样,跟的人不一样,结果就很不一样。 《风马牛:冯仑和他的快意人生》当当网订购专线卓越网订购专线欢迎访问“风马牛集中营”www.fengmaniu.com 第二个就是和谁做非常重要,和谁做呢?我们经常开玩笑说大家都熟悉天上人间有很多劳动妇女最近被清退。如果她碰到是坏人就是卖淫嫖娼,是蔡锷就是千古风流,如果是更伟大的人也许就是国母,姿势一样,行为一样,跟的人不一样,结果就很不一样。
会改变一切。 第二个就是和谁做非常重要,和谁做呢?我们经常开玩笑说大家都熟悉天上人间有很多劳动妇女最近被清退。如果她碰到是坏人就是卖淫嫖娼,是蔡锷就是千古风流,如果是更伟大的人也许就是国母,姿势一样,行为一样,跟的人不一样,结果就很不一样。 《风马牛:冯仑和他的快意人生》当当网订购专线卓越网订购专线欢迎访问“风马牛集中营”www.fengmaniu.com 我们身边也常常看到另外一类女孩子,她们追求婚姻,顺便爱情。同样,我们身边也有一些人开会的时候和对外发言的时候讲一讲理想,实际上关起门来总是庆幸自己赚多少钱。甚至一些上市的创业板公司,也是追求金钱顺便谈谈理想。
会改变一切。 第二个就是和谁做非常重要,和谁做呢?我们经常开玩笑说大家都熟悉天上人间有很多劳动妇女最近被清退。如果她碰到是坏人就是卖淫嫖娼,是蔡锷就是千古风流,如果是更伟大的人也许就是国母,姿势一样,行为一样,跟的人不一样,结果就很不一样。 《风马牛:冯仑和他的快意人生》当当网订购专线卓越网订购专线欢迎访问“风马牛集中营”www.fengmaniu.com 我也看到很多做房地产企业,他们真的是只在考虑自己赚钱的事情,做出短视的决策。比如说客户有投诉,追求理想的企业会第一时间反应让客户满意,要改善,这是追求理想,很简单的事情,他要考虑长期的公司价值以及社会责任。追求金钱公司会怎么样,他会找保安把这个客户威胁,收拾,当下把这个事摁下去,处理这类事两个老板看见的东西不一样,前者看到是未来,后者看到是现在的问题。一远一近处理事情的方法是差之千里。
会改变一切。 第二个就是和谁做非常重要,和谁做呢?我们经常开玩笑说大家都熟悉天上人间有很多劳动妇女最近被清退。如果她碰到是坏人就是卖淫嫖娼,是蔡锷就是千古风流,如果是更伟大的人也许就是国母,姿势一样,行为一样,跟的人不一样,结果就很不一样。 《风马牛:冯仑和他的快意人生》当当网订购专线卓越网订购专线欢迎访问“风马牛集中营”www.fengmaniu.com 追求理想也会让我们算帐的方法跟普通人不一样,企业最难的是算帐,创业者之所以会面临算不清楚的帐,大体三个原因,第一是时间原因,一个事情的时间会决定这个事情的价值。比如我在这里喝水喝一下是解渴,喝很多是艺术,喝死就是文物。我们只要坚持,时间会改变一切。
会改变一切。 第二个就是和谁做非常重要,和谁做呢?我们经常开玩笑说大家都熟悉天上人间有很多劳动妇女最近被清退。如果她碰到是坏人就是卖淫嫖娼,是蔡锷就是千古风流,如果是更伟大的人也许就是国母,姿势一样,行为一样,跟的人不一样,结果就很不一样。 《风马牛:冯仑和他的快意人生》当当网订购专线卓越网订购专线欢迎访问“风马牛集中营”www.fengmaniu.com 第二个就是和谁做非常重要,和谁做呢?我们经常开玩笑说大家都熟悉天上人间有很多劳动妇女最近被清退。如果她碰到是坏人就是卖淫嫖娼,是蔡锷就是千古风流,如果是更伟大的人也许就是国母,姿势一样,行为一样,跟的人不一样,结果就很不一样。
g r e p命令加- E参数,这一扩展允许使用扩展模式匹配。例如,要抽取城市代码为2 1 9或2 1 6,方法如下:
我采用:
~/grep# grep -Erin 'atoi|itoa|atol|ltoa' ./
./itoa.txt:1:itoa
./itoa.txt:2:atoi
./itoa.txt:3:atoi
./itoa.txt:4:atoi
./itoa.txt:5:atoi
./atoi.txt:1:atoi
./atoi.txt:2:atoi
./atoi.txt:3:atoi
./atoi.txt:4:atoi
./atoi.txt:5:atoi
./atol.txt:1:atol
./atol.txt:2:atol
./atol.txt:3:atol
./atol.txt:4:atol
./atol.txt:5:atol
./atol.txt:6:atol
./ltoa.txt:1:ltoa
./ltoa.txt:2:ltoa
./ltoa.txt:3:ltoa
./ltoa.txt:4:ltoa
./ltoa.txt:5:ltoa
./ltoa.txt:6:ltoa
阅读全文
[sam@chenwy sam]$ grep -E '219|216' data.f
219 dec 2CC1999 CAD 23.00 PLV2C 68
216 sept 3ZL1998 USP 86.00 KVM9E 234
219 dec 2CC1999 CAD 23.00 PLV2C 68
216 sept 3ZL1998 USP 86.00 KVM9E 234
我采用:
grep -Erin 'atoi|itoa|atol|ltoa' ./
~/grep# grep -Erin 'atoi|itoa|atol|ltoa' ./
./itoa.txt:1:itoa
./itoa.txt:2:atoi
./itoa.txt:3:atoi
./itoa.txt:4:atoi
./itoa.txt:5:atoi
./atoi.txt:1:atoi
./atoi.txt:2:atoi
./atoi.txt:3:atoi
./atoi.txt:4:atoi
./atoi.txt:5:atoi
./atol.txt:1:atol
./atol.txt:2:atol
./atol.txt:3:atol
./atol.txt:4:atol
./atol.txt:5:atol
./atol.txt:6:atol
./ltoa.txt:1:ltoa
./ltoa.txt:2:ltoa
./ltoa.txt:3:ltoa
./ltoa.txt:4:ltoa
./ltoa.txt:5:ltoa
./ltoa.txt:6:ltoa
阅读全文
亦庄,立足于北京国际新城的新高度,随着政策的利好导向,正在高速前行,成为北京在世界的代言。亦庄路东区作为以产业为主导功能的片区成为重点区域。丰富的交通资源为区域发展提供动力,亦庄线、M12线在此交会, 2010年年底开通的轻轨亦庄线,北接地铁5号线,20分钟直抵宋家庄。M12建成后通达国贸,将与CBD区域融合。
双轨建构 京南置业黄金点
距L2和M12换乘站经海路站仅280米VITA国际,于2010年11月11日破土动工, 11月12日售楼处开放。是目前北京距离地铁最近的在售低总价精装小户型,业主出门即可便捷接入北京城市地铁网。在经历通州、奥北、中关村等轻轨沿线不动产购置热潮之后,VITA国际的轨道效应将引领新一轮资本流向,开启全新地铁时代。
与VITA国际一个街区之隔,将建造亦庄的公交枢纽站,届时公交枢纽将实现“零距离”换乘。VITA国际门前双轨交会,瞬间直抵繁华。
保守估计:从开盘到交房每平米净赚4000非常轻松。仅供参考!
欢迎来电垂询:13269811169 陈娅婷
11月20日正式接受排号!排号可享受优惠!
双轨建构 京南置业黄金点
距L2和M12换乘站经海路站仅280米VITA国际,于2010年11月11日破土动工, 11月12日售楼处开放。是目前北京距离地铁最近的在售低总价精装小户型,业主出门即可便捷接入北京城市地铁网。在经历通州、奥北、中关村等轻轨沿线不动产购置热潮之后,VITA国际的轨道效应将引领新一轮资本流向,开启全新地铁时代。
与VITA国际一个街区之隔,将建造亦庄的公交枢纽站,届时公交枢纽将实现“零距离”换乘。VITA国际门前双轨交会,瞬间直抵繁华。
保守估计:从开盘到交房每平米净赚4000非常轻松。仅供参考!
欢迎来电垂询:13269811169 陈娅婷
11月20日正式接受排号!排号可享受优惠!
首先博主抛出一个疑问,如何实现windows和linux之间的rpc通信,这两个异构的系统如何才能建立变量传递通道,这相当困扰博主,如有好心人指点,将不胜感激。
好了,现在切入正题:今天博主在linux环境下实现了一个小小RPC通信,按照惯例,做一下总结吧。
原先博主用的是Red hat9,安装完red hat后不想系统不带GCC,然后博主跑遍各大linux论坛搜寻装GCC的步骤,虽然取得些微的进步,对linux也有一些初步的认识了,但是系统还是不能用。无奈,博主就跑去问老师如何解决linux安装C编译器,不想linux老师来了一句这个red hat他已经不玩好多年了,然后建议我去玩ubuntu。于是,博主就屁颠屁颠地跑去下载最新的ubuntu 10.4,然后安装。出乎意料的是,ubuntu安装要比red hat方便多了,基本属于傻瓜式操作。
所以,接下来博主要讲的基本都是基于ubuntu 10.4平台的。
虽然是新平台,但是ubuntu用的还是linux内核,所以基本和red hat差不多,只有些微差别。
这次操作比上次在red hat上操作顺利多了,博主是参照下文的步骤一步一步实现rpc的:
1. 根据rpc调用的功能,先不考虑rpc调用,编写一个平常的实现相应功能的程序。
如一个远程的文件传输的rpc调用,平常程序便是考虑文件存储在本地,直接打开读便可,如下:
#include <stdio.h>
#include <stdlib.h>
#define MAXNAME 20
#define MAXLENGTH 1024
char * readfile(char *);
int main()
{
char name[MAXNAME];
printf("Enter File Name: ");
scanf("%s", name);
printf("%s", readfile(name));
}
char * readfile(char * name)
{
FILE *file = fopen(name, "r");
char * buf = (char *)malloc(sizeof(char)*MAXLENGTH);
if (file == NULL)
{
printf("File Cann't Be Open!");
return 0;
}
printf("The File Content is : \n");
while (fgets(buf, MAXLENGTH-1, file) != NULL)
{
return buf;
}
return NULL;
}
2. 把程序拆分为两部分,main函数和readfile函数,带有main的一部分是主动发起调用的,在rpc中相当于客户端,带有readfile函数的部分是提供相应的功能的,相当于服务器端。将代码拆分后要在客户端添加相应的rpc调用函数,clnt_create(RMACHINE, FILETRANSPROG, FILETRANSVERS,"tcp");
FILETRANSPROG便是trans.x中的程序名,FILETRANSVERS是版本名,使用tcp进行rpc调用。
拆分后代码如下:
客户端client.c:
#include <rpc/rpc.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <unistd.h>
#include "trans.h"
#define WSVERS MAKEWORD(0, 2)
#define RMACHINE "localhost"
CLIENT *handle;
#define MAXNAME 20
#define MAXLENGTH 1024
char * readfile(char *);
int main()
{
char name[MAXNAME];
char * buf;
printf("Enter File Name: ");
scanf("%s", name);
handle = clnt_create(RMACHINE, FILETRANSPROG, FILETRANSVERS,"tcp");
if (handle == 0) {
printf("Could Not Connect To Remote Server.\n");
exit(1);
}
buf = readfile(name);
printf("%s", buf);
return 0;
}
服务器端server.c:
#include <rpc/rpc.h>
#include <stdio.h>
#include <stdlib.h>
#include "trans.h"
#define MAXNAME 20
#define MAXLENGTH 1024
char * readfile(char * name)
{
FILE *file = fopen(name, "r");
char * buf = (char *)malloc(sizeof(char)*MAXLENGTH);
if (file == NULL)
{
printf("File Cann't Be Open!");
return 0;
}
printf("The File Content is : \n");
while (fgets(buf, MAXLENGTH-1, file) != NULL)
{
return buf;
}
return NULL;
}
3. 编写***.x文件。具体步骤可以参考Douglas的那本Internetworking With TCP/IP 的第三卷,客户端-服务器端编程与应用。
本程序的.x文件命名为trans.x内容如下:
const MAXLENGTH = 1024;
const MAXNAME = 20;
program FILETRANSPROG //程序名
{
version FILETRANSVERS //版本名
{
string READFILE(string) = 1; //调用的方法名
} = 1;
} = 99;
4. 使用rpcgen编辑.x文件,在linux下输入命令
rpcgen trans.x
若格式正确,编译无错误则产生三个文件trans.h,trans_svc.c(服务器端),trans_clnt.c(客户端)。因为上述trans.x中无自定义数据结构,所以没有xdr文件产生。
trans.h代码:
/*
* Please do not edit this file.
* It was generated using rpcgen.
*/
#ifndef _TRANS_H_RPCGEN
#define _TRANS_H_RPCGEN
#include <rpc/rpc.h>
#ifdef __cplusplus
extern "C" {
#endif
#define MAXLENGTH 1024
#define MAXNAME 20
#define FILETRANSPROG 99
#define FILETRANSVERS 1
#if defined(__STDC__) || defined(__cplusplus)
#define READFILE 1
extern char ** readfile_1(char **, CLIENT *);
extern char ** readfile_1_svc(char **, struct svc_req *);
extern int filetransprog_1_freeresult (SVCXPRT *, xdrproc_t, caddr_t);
#else /* K&R C */
#define READFILE 1
extern char ** readfile_1();
extern char ** readfile_1_svc();
extern int filetransprog_1_freeresult ();
#endif /* K&R C */
#ifdef __cplusplus
}
#endif
#endif /* !_TRANS_H_RPCGEN */
trans_svc.c代码:
/*
* Please do not edit this file.
* It was generated using rpcgen.
*/
#include "trans.h"
#include <stdio.h>
#include <stdlib.h>
#include <rpc/pmap_clnt.h>
#include <string.h>
#include <memory.h>
#include <sys/socket.h>
#include <netinet/in.h>
#ifndef SIG_PF
#define SIG_PF void(*)(int)
#endif
static void
filetransprog_1(struct svc_req *rqstp, register SVCXPRT *transp)
{
union {
char *readfile_1_arg;
} argument;
char *result;
xdrproc_t _xdr_argument, _xdr_result;
char *(*local)(char *, struct svc_req *);
switch (rqstp->rq_proc) {
case NULLPROC:
(void) svc_sendreply (transp, (xdrproc_t) xdr_void, (char *)NULL);
return;
case READFILE:
_xdr_argument = (xdrproc_t) xdr_wrapstring;
_xdr_result = (xdrproc_t) xdr_wrapstring;
local = (char *(*)(char *, struct svc_req *)) readfile_1;
break;
default:
svcerr_noproc (transp);
return;
}
memset ((char *)&argument, 0, sizeof (argument));
if (!svc_getargs (transp, (xdrproc_t) _xdr_argument, (caddr_t) &argument)) {
svcerr_decode (transp);
return;
}
result = (*local)((char *)&argument, rqstp);
if (result != NULL && !svc_sendreply(transp, (xdrproc_t) _xdr_result, result)) {
svcerr_systemerr (transp);
}
if (!svc_freeargs (transp, (xdrproc_t) _xdr_argument, (caddr_t) &argument)) {
fprintf (stderr, "%s", "unable to free arguments");
exit (1);
}
return;
}
int
main (int argc, char **argv)
{
register SVCXPRT *transp;
pmap_unset (FILETRANSPROG, FILETRANSVERS);
transp = svcudp_create(RPC_ANYSOCK);
if (transp == NULL) {
fprintf (stderr, "%s", "cannot create udp service.");
exit(1);
}
if (!svc_register(transp, FILETRANSPROG, FILETRANSVERS, filetransprog_1, IPPROTO_UDP)) {
fprintf (stderr, "%s", "unable to register (FILETRANSPROG, FILETRANSVERS, udp).");
exit(1);
}
transp = svctcp_create(RPC_ANYSOCK, 0, 0);
if (transp == NULL) {
fprintf (stderr, "%s", "cannot create tcp service.");
exit(1);
}
if (!svc_register(transp, FILETRANSPROG, FILETRANSVERS, filetransprog_1, IPPROTO_TCP)) {
fprintf (stderr, "%s", "unable to register (FILETRANSPROG, FILETRANSVERS, tcp).");
exit(1);
}
svc_run ();
fprintf (stderr, "%s", "svc_run returned");
exit (1);
/* NOTREACHED */
}
trans_clnt.c代码:
/*
* Please do not edit this file.
* It was generated using rpcgen.
*/
#include <memory.h> /* for memset */
#include "trans.h"
/* Default timeout can be changed using clnt_control() */
static struct timeval TIMEOUT = { 25, 0 };
char **
readfile_1(char **argp, CLIENT *clnt)
{
static char *clnt_res;
memset((char *)&clnt_res, 0, sizeof(clnt_res));
if (clnt_call (clnt, READFILE,
(xdrproc_t) xdr_wrapstring, (caddr_t) argp,
(xdrproc_t) xdr_wrapstring, (caddr_t) &clnt_res,
TIMEOUT) != RPC_SUCCESS) {
return (NULL);
}
return (&clnt_res);
}
5. 编写客户端和服务器端接口。此部分可以说是最麻烦的部分,稍不注意便会出错,同样可以参考Douglas的那本书,但要注意的是他的服务器接口例程代码中的每个函数的第二个参数应该是CLIENT *clnt, 而非struct svc_req * rqstp
为本程序编写的代码如下:
客户端接口文件trans_cif.c:
#include <rpc/rpc.h>
#include <stdio.h>
#include "trans.h"/* Client-side stub interface routines written by programmer */
extern CLIENT * handle;
static char **ret;
char * readfile(char * name)
{
char ** arg;
arg = &name;
ret = readfile_1(arg, handle);
return ret==NULL ? NULL : *ret;
}
服务器端接口文件trans_sif.c:
#include <rpc/rpc.h>
#include <stdio.h>
#include "trans.h"
char * readfile(char *);
static char * retcode;
char ** readfile_1(char ** w, CLIENT *clnt)
{
retcode = readfile(*(char**)w);
return &retcode;
}
6. 编译链接客户端和服务器端程序
不管是客户端还是服务器端,都要链接三个文件,
客户端:程序文件+*** _clnt.c+客户端接口文件。
服务器端:程序文件+*** _svc.c+服务器端接口文件
同时每一段的三个文件都是互相关联的,编译出现错误时,可以根据提示查看三个文件进行debug
命令如下:
gcc -Wall -o trans_client client.c trans_clnt.c trans_cif.c
gcc -Wall -o trans_server server.c trans_svc.c trans_sif.c
7. 启动服务器端和客户端,大功告成。要先运行服务器端程序,再运行客户端程序。命令如下:
./trans_server
./trans_client
client启动后,提示输入要传输的文件名,输入后,server将文件的第一行传回,大功告成!
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/symbol89/archive/2009/06/21/4285142.aspx
----------------------------------------------------------------------------------------------------------------------------------------------------
博主按照上面的指示一步一步做下来,还算顺利。但是在链接服务端文件时爆出一个错误,意思是trans_svc.c这个文件有个undefined reference to 'readfile_1_svc'错误,经本人亲测,是由于trans_svc.c文件第37行原本应该是local = (char*(*)(char *,struct svc_reg *))readfile_1;的,但是rpc编译器翻译成local = (char*(*)(char *,struct svc_reg *))readfile_1_svc ,所以把_svc去掉就好了。
这里不得不提的是ubuntu的vi编辑器相当不好用。即没有装vim,操作起来也没有red hat的vi编译器那样用的那么顺手。这里强烈推荐鸟哥的vi编辑器入门手册。把vi编译器介绍的很详细,附上地址:http://linux.vbird.org/linux_basic/0310vi.php。
vi编辑器模式图(转载自鸟哥的私房菜)
vi模式下指令汇总(转载自鸟哥的私房菜)
最后强烈推荐《鸟哥的私房菜》这本书,相当棒的讲解linux的一套书(有专门的网站)。分上下册,上册讲解linux的基本知识和指令,下册讲linux架站的知识。很实用。
-----------------------------------------------------------------------------------------------------------------------------------------------------
最后运行./trans_server时系统会爆出cannot connect to...的错误(具体的我也忘了),
Cannot register service: RPC: Unable to receive; errno = Connection refused
unable to register (FILETRANSPROG, FILETRANSVERS, udp)
这是由于linux默认把端口映射服务关闭的缘故。这时可以参照下面的解决方法:
centos 6(在CentOS 6.3当中,portmap服务由rpcbind负责) :
yum -y install nfs-utils rpcbind
我们可以看出NFS的安装在Centos 5下和Centos 6下还是有比较大的差异,做个记录方便以后安装。
$ sudo apt-get install nfs-kernel-server nfs-common portmap
$ sudo dpkg-reconfigure portmap
--------------------------------------------------------------------------------------------------------
如果启动还有问题,那有可能是rpcbind服务没有起得来:
[root@iZ25dcp92ckZ rpc]# service rpcbind start
Redirecting to /bin/systemctl start rpcbind.service
CeontOS参考:http://blog.chinaunix.net/uid-20639775-id-3399961.html
在出现如下提示的时候,注意选定“不将portmap 绑定在loopback 地址”
之后,系统会有如下提示:
Current registered services:
------------------------------------------------
100003 2 udp 2049 nfs
100003 3 udp 2049 nfs
100003 4 udp 2049 nfs
…
100003 2 tcp 2049 nfs
100003 3 tcp 2049 nfs
100003 4 tcp 2049 nfs
之后通过查看 /etc/default/portmap, 确保
#OPTIONS="-i 127.0.0.1"
前面的#号 被添加了
重启portmap服务:
$ sudo /etc/init.d/portmap restart
这样就可以了,但是要用root权限执行。
到这里所有我所遇到的问题都解决了,但是博主仍有疑问,如何实现windows和linux之间的rpc通信,这两个异构的系统如何才能建立变量传递通道,这相当困扰博主,如有好心人指点,将不胜感激。
======Below Add Time:2016-01-22=========
启动:
[root@iZ25dcp92ckZ rpc]# ./trans_server
连接:
[root@iZ25dcp92ckZ rpc]# ./trans_client
Enter File Name: /etc/hosts
127.0.0.1 iZ25dcp92ckZ Jack'sAliYunVPS jackxiang localhost
本文出自 “只争朝夕” 博客,请务必保留此出处http://xiaovfight.blog.51cto.com/1625426/398745
好了,现在切入正题:今天博主在linux环境下实现了一个小小RPC通信,按照惯例,做一下总结吧。
原先博主用的是Red hat9,安装完red hat后不想系统不带GCC,然后博主跑遍各大linux论坛搜寻装GCC的步骤,虽然取得些微的进步,对linux也有一些初步的认识了,但是系统还是不能用。无奈,博主就跑去问老师如何解决linux安装C编译器,不想linux老师来了一句这个red hat他已经不玩好多年了,然后建议我去玩ubuntu。于是,博主就屁颠屁颠地跑去下载最新的ubuntu 10.4,然后安装。出乎意料的是,ubuntu安装要比red hat方便多了,基本属于傻瓜式操作。
所以,接下来博主要讲的基本都是基于ubuntu 10.4平台的。
虽然是新平台,但是ubuntu用的还是linux内核,所以基本和red hat差不多,只有些微差别。
这次操作比上次在red hat上操作顺利多了,博主是参照下文的步骤一步一步实现rpc的:
1. 根据rpc调用的功能,先不考虑rpc调用,编写一个平常的实现相应功能的程序。
如一个远程的文件传输的rpc调用,平常程序便是考虑文件存储在本地,直接打开读便可,如下:
#include <stdio.h>
#include <stdlib.h>
#define MAXNAME 20
#define MAXLENGTH 1024
char * readfile(char *);
int main()
{
char name[MAXNAME];
printf("Enter File Name: ");
scanf("%s", name);
printf("%s", readfile(name));
}
char * readfile(char * name)
{
FILE *file = fopen(name, "r");
char * buf = (char *)malloc(sizeof(char)*MAXLENGTH);
if (file == NULL)
{
printf("File Cann't Be Open!");
return 0;
}
printf("The File Content is : \n");
while (fgets(buf, MAXLENGTH-1, file) != NULL)
{
return buf;
}
return NULL;
}
2. 把程序拆分为两部分,main函数和readfile函数,带有main的一部分是主动发起调用的,在rpc中相当于客户端,带有readfile函数的部分是提供相应的功能的,相当于服务器端。将代码拆分后要在客户端添加相应的rpc调用函数,clnt_create(RMACHINE, FILETRANSPROG, FILETRANSVERS,"tcp");
FILETRANSPROG便是trans.x中的程序名,FILETRANSVERS是版本名,使用tcp进行rpc调用。
拆分后代码如下:
客户端client.c:
#include <rpc/rpc.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <unistd.h>
#include "trans.h"
#define WSVERS MAKEWORD(0, 2)
#define RMACHINE "localhost"
CLIENT *handle;
#define MAXNAME 20
#define MAXLENGTH 1024
char * readfile(char *);
int main()
{
char name[MAXNAME];
char * buf;
printf("Enter File Name: ");
scanf("%s", name);
handle = clnt_create(RMACHINE, FILETRANSPROG, FILETRANSVERS,"tcp");
if (handle == 0) {
printf("Could Not Connect To Remote Server.\n");
exit(1);
}
buf = readfile(name);
printf("%s", buf);
return 0;
}
服务器端server.c:
#include <rpc/rpc.h>
#include <stdio.h>
#include <stdlib.h>
#include "trans.h"
#define MAXNAME 20
#define MAXLENGTH 1024
char * readfile(char * name)
{
FILE *file = fopen(name, "r");
char * buf = (char *)malloc(sizeof(char)*MAXLENGTH);
if (file == NULL)
{
printf("File Cann't Be Open!");
return 0;
}
printf("The File Content is : \n");
while (fgets(buf, MAXLENGTH-1, file) != NULL)
{
return buf;
}
return NULL;
}
3. 编写***.x文件。具体步骤可以参考Douglas的那本Internetworking With TCP/IP 的第三卷,客户端-服务器端编程与应用。
本程序的.x文件命名为trans.x内容如下:
const MAXLENGTH = 1024;
const MAXNAME = 20;
program FILETRANSPROG //程序名
{
version FILETRANSVERS //版本名
{
string READFILE(string) = 1; //调用的方法名
} = 1;
} = 99;
4. 使用rpcgen编辑.x文件,在linux下输入命令
rpcgen trans.x
若格式正确,编译无错误则产生三个文件trans.h,trans_svc.c(服务器端),trans_clnt.c(客户端)。因为上述trans.x中无自定义数据结构,所以没有xdr文件产生。
trans.h代码:
/*
* Please do not edit this file.
* It was generated using rpcgen.
*/
#ifndef _TRANS_H_RPCGEN
#define _TRANS_H_RPCGEN
#include <rpc/rpc.h>
#ifdef __cplusplus
extern "C" {
#endif
#define MAXLENGTH 1024
#define MAXNAME 20
#define FILETRANSPROG 99
#define FILETRANSVERS 1
#if defined(__STDC__) || defined(__cplusplus)
#define READFILE 1
extern char ** readfile_1(char **, CLIENT *);
extern char ** readfile_1_svc(char **, struct svc_req *);
extern int filetransprog_1_freeresult (SVCXPRT *, xdrproc_t, caddr_t);
#else /* K&R C */
#define READFILE 1
extern char ** readfile_1();
extern char ** readfile_1_svc();
extern int filetransprog_1_freeresult ();
#endif /* K&R C */
#ifdef __cplusplus
}
#endif
#endif /* !_TRANS_H_RPCGEN */
trans_svc.c代码:
/*
* Please do not edit this file.
* It was generated using rpcgen.
*/
#include "trans.h"
#include <stdio.h>
#include <stdlib.h>
#include <rpc/pmap_clnt.h>
#include <string.h>
#include <memory.h>
#include <sys/socket.h>
#include <netinet/in.h>
#ifndef SIG_PF
#define SIG_PF void(*)(int)
#endif
static void
filetransprog_1(struct svc_req *rqstp, register SVCXPRT *transp)
{
union {
char *readfile_1_arg;
} argument;
char *result;
xdrproc_t _xdr_argument, _xdr_result;
char *(*local)(char *, struct svc_req *);
switch (rqstp->rq_proc) {
case NULLPROC:
(void) svc_sendreply (transp, (xdrproc_t) xdr_void, (char *)NULL);
return;
case READFILE:
_xdr_argument = (xdrproc_t) xdr_wrapstring;
_xdr_result = (xdrproc_t) xdr_wrapstring;
local = (char *(*)(char *, struct svc_req *)) readfile_1;
break;
default:
svcerr_noproc (transp);
return;
}
memset ((char *)&argument, 0, sizeof (argument));
if (!svc_getargs (transp, (xdrproc_t) _xdr_argument, (caddr_t) &argument)) {
svcerr_decode (transp);
return;
}
result = (*local)((char *)&argument, rqstp);
if (result != NULL && !svc_sendreply(transp, (xdrproc_t) _xdr_result, result)) {
svcerr_systemerr (transp);
}
if (!svc_freeargs (transp, (xdrproc_t) _xdr_argument, (caddr_t) &argument)) {
fprintf (stderr, "%s", "unable to free arguments");
exit (1);
}
return;
}
int
main (int argc, char **argv)
{
register SVCXPRT *transp;
pmap_unset (FILETRANSPROG, FILETRANSVERS);
transp = svcudp_create(RPC_ANYSOCK);
if (transp == NULL) {
fprintf (stderr, "%s", "cannot create udp service.");
exit(1);
}
if (!svc_register(transp, FILETRANSPROG, FILETRANSVERS, filetransprog_1, IPPROTO_UDP)) {
fprintf (stderr, "%s", "unable to register (FILETRANSPROG, FILETRANSVERS, udp).");
exit(1);
}
transp = svctcp_create(RPC_ANYSOCK, 0, 0);
if (transp == NULL) {
fprintf (stderr, "%s", "cannot create tcp service.");
exit(1);
}
if (!svc_register(transp, FILETRANSPROG, FILETRANSVERS, filetransprog_1, IPPROTO_TCP)) {
fprintf (stderr, "%s", "unable to register (FILETRANSPROG, FILETRANSVERS, tcp).");
exit(1);
}
svc_run ();
fprintf (stderr, "%s", "svc_run returned");
exit (1);
/* NOTREACHED */
}
trans_clnt.c代码:
/*
* Please do not edit this file.
* It was generated using rpcgen.
*/
#include <memory.h> /* for memset */
#include "trans.h"
/* Default timeout can be changed using clnt_control() */
static struct timeval TIMEOUT = { 25, 0 };
char **
readfile_1(char **argp, CLIENT *clnt)
{
static char *clnt_res;
memset((char *)&clnt_res, 0, sizeof(clnt_res));
if (clnt_call (clnt, READFILE,
(xdrproc_t) xdr_wrapstring, (caddr_t) argp,
(xdrproc_t) xdr_wrapstring, (caddr_t) &clnt_res,
TIMEOUT) != RPC_SUCCESS) {
return (NULL);
}
return (&clnt_res);
}
5. 编写客户端和服务器端接口。此部分可以说是最麻烦的部分,稍不注意便会出错,同样可以参考Douglas的那本书,但要注意的是他的服务器接口例程代码中的每个函数的第二个参数应该是CLIENT *clnt, 而非struct svc_req * rqstp
为本程序编写的代码如下:
客户端接口文件trans_cif.c:
#include <rpc/rpc.h>
#include <stdio.h>
#include "trans.h"/* Client-side stub interface routines written by programmer */
extern CLIENT * handle;
static char **ret;
char * readfile(char * name)
{
char ** arg;
arg = &name;
ret = readfile_1(arg, handle);
return ret==NULL ? NULL : *ret;
}
服务器端接口文件trans_sif.c:
#include <rpc/rpc.h>
#include <stdio.h>
#include "trans.h"
char * readfile(char *);
static char * retcode;
char ** readfile_1(char ** w, CLIENT *clnt)
{
retcode = readfile(*(char**)w);
return &retcode;
}
6. 编译链接客户端和服务器端程序
不管是客户端还是服务器端,都要链接三个文件,
客户端:程序文件+*** _clnt.c+客户端接口文件。
服务器端:程序文件+*** _svc.c+服务器端接口文件
同时每一段的三个文件都是互相关联的,编译出现错误时,可以根据提示查看三个文件进行debug
命令如下:
gcc -Wall -o trans_client client.c trans_clnt.c trans_cif.c
gcc -Wall -o trans_server server.c trans_svc.c trans_sif.c
7. 启动服务器端和客户端,大功告成。要先运行服务器端程序,再运行客户端程序。命令如下:
./trans_server
./trans_client
client启动后,提示输入要传输的文件名,输入后,server将文件的第一行传回,大功告成!
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/symbol89/archive/2009/06/21/4285142.aspx
----------------------------------------------------------------------------------------------------------------------------------------------------
博主按照上面的指示一步一步做下来,还算顺利。但是在链接服务端文件时爆出一个错误,意思是trans_svc.c这个文件有个undefined reference to 'readfile_1_svc'错误,经本人亲测,是由于trans_svc.c文件第37行原本应该是local = (char*(*)(char *,struct svc_reg *))readfile_1;的,但是rpc编译器翻译成local = (char*(*)(char *,struct svc_reg *))readfile_1_svc ,所以把_svc去掉就好了。
这里不得不提的是ubuntu的vi编辑器相当不好用。即没有装vim,操作起来也没有red hat的vi编译器那样用的那么顺手。这里强烈推荐鸟哥的vi编辑器入门手册。把vi编译器介绍的很详细,附上地址:http://linux.vbird.org/linux_basic/0310vi.php。
vi编辑器模式图(转载自鸟哥的私房菜)
vi模式下指令汇总(转载自鸟哥的私房菜)
最后强烈推荐《鸟哥的私房菜》这本书,相当棒的讲解linux的一套书(有专门的网站)。分上下册,上册讲解linux的基本知识和指令,下册讲linux架站的知识。很实用。
-----------------------------------------------------------------------------------------------------------------------------------------------------
最后运行./trans_server时系统会爆出cannot connect to...的错误(具体的我也忘了),
Cannot register service: RPC: Unable to receive; errno = Connection refused
unable to register (FILETRANSPROG, FILETRANSVERS, udp)
这是由于linux默认把端口映射服务关闭的缘故。这时可以参照下面的解决方法:
centos 6(在CentOS 6.3当中,portmap服务由rpcbind负责) :
yum -y install nfs-utils rpcbind
我们可以看出NFS的安装在Centos 5下和Centos 6下还是有比较大的差异,做个记录方便以后安装。
$ sudo apt-get install nfs-kernel-server nfs-common portmap
$ sudo dpkg-reconfigure portmap
--------------------------------------------------------------------------------------------------------
如果启动还有问题,那有可能是rpcbind服务没有起得来:
[root@iZ25dcp92ckZ rpc]# service rpcbind start
Redirecting to /bin/systemctl start rpcbind.service
CeontOS参考:http://blog.chinaunix.net/uid-20639775-id-3399961.html
在出现如下提示的时候,注意选定“不将portmap 绑定在loopback 地址”
之后,系统会有如下提示:
Current registered services:
------------------------------------------------
100003 2 udp 2049 nfs
100003 3 udp 2049 nfs
100003 4 udp 2049 nfs
…
100003 2 tcp 2049 nfs
100003 3 tcp 2049 nfs
100003 4 tcp 2049 nfs
之后通过查看 /etc/default/portmap, 确保
#OPTIONS="-i 127.0.0.1"
前面的#号 被添加了
重启portmap服务:
$ sudo /etc/init.d/portmap restart
这样就可以了,但是要用root权限执行。
到这里所有我所遇到的问题都解决了,但是博主仍有疑问,如何实现windows和linux之间的rpc通信,这两个异构的系统如何才能建立变量传递通道,这相当困扰博主,如有好心人指点,将不胜感激。
======Below Add Time:2016-01-22=========
启动:
[root@iZ25dcp92ckZ rpc]# ./trans_server
连接:
[root@iZ25dcp92ckZ rpc]# ./trans_client
Enter File Name: /etc/hosts
127.0.0.1 iZ25dcp92ckZ Jack'sAliYunVPS jackxiang localhost
本文出自 “只争朝夕” 博客,请务必保留此出处http://xiaovfight.blog.51cto.com/1625426/398745
fms在centos linux 4.x上可以正常安装,装完了就可以自已自动启来了。但是在centos linux 5.x上,装完后启动不了。日志内也没有任何错误信息。
安装:
./installFMS -platformWarnOnly
安装完成后FMS服务没有自动启来,日志内也没有任何错误信息。
我们通过看/etc/init.d/fms这个启动脚本,发现FMS启动主要是用到了fmsmaster start。手动跑fmsmaster start发现出错。
[root@fms1 fms]# ./fmsmaster start
./fmsmaster: error while loading shared libraries: libssl.so.4: cannot open shared object file: No such file or directory
libssl.so.4是这个链接,在5.x上版本上没有建,手动建立:
[root@fms1 fms]# ln -s /usr/lib/libssl.so /usr/lib/libssl.so.4
再启动:
[root@fms1 fms]# ./fmsmaster start
./fmsmaster: error while loading shared libraries: libcrypto.so.4: cannot open shared object file: No such file or directory
再建链接:
[root@fms1 fms]# ln -s /usr/lib/libcrypto.so /usr/lib/libcrypto.so.4
OK,FMS可以正常启动了。
来源:http://hi.baidu.com/farmerluo/blog/item/32bfd42a7790d398023bf65e.html
参考:http://mimieye.iteye.com/blog/103755
http://blog.bj50.net/black/?p=184
下载:http://blog.csdn.net/xiang08/article/details/4136670
https://www.adobe.com/cfusion/tdrc/index.cfm?loc=zh_cn&product=flashmediaserver
安装:
./installFMS -platformWarnOnly
安装完成后FMS服务没有自动启来,日志内也没有任何错误信息。
我们通过看/etc/init.d/fms这个启动脚本,发现FMS启动主要是用到了fmsmaster start。手动跑fmsmaster start发现出错。
[root@fms1 fms]# ./fmsmaster start
./fmsmaster: error while loading shared libraries: libssl.so.4: cannot open shared object file: No such file or directory
libssl.so.4是这个链接,在5.x上版本上没有建,手动建立:
[root@fms1 fms]# ln -s /usr/lib/libssl.so /usr/lib/libssl.so.4
再启动:
[root@fms1 fms]# ./fmsmaster start
./fmsmaster: error while loading shared libraries: libcrypto.so.4: cannot open shared object file: No such file or directory
再建链接:
[root@fms1 fms]# ln -s /usr/lib/libcrypto.so /usr/lib/libcrypto.so.4
OK,FMS可以正常启动了。
来源:http://hi.baidu.com/farmerluo/blog/item/32bfd42a7790d398023bf65e.html
参考:http://mimieye.iteye.com/blog/103755
http://blog.bj50.net/black/?p=184
下载:http://blog.csdn.net/xiang08/article/details/4136670
https://www.adobe.com/cfusion/tdrc/index.cfm?loc=zh_cn&product=flashmediaserver
为了省却不必要的麻烦,请尽量在编译安装时直接加上 --enable-deflate --enable-headers 参数
阅读全文
阅读全文
最近发现一个问题:
window.location.href在IE6下面竟然不跳转,这是为什么呢?
这个是我写的语句:
<a href="javascript:void(0);" ;onclick="javascript:window.location.href='http://www.sina.com';">转到新浪</a>
后面是网上找到了解决方案(URL:http://www.cnblogs.com/kaima/archive/2008/08/22/1273808.html):
<script type="text/javascript">
function goUrl(x)
{
window.location.href=x;
}
</script>
<a href="javascript:;" onclick="javascript:goUrl('http://www.sina.com');">跳转1</a>
<a href="javascript:void(0);" onclick="javascript:goUrl('http://www.sina.com');">跳转2</a>
<a href="javascript:void(0);" onclick="javascript:goUrl('http://www.sina.com');return false;">跳转3</a>
<a href="#" onclick="javascript:goUrl('http://www.sina.com');">跳转4</a>
<a href="###" onclick="javascript:goUrl('http://www.sina.com');">跳转5</a>
测试环境IE6,IE7,Firefox 3。
跳转1和2在IE6环境下无效,3、4、5在IE6,IE7,Firefox3.01下测试均能 通过,。
跳转4和5最简洁。
关键在于<a>的href属性,空链接用"#","###"。
为了不返回网页顶端。
空链接推荐用"###"。
我采用了第三种方法,在后面加了return false;这样,IE6、IE7、FF3下面全部通过。
如果这样:
注:"this.blur()"来消除链接后的焦点虚线框
来源:http://blog.163.com/leaf-shi/blog/static/12749133020098109215329/
window.location.href在IE6下面竟然不跳转,这是为什么呢?
这个是我写的语句:
<a href="javascript:void(0);" ;onclick="javascript:window.location.href='http://www.sina.com';">转到新浪</a>
后面是网上找到了解决方案(URL:http://www.cnblogs.com/kaima/archive/2008/08/22/1273808.html):
<script type="text/javascript">
function goUrl(x)
{
window.location.href=x;
}
</script>
<a href="javascript:;" onclick="javascript:goUrl('http://www.sina.com');">跳转1</a>
<a href="javascript:void(0);" onclick="javascript:goUrl('http://www.sina.com');">跳转2</a>
<a href="javascript:void(0);" onclick="javascript:goUrl('http://www.sina.com');return false;">跳转3</a>
<a href="#" onclick="javascript:goUrl('http://www.sina.com');">跳转4</a>
<a href="###" onclick="javascript:goUrl('http://www.sina.com');">跳转5</a>
测试环境IE6,IE7,Firefox 3。
跳转1和2在IE6环境下无效,3、4、5在IE6,IE7,Firefox3.01下测试均能 通过,。
跳转4和5最简洁。
关键在于<a>的href属性,空链接用"#","###"。
为了不返回网页顶端。
空链接推荐用"###"。
我采用了第三种方法,在后面加了return false;这样,IE6、IE7、FF3下面全部通过。
如果这样:
注:"this.blur()"来消除链接后的焦点虚线框
来源:http://blog.163.com/leaf-shi/blog/static/12749133020098109215329/