C/C++日常学习总结(第九篇)三次握手&为什么加extern “C”
2014-05-07 11:34
281 查看
1.TCP/IP建立连接的过程
【解析】:大家可以参考上一篇中的socket通信中tcp连接步骤,tcp是可靠的连接协议,简单一句话就是通常说的“三次握手”;
第一次握手:建立连接时,客户端向服务端发送连接请求connect(),并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务端收到客户端的连接请求,向客户端发送允许连接应答,服务器进入SYN_RECV状态;
第三次握手:客户端收到服务端发送的允许连接应答,向服务端发送确认,此时服务端和客户端进入通讯状态,完成三次握手。
2.memset和memcpy的区别
【解析】:
(1.)memset是用来将某段内存全部设置成相同字符,一般用在对定义的字符串初始化为‘\0’;
(2.)memcpy用来内存拷贝,你可以用来拷贝任意数据类型的对象,一般要指定拷贝数据的长度。
3.在C++中调用被C编译器编译的函数,为什么要加extern "C"?
【解析】:
C++中支持函数重载,而c语言中不支持。函数在C++环境中编译后在库中的函数名与C中的函数名不同。
假设:某个函数原型为:void fon_nine(int x,int y);该函数在c语言中编译后在库中的名字是_fon_nine,而在C++编译器中得出来的在库中名字可能为_fon_nine_int_int之类的名字,C++中提供了C连接交换指定符号extern “C”来解决名字匹配的问题。
4.已知strcpy的函数原型是:char* strcpy(char* strDest,const char* strSrc);不调用库函数,实现strcpy函数。
【解析】:
实现比较简单,注意点:
(1.)判断结束条件‘\0’
(2.)char *temp;大家可以自己把代码copy下来,拿掉temp调试下,结果会不一样。
(3.)memcpy(strDest1,strSrc,strlen(strSrc));//可以自己加了试下
【解析】:大家可以参考上一篇中的socket通信中tcp连接步骤,tcp是可靠的连接协议,简单一句话就是通常说的“三次握手”;
第一次握手:建立连接时,客户端向服务端发送连接请求connect(),并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务端收到客户端的连接请求,向客户端发送允许连接应答,服务器进入SYN_RECV状态;
第三次握手:客户端收到服务端发送的允许连接应答,向服务端发送确认,此时服务端和客户端进入通讯状态,完成三次握手。
2.memset和memcpy的区别
【解析】:
(1.)memset是用来将某段内存全部设置成相同字符,一般用在对定义的字符串初始化为‘\0’;
memset(outblock,'\0',8);//outblock为char*
(2.)memcpy用来内存拷贝,你可以用来拷贝任意数据类型的对象,一般要指定拷贝数据的长度。
memcpy( PlayerInfo::Get().userSessionID, playerData.sessionid, sizeof(AGSESSIONID) );//数据类型为AGSESSIONID
3.在C++中调用被C编译器编译的函数,为什么要加extern "C"?
【解析】:
C++中支持函数重载,而c语言中不支持。函数在C++环境中编译后在库中的函数名与C中的函数名不同。
假设:某个函数原型为:void fon_nine(int x,int y);该函数在c语言中编译后在库中的名字是_fon_nine,而在C++编译器中得出来的在库中名字可能为_fon_nine_int_int之类的名字,C++中提供了C连接交换指定符号extern “C”来解决名字匹配的问题。
4.已知strcpy的函数原型是:char* strcpy(char* strDest,const char* strSrc);不调用库函数,实现strcpy函数。
char *strcpy(char* strDest,const char* strSrc) { if(NULL==strDest || NULL==strSrc) { return NULL; } if(strDest==strSrc) { return strDest; } char *temp = strDest; while((*strDest++=*strSrc++)!=‘\0’) ; return temp; }
int main() { char* strSrc="hello wandao keji"; char* strDest = new char[120]; memset(strDest,'\0',120); char* strEnd=strcpy(strDest,strSrc); cout<<"strDest="<<strDest<<endl; cout<<"strEnd="<<strEnd<<endl; system("pause"); return 0; }
【解析】:
实现比较简单,注意点:
(1.)判断结束条件‘\0’
(2.)char *temp;大家可以自己把代码copy下来,拿掉temp调试下,结果会不一样。
(3.)memcpy(strDest1,strSrc,strlen(strSrc));//可以自己加了试下
相关文章推荐
- C/C++日常学习总结(第二篇)结构体和类的大小及区别&为什么是new一个对象而不是malloc
- C/C++日常学习总结(第七篇)常引用&指针的理解
- C/C++日常学习总结(第十篇)string的实现&文件流操作
- C/C++日常学习总结(第八篇)winsock建立连接的步骤&窗口的生成
- C/C++日常学习总结(第六篇)多基派生引起的虚函数访问二义性问题&重载,覆盖,隐藏的区别
- C/C++ 日常学习总结(第二十三篇)父子进程间通信——环境变量
- C/C++ 日常学习总结(第二十二篇)共享内存实现C++
- C/C++ 日常学习总结(第十八篇)参数个数可变的函数
- C/C++日常学习总结(第十三篇)默认构造函数内部再调用带参的构造函数
- C/C++日常学习总结(第十五篇)逻辑运算符对于负数的处理
- C/C++ 日常学习总结(第二十篇)实现自己的printf函数
- C/C++日常学习总结(第十六篇)分析IA-64和IA-32位机器上同一个程序运行,前者报错,后者正常
- C/C++ 日常学习总结(第十九篇)多线程详解
- 为什么在C++里调用被C编译器编译的函数,要加extern "c"
- TCP为什么是三次握手,为什么不是两次或者四次 && TCP四次挥手
- 转[互联网面试笔试汇总C/C++-27] 为什么TCP链接要三次握手而不是两次握手-雅虎
- C++学习笔记:为什么不要重载逻辑与和逻辑或&& || 操作符
- C/C++日常学习总结(第三篇)不能重载的运算符和不同基类继承产生的二义性
- C/C++日常学习总结(第五篇)多态和虚函数的访问
- C/C++日常学习总结(第十一篇)函数指针