在通过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"
阅读(1267) | 评论(0) | 转发(0) |