1, 使用Linux epoll模型,水平触发模式(Level-Triggered);当socket可写时,会不停的触发socket可写的事件,如何处理?
2, 从socket读数据时,socket缓存里的数据,可能超过用户缓存的长度,如何处理? 例如,socket缓存有8kB的数据,而你的缓存只有2kB空间。
3, 向socket发送数据时, 可能只发送了用户缓存里的一半,如何处理?例如,需要向socket发送8kB数据,返回值只有2kB发送成功。
4, C++的虚函数是怎么实现的?
5, C++的虚函数有什么作用?
6, 非阻塞connect()如何实现?
7,sizeof()问题
class A
{
c;
sh;
}
class B
{
c;
sh;
func1(void);
func2(void);
}
sizeof(A), sizeof(B) 分别是多少?
8, 实现字符串比较函数
*src, char * sub)
9, 实现内存拷贝函数
char * src, size_t len)
10,条件变量的如何使用? 你使用的线程函数是什么?
11, deamon进程如何实现?
12, HTTP和CGI是什么?
13, TCP的三次握手, TIME_WAIT和CLOSE_WAIT状态是什么?
因为第7题之后的属于客观题,不打算在此写答案。 朋友们如有好的答案也欢迎跟贴。
本人在此写出自己对前6个问题的回答:
1, 使用linux epoll模型,水平触发模式(Level-Triggered);当socket可写时,会不停的触发socket可写的事件,如何处理?
第一种最普通的方式:
将socket描述符移出epoll模型。
第二种方式,(是本人的改进方案, 叫做directly-write)
说明性能良好。(如果失败次数远大于成功的次数,则关闭这种直接写的操作,改用第一种方案。同时在日志里记录警告)
例如每间隔40ms左右,发送/接收3-5个 MTU(或更小,这样就没超过默认的8K系统缓存)。
例如每间隔1s左右,连续发送/接收 20个 MTU(或更多)。
回来查了资料,发现以下两种方式:
epoll_ctl( EPOLL_CTL_ADD, EPOLL_CTL_MOD)。
的 man 手册里推荐的方式, 性能最高。但如果处理不当容易出错,事件驱动停止。
第四种方式:
2, 从socket读数据时,socket缓存里的数据,可能超过用户缓存的长度,如果处理?
第一种方式:
第二种方式: 使用缓存队列,分成8K大小的队列。
除非用户解析已出错,使用数据接收、使用脱勾。 这种方式的代价是,可能需要将缓存队列再次拷贝、拼接成一块大的缓存,再进行解析。 而在本人的系统中,只需要将socket接收的数据再次原样分发给客户, 所以这种方案是最佳方案。
3, 向socket发送数据时, 可能只发送了用户缓存里的一半,然后失败,如何处理?
下一次socket写事件时, 再从偏移的位置接着发送。
看来我解释的不够清晰。。。。。。 郁闷。
4, C++的虚函数是怎么实现的?
5, C++的虚函数有什么作用?
很多人都能理解这一点。但却不会回答下面这一点。
前两天在书上刚好看到这个问题,但在面试的时候却没想起来。
6, 非阻塞connect()如何实现?