linux c/网络/网络编程面试题收集

来源:互联网 发布:海智网聚网络 编辑:程序博客网 时间:2024/05/17 07:13

1.下列程序在32位linux或unix中的结果是什么? 
func(char *str)
{
    printf("%d",sizeof(str));    //  4       char * 是四个字节, sizeof(变量)  返回一个对象或者类型所占的内存字节数  返回值是size_t

    printf("%d/n",sizeof(*str));// 1         *str代表一个char
    printf("%d",strlen(str));      //  9   

 

    int i=0;      //如果不定义,直接用strlen(int),则会报错,必须用赋值的变量才可以,variable "i" is used before its value is set
    char p='o';// char p 的赋值只能为一个字符;大小为一个字符
    char *pp="dddddddddd";


    printf("strlen(int) %d/n",strlen(i));       //0    strlen返回的是字符串的长度,所以入参是int时,没有'/0',返回0
    printf("sizeof(int)%d/n",sizeof(i));      //4       一个int 型只占四个字节
   
    printf("strlen(char) %d/n",strlen(p));      //0    strlen返回的是字符串的长度,所以入参是char时,没有'/0'返回0
    printf("sizeof(char)%d/n",sizeof(char));  //1    //一个char型只占一个字节,是最小数据类型

 

 

    printf("strlen(char *) %d/n",strlen(pp));  // 跟随 pp 的赋值来计算,这里是10,
    printf("sizeof(char *)%d/n",sizeof(pp)); // 永远为4 因为char*  是四个字节

 

}

main()
{
    char a[]="123456789";
   

    printf("%d",sizeof(a)); //  10  包括结束字符'/0'   变长的数组sizeof是根据其内容变的,
    printf("%d",strlen(a)); //    9 不包括结束字符'/0'

 

   char b[8]={'a',};


     printf("sizeof(b)%d/n",sizeof(b));  // 8  对于以定义大小的数组,sizeof和strlen 都 返回定义的长度
            printf("strlen(b)%d/n",strlen(b));  // 8

 

 

 

 

 

 

   

func(a);
}

答: 10   4   9


网络/网络编程部份:

1、connect方法会阻塞,请问有什么方法可以避免其长时间阻塞?
答:最通常的方法最有效的是加定时器;也可以采用非阻塞模式。

2、网络中,如果客户端突然掉线或者重启,服务器端怎么样才能立刻知道?
答:若客户端掉线或者重新启动,服务器端会收到复位信号,每一种tcp/ip得实现不一样,控制机制也不一样。

3.在子网210.27.48.21/30种有多少个可用地址?分别是什么?
答:

简:
30表示的是网络号(network number)是30位,剩下2位中11是广播(broadcast)地址,00是multicast地址,只有01和10可以作为host address。

详:
210.27.48.21/30 代表的子网的网络号是30位,即网络号是210.27.48.21 & 255.255.255.251=210.27.48.20,此子网的地址空间是2位,即可以有4个地址:210.27.48.20, 210.27.48.21, 210.27.48.22, 210.27.48.23。第一个地址的主机号(host number/id)是0,而主机号0代表的是multicast地址。最后一个地址的最后两位是11,主机号每一位都为1代表的是广播 (broadcast)地址。所以只有中间两个地址可以给host使用。其实那个问题本身不准确,广播或multicast地止也是可以使用的地址,所以回答4也应该正确,当然问的人也可能是想要你回答2。我个人觉得最好的回答是一个广播地址,一个multicast地址,2个unicast地址。

4.TTL是什么?有什么用处,通常那些工具会用到它?(ping? traceroute? ifconfig? netstat?)
答:
简:TTL是Time To Live,一般是hup count,每经过一个路由就会被减去一,如果它变成0,包会被丢掉。它的主要目的是防止包在有回路的网络上死转,浪费网络资源。ping和traceroute用到它。

详: TTL是Time To Live,目前是hup count,当包每经过一个路由器它就会被减去一,如果它变成0,路由器就会把包丢掉。IP网络往往带有环(loop),比如子网A和子网B有两个路由器相连,它就是一个loop。TTL的主要目的是防止包在有回路的网络上死转,因为包的TTL最终后变成0而使得此包从网上消失(此时往往路由器会送一个 ICMP包回来,traceroute就是根据这个做的)。ping会送包出去,所以里面有它,但是ping不一定非要不可它。traceroute则是完全因为有它才能成的。ifconfig是用来配置网卡的,netstat -rn 是用来列路由表的,所以都用不着它

5.路由表示做什么用的?在linux环境中怎么来配置一条默认路由?
答:
简:路由表是用来决定如何将包从一个子网传送到另一个子网的,换局话说就是用来决定从一个网卡接收到的包应该送的哪一张网卡上的。在Linux上可以用“route add default gw <默认路由器IP>”来配置一条默认路由。

详: 路由表是用来决定如何将包从一个子网传送到另一个子网的,换局话说就是用来决定从一个网卡接收到的包应该送的哪一张网卡上的。路由表的每一行至少有目标网络号、netmask、到这个子网应该使用的网卡。当路由器从一个网卡接收到一个包时,它扫描路由表的每一行,用里面的netmask和包里的目标IP地址做并逻辑运算(&)找出目标网络号,如果此网络号和这一行里的网络号相同就将这条路由保留下来做为备用路由,如果已经有备用路由了就在这两条路由里将网络号最长的留下来,另一条丢掉,如此接着扫描下一行直到结束。如果扫描结束任没有找到任何路由,就用默认路由。确定路由后,直接将包送到对应的网卡上去。在具体的实现中,路由表可能包含更多的信息为选路由算法的细节所用。题外话:路由算法其实效率很差,而且不scalable,解决办法是使用IP 交换机,比如MPLS。
在Linux上可以用“route add default gw <默认路由器IP>”来配置一条默认路由。

6.在网络中有两台主机A和B,并通过路由器和其他交换设备连接起来,已经确认物理连接正确无误,怎么来测试这两台机器是否连通?如果不通,怎么来判断故障点?怎么排除故障?
答:测试这两台机器是否连通:从一台机器ping另一台机器
     如果ping不通,用traceroute可以确定是哪个路由器不能连通,然后再找问题是在交换设备/hup/cable等。

7.网络编程中设计并发服务器,使用多进程 与 多线程 ,请问有什么区别?
答案一:
1,进程:子进程是父进程的复制品。子进程获得父进程数据空间、堆和栈的复制品。
2,线程:相对与进程而言,线程是一个更加接近与执行体的概念,它可以与同进程的其他线程共享数据,但拥有自己的栈空间,拥有独立的执行序列。
两者都可以提高程序的并发度,提高程序运行效率和响应时间。
线程和进程在使用上各有优缺点:线程执行开销小,但不利于资源管理和保护;而进程正相反。同时,线程适合于在SMP机器上运行,而进程则可以跨机器迁移。

答案二:
根本区别就一点:用多进程每个进程有自己的地址空间(address space),线程则共享地址空间。所有其它区别都是由此而来的:
1。速度:线程产生的速度快,线程间的通讯快、切换快等,因为他们在同一个地址空间内。
2。资源利用率:线程的资源利用率比较好也是因为他们在同一个地址空间内。
3。同步问题:线程使用公共变量/内存时需要使用同步机制还是因为他们在同一个地址空间内。