网络编程面试题

1`. MainFrm,CDocumentCView类之间的关系,

MainFrm为框架类,包含应用程序外框所包含部分。CView为视图类,用于显示数据的空白区域窗口。

CDocument为文档类。

MFC提供了文档/视类结构,采用数据本身和显示分离的机制。其中文档类CDocument用于数据的存储和加载,视类CView用于数据的显示与修改

2. Dialog ModuelDialog不同用法

1)类型不同

MoudleDialog 模态对话框,属于垄断对话框,例如打开对话框,点击打开后不能再执行其他操作,会发出“嘟嘟嘟”的声音;

       非模态对话框,属于非垄断对话框,利用查找对话框,点击查找同时可以执行其他操作;

       即:非模态不垄断;模态垄断。

2)用法不同

       CDialog::Create :to create a modelessdialog box

       CDialog::DoModal :Call this member function to invoke the modal dialog box andreturn the dialog-box result when done

3. 网络编程的一般步骤

对于TCP连接:

1.服务器端1)创建套接字create;2)绑定端口号bind;3)监听连接listen;4)接受连接请求accept,并返回新的套接字;5)用新返回的套接字recv/send;6)关闭套接字。

2.客户端1)创建套接字create; 2)发起建立连接请求connect; 3)发送/接收数据send/recv;4)关闭套接字。

TCP总结:

Server端:create -- bind -- listen--  accept--  recv/send-- close

Client端:create------- conncet------send/recv------close.


对于UDP连接:

1.服务器端:1)创建套接字create;2)绑定端口号bind;3)接收/发送消息recvfrom/sendto;4)关闭套接字。

2.客户端:1)创建套接字create;2)发送/接收消息sendto/recvfrom;3)关闭套接字.

UDP总结:

Server端:create----bind ----recvfrom/sendto----close

Client端:create----  sendto/recvfrom----close.


 

4.sendMessagepostMessage区别?

不同点:sendMessage发送完毕以后需要等待处理完才返回;而postMessage发送消息后立即返回。

Do not post the WM_QUIT message using PostMessage; use thePostQuitMessage function.

postMessage将消息放置到消息队列中,不等待线程处理消息就立即返回。

sendMessage发送指定的消息到窗口,并会调用窗口过程,直到窗口过程处理完毕后才返回。

 

5. TCP的重发机制是怎么实现的?

       1.滑动窗口机制,确立收发的边界,能让发送方知道已经发送了多少(已确认)、尚未确认的字节数、尚待发送的字节数;让接收方知道(已经确认收到的字节数)。

       2.选择重传,用于对传输出错的序列进行重传。

6. TCPUDP的区别?

       1)TCP面向连接(三次握手机制),通信前需要先建立连接;UDP面向无连接,通信前不需要建立连接;

       2)TCP保障可靠传输(按序、无差错、不丢失、不重复);UDP不保障可靠传输,使用最大努力交付;

       3)TCP面向字节流的传输,UDP面向数据报的传输。

   TCP---传输控制协议,提供的是面向连接、可靠的字节流服务。当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据。TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。
UDP---用户数据报协议,是一个简单的面向数据报的运输层协议。UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快


7.进程间通信有哪些方式?

       1)共享内存,如剪贴板;

       2)匿名管道/命名管道;

       3)邮槽。

       其中共享内存、匿名管道只能实现两个进程间的通信,不能跨网络通信;命名管道和邮槽可以跨网络进程间通信;但命名管道属于点对点的通信,可传输大数据量;而邮槽一次传输的数据量非常有限,通常少于424字节。

8.TCP为什么不是两次连接?而是三次握手?

如果AB两个进程通信,如果仅是两次连接。可能出现的一种情况就是:A发送完请报文以后,由于网络情况不好,出现了网络拥塞,即B延时很长时间后收到报文,即此时A将此报文认定为失效的报文。B收到报文后,会向A发起连接。此时两次握手完毕,B会认为已经建立了连接可以通信,B会一直等到A发送的连接请求,而A对失效的报文回复自然不会处理。依次会陷入B忙等的僵局,造成资源的浪费。

9. connect方法会阻塞,请问有什么方法可以避免其长时间阻塞?

可以考虑采用异步传输机制,同步传输与异步传输的主要区别在于同步传输中,如果调用recvfrom后会一致阻塞运行,从而导致调用线程暂停运行;异步传输机制则不然,会立即返回。

8.网络编程中设计并发服务器,使用多进程多线程,请问有什么区别?

答案一:

1,进程:子进程是父进程的复制品。子进程获得父进程数据空间、堆和栈的复制品。

2,线程:相对与进程而言,线程是一个更加接近与执行体的概念,它可以与同进程的其他线程共享数据,但拥有自己的栈空间,拥有独立的执行序列。两者都可以提高程序的并发度,提高程序运行效率和响应时间。

线程和进程在使用上各有优缺点:线程执行开销小,但不利于资源管理和保护;而进程正相反。同时,线程适合于在SMP机器上运行,而进程则可以跨机器迁移。

答案二:

根本区别就一点:用多进程每个进程有自己的地址空间(address space),线程则共享地址空间。所有其它区别都是由此而来的:

1。速度:线程产生的速度快,线程间的通讯快、切换快等,因为他们在同一个地址空间内。

2。资源利用率:线程的资源利用率比较好也是因为他们在同一个地址空间内。

3。同步问题:线程使用公共变量/内存时需要使用同步机制还是因为他们在同一个地址空间内。

等等

9. 简述Windows编程容易出错的几点

       ??

10.Windows编程的知识点,如消息机制,一个自定义消息如何实现。

       自定义消息共分为3步骤:

1)  自定义消息:#defineWM_MYMSG WM_USER+1

2)  在头文件中声明函数:       afx_msg voidonMyMsg();

3) 在消息映射中添加对应关系:

//BEGIN_MESSAGE_MAP(CDefMsgDemoDlg,CDialog) //END_MESSAGE_MAP()

ON_MESSAGE(WM_MYMSG,onMyMsg)

4)定义函数void onMyMsg();

核心即:函数原型、关联消息与消息响应函数的宏、函数实现。

 

11.SNMP协议

       简单网络管理协议——应用层协议.

       包括5种数据包:Get-Request;Get-Next-Request; Set-Request, Get-Response; Trap;

12.RAW套接字

       广泛应用于高级网络编程,如SNIFFER、拒绝服务、IP欺骗都是通过原始套接字实现的。

 

13. 窗口创建的步骤:

1)设计窗口类(填充结构体)à2)注册窗口类RegisterClassà3)创建窗口;4)显示ShowWindow&更新窗口UpdateWindowà4)循环获取消息GetMessage(){翻译(转换)TranslateMessage消息、处理消息DispathMessage(将消息交付给窗口过程进行处理)}。

 

14. 当触发按钮以后发生了什么?

       1)比如点击鼠标左键后,操作系统首先会感知到该事件;2)操作系统将事件其转化为消息;3)操作系统将消息投递到对应程序(线程)的消息队列中;4)应用程序(线程)从消息队列中通过GetMessage获取消息,并通过DispathMessge将消息交付给操作系统;5)操作系统通过设计窗口类时指定的窗口过程对对消息进行处理。

 

15. 你平时是如何调试程序的?(引申)当一个程序在自己机器上运行正常,但是在其他机器上程序运行崩溃,如何查找原因?

断点调试:

值:查看变量(Variables)、表达式、内存(Memory)、寄存器(Register)的值。

进程控制:VC允许被中断的程序继续运行、单步运行和运行到指定光标处,分别对应快捷键F5F10/F11CTRL+F10

其他调试手段:系统提供一系列特殊的函数或者宏来处理Debug版本相关的信息TRACEASSERTVERIFyCtrl+B打开断点设置。

运行崩溃,如何查找原因? [提示后]可以通过打印语句来发现错误!

 

16.   线程、窗口、消息队列三者之间的关系?

MSDN上如是说:

Thethread to which the message is posted must have created a message queue,or elsethe call to PostThreadMessage fails.  

并提供了如下两种解决方法:

CallPostThreadMessage.If it fails, call the Sleep function and call PostThreadMessageagain. Repeat  until  PostThreadMessage  succeeds. 

【面试官】说:一个线程对应一个或多个窗口(创建的关系),同时一个线程对应了一个消息队列。

【总结如下】:
1.在MFC程序框架里面,CWinThread专门负责线程创建的,它可以创建用户界面线程,及工作者线程。其中用户界面线程是包含消息队列的,而工作者线程是不包含消息队列的。即【一句话】:用户界面线程对应一个消息队列。
2.CWinThread类和CWnd类都派生自CCmdTarget,而CDialog对话框类、视图类CView都派生自CWnd。
【深入浅出MFC里一句话】:不是每一个窗口都产生一个线程(因为要付出昂贵的线程切换代价)。即,深入理解之:一个线程可以对应多个窗口。主线程可以创建出其所要的全部窗口。
【结论】一个UI线程就1组消息队列集合,一个线程可以创建多个窗口。


17.流量控制和拥塞控制的实现机制

拥塞控制
网络拥塞现象是指到达通信子网中某一部分的分组数量过多,使得该部分网络来不及处理,以致引起这部分乃至整个网络性能下降的现象,严重时甚至会导致网络通信业务陷入停顿,即出现死锁现象。拥塞控制是处理网络拥塞现象的一种机制。
流量控制
数据的传送与接收过程当中很可能出现收方来不及接收的情况,这时就需要对发方进行控制,以免数据丢失。

流量控制机制:

  流量控制用于防止在端口阻塞的情况下丢帧,这种方法是当发送或接收缓冲区开始溢出时通过将阻塞信号发送回源地址实现的。流量控制可以有效的防止由于网络中瞬间的大量数据对网络带来的冲击,保证用户网络高效而稳定的运行。

18.多线程如何同步:

 在这里简单说一下linux多线程同步的方法吧(win上有一定的差别,也有一定的累似)

1:线程数据,每个线程数据创建一个键,它和这个键相关联,在各个线程里,都使用这个键来指代线程数据,但在不同的线程里,这个键代表的数据是不同的,在同一个线程里,它代表同样的数据内容。以此来达到线程安全的目的。
2:互斥锁,就是在各个线程要使用的一些公共数据之前加锁,使用之后释放锁,这个是非常常用的线程安全控制的方法,而频繁的加解锁也对效率有一定的影响。
3:条件变量,而条件变量通过允许线程阻塞和等待另一个线程发送信号的方法弥补了互斥锁的不足,它常和互斥锁一起使用。使用时,条件变量被用来阻塞一个线程,当条件不满足时,线程往往解开相应的互斥锁并等待条件发生变化。一旦其它的某个线程改变了条件变量,它将通知相应的条件变量唤醒一个或多个正被此条件变量阻塞的线程。这些线程将重新锁定互斥锁并重新测试条件是否满足。一般说来,条件变量被用来进行线程间的同步。
4:信号量,信号量本质上是一个非负的整数计数器,它被用来控制对公共资源的访问。当公共资源增加时,调用函数sem_post()增加信号量。只有当信号量值大于0时,才能使用公共资源,使用后,函数sem_wait()减少信号量。函数sem_trywait()和函数pthread_ mutex_trylock()起同样的作用,它是函数sem_wait()的非阻塞版本
另外pthread_join也可以等待一个线程的终止。

19.进程间通讯的方式有哪些,各有什么优缺点

进程间通信主要包括管道, 系统IPC(包括消息队列,信号量,共享存储), socket.

管道包括三种:1)普通管道PIPE, 通常有种限制,一是半双工,只能单向传输;二是只能在父子进程间使用. 2)流管道s_pipe: 去除了第一种限制,可以双向传输. 3)命名管道:name_pipe, 去除了第二种限制,可以在许多并不相关的进程之间进行通讯.

系统IPC的三种方式类同,都是使用了内核里的标识符来识别

管道: 优点是所有的UNIX实现都支持, 并且在最后一个访问管道的进程终止后,管道就被完全删除;缺陷是管道只允许单向传输或者用于父子进程之间

系统IPC: 优点是功能强大,能在毫不相关进程之间进行通讯; 缺陷是关键字KEY_T使用了内核标识,占用了内核资源,而且只能被显式删除,而且不能使用SOCKET的一些机制,例如select,epoll等.

socket可以跨网络通讯,其他进程间通讯的方式都不可以,只能是本机进程通讯。


20.tcp连接建立的时候3次握手的具体过程,以及其中的每一步是为什么

建立连接采用的3次握手协议,具体是指:

第一次握手是客户端connect连接到server,server accept client的请求之后,向client端发送一个消息,相当于说我都准备好了,你连接上我了,这是第二次握手,第3次握手就是client向server发送的,就是对第二次握手消息的确认。之后client和server就开始通讯了。


21.tcp断开连接的具体过程,其中每一步是为什么那么做

断开连接的4次握手,具体如下:

断开连接的一端发送close请求是第一次握手,另外一端接收到断开连接的请求之后需要对close进行确认,发送一个消息,这是第二次握手,发送了确认消息之后还要向对端发送close消息,要关闭对对端的连接,这是第3次握手,而在最初发送断开连接的一端接收到消息之后,进入到一个很重要的状态time_wait状态,这个状态也是面试官经常问道的问题,最后一次握手是最初发送断开连接的一端接收到消息之后。对消息的确认。


  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沙-粒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值