Chinaunix首页 | 论坛 | 博客
  • 博客访问: 305095
  • 博文数量: 66
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 509
  • 用 户 组: 普通用户
  • 注册时间: 2015-04-29 13:56
文章分类
文章存档

2018年(2)

2017年(6)

2016年(34)

2015年(24)

我的朋友

分类: 嵌入式

2015-09-10 11:22:09


在通过telnet登陆时候,可以通过-l 指定登陆的行为,如果 -l 执行一个脚本,那没什么问题,如果是执行一个进程,就会碰到下面问题需要考虑,
1. 如果运行进程是一个server,则需要考虑singleton设计,不然server出现多个进程
2. 如果运行进程是一个client, 那个会出现多个client同时通过同一port和server链接(因为client里面已经用了SO_REUSEADDR option),导致client消息会
   错乱, client A发的消息,server回复到了client B, 因为启动Client B时候,复用了Port

可以通过shell脚本获取已经运行的 testProcess 进程数, 然后通过popen把shell结果传入C代码,
再用base port 减去server个数,结果作为不同的Port和 Server链接

ps | grep testProcess | grep -v grep | grep -v telnetd | wc -l  --->shell 返回testProcess进程数目
fp = popen(ptr, "r"); 
fgets(acBuf, sizeof(acBuf)-1, fp) != NULL)                           ---> 程序获取testProcess进程数目
cnt= strtoul(acBuf, NULL, 10);
pclose(fp);

上面这个方法可以解决链接时候,port override问题,但是如果有多个链接时候,其中某一个退出,再链接,则会又出现Port override问题
例如有3个client 通 1110, 1111, 1112链到server,其中1111 client退出后再链接,上面逻辑则会判断有2个client在运行,然后用1112,这样又出现了
Port override问题。

最后通过获取当前正在使用的最小Port来解决这个问题,
netstat -an | grep 110* | awk  '{print $4}' | cut -b 9- | sort -n"


阅读(1235) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~