-
connect方法会阻塞,请问有什么方法可以避免其长时间阻塞?
当在一个非阻塞的TCP套接字上调用connect时,connect将立即返回一个EINPROGRESS错误,不过已经发起的TCP三路握手继续进行。然后用select检测连接是否成功。给select设置超时值,就可以避免长时间阻塞。
非阻塞connect有三个用途:
(1)在三路握手期间,可以做其他操作。
(2)同时建立多个连接。这个用途已随着Web浏览器流行起来。
(3)缩短connect的超时,避免长时间阻塞。
select+非阻塞connect:两个规则:(1)当连接成功建立时,描述符可写(2)当连接建立遇到错误时,描述符变为既可读又可写。
所以可以用getsockopt查看是否connect出错。
-
网络中,如果客户端突然掉线或者重启,服务器端怎么样才能立刻知道?
如果server用select,客户重启,进程结束时发送FIN,server可读,读取长度为0 。
如果客户端突然掉线,不会发送FIN,服务器需要主动发送数据才能知道。
-
TTL是什么?有什么用处,通常那些工具会用到它?(ping? traceroute? ifconfig? netstat?)
TTL(time to live)生存时间字段(8位,在IP首部)设置了ip数据报可以经过的最多路由器数。TTL的初始值由主机设置,一旦经过一个处理它的路由器,它的值减去1。当该字段的值为0时,数据报就被丢弃,并发送ICMP报文通知源主机。
TTL字段的用处:目的是防止数据报在选路时无休止地在网络中流动。(例如,当路由器瘫痪或者两个路由器之间连接丢失,选路协议有时会检测丢失的路由并一直进行下去。)
Traceroute会用到TTL,当路由器接收IP数据报中的TTL是1或者0,不转发,丢弃后给信源发ICMP“超时”信息。包含这份ICMP信息的IP报文的信源地址是该路由器的IP地址。当Traceroute发送TTL为1的IP数据报,得到第一个路由器的地址,发送TTL为2则得到第二个路由器地址,最后IP数据报到达目的主机时,由于Tracerout发送的UDP数据报中的端口选择了一个不可能的值,使得目的主机的UDP模块产生一份“端口不可达”错误的ICMP报文,Tracerout收到后结束。
-
路由表示做什么用的?在linux环境中怎么来配置一条默认路由?
路由表是用来决定如何将包从一个子网传送到另一个子网的。在Linux上可以用 “route add default gw <默认路由器IP>”来配置一条默认路由。
-
在网络中有两台主机A和B,并通过路由器和其他交换设备连接起来,已经确认物理连接正确无误,怎么来测试这两台机器是否连通?如果不通,怎么来判断故障点?怎么排除故障?
从一台机器ping另一台机器,测试是否连通。若ping不通,用traceroute可以确定是哪个路由器不能连通,然后再找问题是在交换设备、hup、cable等。
-
deamon进程如何实现?
关于deamon进程:deamon进程,也就是守护进程,是在UNIX后台运行不受终端控制的进程。守护进程常常在系统引导装入时启动,系统关闭时终止。由于没有控制终端,syslog函数是输出消息的标准方式。守护进程通过读取环境变量而获得配置信息。
守护进程的创建,首先调用fork,为避免挂起控制终端,将守护进程放入后台执行。调用setsid函数脱离控制终端,登录会话和进程组,使该进程成为无终端的会话组长。通过不让进程成为会话组长来禁止进程重新打开控制终端,这就需要第二次调用fork,父进程(会话组长)退出,子进程继续执行,并不再拥有打开控制终端的能力。
// unistd.h syslog.h signal.h fcntl.h int deamon_init(const char *pname,int facility) { int i; int deamon_proc; pid_t pid; if((pid = fork())<0) return -1; else if(pid) exit(0); if(setsid()<0) return -1; signal(SIGHUP,SIG_IGN); if((pid = fork())<0) return -1; else if(pid) exit(0); daemon_proc = 1; chdir("/"); //改变工作路径 for(i=0;i<64;i++) close(i); open("/dev/null",O_RDONLY); open("/dev/null",O_RDWR); open("/dev/null",O_RDWR); openlog(pname,LOG_PID,facility); return 0; }
-
用UDP协议通讯时怎样得知目标机是否获得了数据包
可以在每个数据包中插入一个唯一的ID,比如timestamp或者递增的int。
发送方在发送数据时将此ID和发送时间记录在本地。
接收方在收到数据后将ID再发给发送方作为回应。
发送方如果收到回应,则知道接收方已经收到相应的数据包;如果在指定时间内没有收到回应,则数据包可能丢失,需要重复上面的过程重新发送一次,直到确定对方收到。
转载于:https://www.cnblogs.com/wongzawing/archive/2013/02/19/2917881.html