lantionzy

coding
posts - 10, comments - 39, trackbacks - 0, articles - 0
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

C++ Primer

     摘要: int main()
{
string str("Hello World!\n");
cout << "The size of " << str << "is " << str.size()
<< " characters, including the newline" << endl;
return 0;
}
从逻辑上来讲,size() 成员函数似乎应该返回整形数值,或是无符号整数。但事实上,size 操作返回的是 string::size_type 类型的值。
string 类类型和许多其他库类型都定义了一些配套类型(companion type)。通过这些配套类型,库类型的使用就能与机器无关(machine-independent)。size_type 就是这些配套类型中的一种。它定义为与 unsigned 型(unsigned int 或 unsigned long)具有相同的含义,而且可以保证足够大能够存储任意 string 对象的长度。为了使  阅读全文

posted @ 2009-10-22 09:10 lantionzy 阅读(12086) | 评论 (8)  编辑 |

     摘要: 本示例的基本实现过程是:客户端通过键盘输入数据,数据被发送到服务器。后者接收到数据后,需要进行判断,如果发来的数据串为“quit”,表明对方向退出聊天过程,于是服务器端也发送字符串“quit”,聊天过程终止;否则将接收到的信息和对方的IP地址进行格式化后,在屏幕上输出。同样在客户端也需要进行相应的判断和输出。
首先编写服务器端程序,实现代码如下:
#pragma comment(lib,"ws2_32.lib")
#include
#include   阅读全文

posted @ 2009-10-20 17:07 lantionzy 阅读(2556) | 评论 (12)  编辑 |

     摘要: 针对示例程序,说明几个用VC++基于TCP/UDP网络编程应注意的几个地方:
1、基于TCP和基于UDP的网络应用程序在发送和接收数据时使用的函数是不一样的:前者使用send和recv,后者使用sendto和recvfrom。
2、由于程序中使用了Winsock库中的函数,这里需要为程序链接相应的.lib文件:ws2_32.lib。
3、我们知道,Windows网络编程至少需要两个头文件:winsock2.h和windows.h,而在WinSock2.0之前还存在一个老版本的winsock.h。正是这三个头文件的包含顺序,导致了问题的出现...
  阅读全文

posted @ 2009-10-19 16:23 lantionzy 阅读(2095) | 评论 (1)  编辑 |

     摘要: 注:本系列文章适合初学网络编程的读者
对于基于UDP的服务器来说,就是一个客户端,不用建立监听或者说建立连接,直接调用recvfrom函数接收数据。注意,在编写基于UDP的网络程序时,在接收数据时,使用的是recvfrom函数。而前面基于TCP的服务器端程序接收数据时使用的是recv函数。
客户端也可以直接发送数据,这里需要调用sendto函数而不是send函数。

新建一个空的Win32 Console Application类型的工程,在其中添加实现基于UDP的服务器端程序的代码UDPSrv.cpp:  阅读全文

posted @ 2009-10-19 15:23 lantionzy 阅读(1963) | 评论 (3)  编辑 |

     摘要: 注:本系列文章适合初学网络编程的读者

网络程序的实现可以有很多方式,Windows Socket就是其中一种比较简单的方法。socket是连接应用程序与网络驱动程序的桥梁,socket在应用程序中创建,通过绑定操作与驱动程序建立关系。此后,应用程序送给socket的数据,由socket交给驱动程序向网络上发送出去。计算机从网络上收到与该socket绑定的IP地址和端口号相关的数据后,由驱动程序交给socket,应用程序便可从该socket中提取接收到的数据。
下面通过一个简单的实例来讲述基于TCP的socket编程的通信流程。其中服务器端程序实现代码TCPSrv.cpp如下:  阅读全文

posted @ 2009-10-19 14:36 lantionzy 阅读(2113) | 评论 (2)  编辑 |

     摘要: 如果应用程序的另一个实例影响到可选(非首要)功能,应用程序启动时必须:
1)检测是否有用户正在运行该应用程序。
2)阻止所有有问题的功能。
3)通知当前用户无法使用特定功能的原因。

下面给出一个实例:  阅读全文

posted @ 2009-10-15 13:59 lantionzy 阅读(2160) | 评论 (2)  编辑 |

     摘要: 一、只读算法

1、使用两个迭代器和一个值调用 find 函数,检查两个迭代器实参标记范围内的每一个元素。只要找到与给定值相等的元素,find 就会返回指向该元素的迭代器。如果没有匹配的元素,find 就返回它的第二个迭代器实参,表示查找失败。于是,只要检查该函数的返回值是否与它的第二个实参相等,就可得知元素是否找到了。
int search_value = 42;
// call find to see if that value is present
vector::const_iterator result = find(vec.begin(), vec.end(), search_value);
// report the result
cout << "The value " << search_value

<< (result == vec.end()? " is not present" : " is prese  阅读全文

posted @ 2009-10-15 09:42 lantionzy 阅读(1475) | 评论 (2)  编辑 |

     摘要: 标准库定义了三种顺序容器类型:vector、list 和 deque(双端队列“double-ended queue”)。它们的差别在于访问元素的方式,以及添加或删除元素相关操作的运行代价。

1、每种顺序容器都提供了一组有用的类型定义以及以下操作:

在容器中添加元素。

在容器中删除元素。

设置容器大小。

(如果有的话)获取容器内的第一个和最后一个元素。

2、一些关键概念和难点:

vector 对象动态增长:  阅读全文

posted @ 2009-10-15 08:19 lantionzy 阅读(1652) | 评论 (1)  编辑 |

     摘要: 类的成员函数具有一个附加的隐含形参,即指向该类对象的一个指针。这个隐含形参命名为 this,与调用成员函数的对象绑定在一起。成员函数不能定义 this 形参,而是由编译器隐含地定义。成员函数的函数体可以显式使用 this 指针,但不是必须这么做。如果对类成员的引用没有限定,编译器会将这种引用处理成通过 this 指针的引用。

尽管在成员函数内部显式引用 this 通常是不必要的,但有一种情况下必须这样做:当我们需要将一个对象作为整体引用而不是引用对象的一个成员时。最常见的情况是在这样的函数中使用 this:该函数返回对调用该函数的对象的引用。  阅读全文

posted @ 2009-10-15 08:13 lantionzy 阅读(1863) | 评论 (0)  编辑 |