Please also note that not all chapters have been completed at this time.
Table of Contents
1 Preface |
1.1 About this Book |
1.1.1 How this book is organized |
1.1.2 Writing Voice |
1.2 Focus on Core |
1.3 Class Names |
1.4 C# and Visual Basic Users |
1.5 Book Versions |
1.5.1 Indy 10 Version |
1.5.2 Indy 9 Version |
1.6 About the Authors |
1.6.1 About Chad Z. Hower a.k.a. Kudzu |
1.6.3 About Hadi Hariri – Technical Editor |
1.7 Feedback and Discussion |
1.8 Technical Support |
1.8.1 Free Support |
1.8.1.1 Indy Newsroups |
1.8.1.2 Borland Newsgroups |
1.8.2 Commercial Priority Support |
1.8.3 SSL Support |
1.8.4 Bug Reports |
1.8.5 Winsock 2 |
1.9 Additional Information |
1.9.1 Other Resources |
1.9.2 Further Reading |
1.10 Legal |
1.10.1 Copyright |
1.10.2 Acceptable Use – Personal |
1.10.3 Acceptable Use – Corporate |
1.11 Credits |
2 Introductory Topics |
2.1 Introduction to Sockets |
2.1.1 Overview |
2.1.2 TCP/IP |
2.1.3 Client |
2.1.4 Server |
2.1.5 IP Address |
2.1.6 Port |
2.1.7 Protocol |
2.1.8 Socket |
2.1.9 Host Name |
2.1.10 DNS |
2.1.11 TCP |
2.1.12 UDP |
2.1.13 ICMP |
2.1.14 HOSTS |
2.1.15 SERVICES |
2.1.16 Localhost (Loopback) |
2.1.17 Ping |
2.1.18 TraceRoute |
2.1.19 LAN |
2.1.20 WAN |
2.1.21 IETF |
2.1.22 RFC |
2.1.23 Thread |
2.1.24 Fork |
2.1.25 Winsock |
2.1.26 Stack |
2.1.27 Network Byte Order |
2.2 Introduction to Indy |
2.2.1 The Indy Way |
2.2.2 Indy Methodology |
2.2.3 How Indy is Different |
2.2.4 Overview of Clients |
2.2.5 Overview of Servers |
2.2.6 Threading |
2.2.7 Blocking vs Non-Blocking |
2.2.7.1 Programming Models |
2.2.7.2 More Models |
2.2.7.3 Blocking |
2.2.7.4 Non-Blocking |
2.2.7.5 History of Winsock |
2.2.7.6 Blocking is not Evil |
2.2.7.7 Pros of Blocking |
2.2.7.8 Cons of Blocking |
2.2.7.9 TIdAntiFreeze |
2.2.7.10 Pros of Non-Blocking |
2.2.7.11 Cons of Non-Blocking |
2.2.7.12 Comparison |
2.2.7.13 Files vs. Sockets |
2.2.7.14 Scenario |
2.2.7.15 Blocking File Write |
2.2.7.16 Non-Blocking File Write |
2.2.7.16.1 C# |
2.2.7.16.2 Delphi |
2.2.7.17 Just Like Files |
2.2.7.18 Aysnchronous Everything |
3 TCP |
3.1 Reading and Writing |
3.1.1 Read Methods |
3.1.1.1 AllData |
3.1.1.2 Capture |
3.1.1.3 CheckForDataOnSource |
3.1.1.4 InputBuffer |
3.1.1.5 InputBufferIsEmpty |
3.1.1.6 InputBufferAsString |
3.1.1.7 InputLn |
3.1.1.8 InputBufferToStream |
3.1.1.9 Readable |
3.1.1.10 ReadBytes |
3.1.1.11 ReadCardinal |
3.1.1.12 ReadChar |
3.1.1.13 ReadInteger |
3.1.1.14 ReadLn |
3.1.1.15 ReadLnSplit |
3.1.1.16 ReadLnWait |
3.1.1.17 ReadSmallInt |
3.1.1.18 ReadStream |
3.1.1.19 ReadString |
3.1.1.20 ReadStrings |
3.1.1.21 WaitFor |
3.1.2 Read Timeouts |
3.1.3 Write Methods |
3.1.3.1 Write (Cardinal) |
3.1.3.2 Write (Integer) |
3.1.3.3 Write (SmallInt) |
3.1.3.4 Write (String) |
3.1.3.5 Write (TIdBuffer) |
3.1.3.6 Write (TIdStream) |
3.1.3.7 Write (TStrings) |
3.1.3.8 WriteBytes |
3.1.3.9 WriteFile |
3.1.3.10 WriteLn |
3.1.4 Write Buffering |
3.1.5 Work Transactions |
3.1.5.1 OnWork Events |
3.1.5.2 Managing Your Own Work Transactions |
3.1.6 Live Streaming |
3.1.6.1 TLiveStream |
3.1.6.2 HTTP Client Live Stream Demo |
3.2 Detecting Disconnects |
3.2.1 Saying Good Bye |
3.2.2 Do you really need to know? |
3.2.3 I need to know now! |
3.2.3.1 Keep Alives |
3.2.3.2 Pings |
3.2.4 EIdConnClosedGracefully |
3.2.4.1 Why Does This Exception Occur in Servers? |
3.2.4.2 Why is it an Exception? |
3.2.4.3 Is it an Error? |
3.2.4.4 When is it an Error? |
3.2.4.5 Simple Solution |
3.3 TCP Clients |
3.3.1 Basic Client |
3.3.2 Handling Exceptions |
3.3.3 Exceptions are not Errors |
3.3.4 Delphi Debugger Note |
3.3.5 TIdAntiFreeze |
3.3.6 Demo – Zip Code Client |
3.3.6.1 Zip Code Protocol |
3.3.6.2 Code Explanation |
3.4 TCP Servers |
3.4.1 Server Types |
3.4.1.1 TIdTCPServer |
3.4.1.1.1 The Role of Threads |
3.4.1.1.2 Servers on Fibers |
3.4.1.2 TIdUDPServer |
3.4.1.3 TIdSimpleServer |
3.4.2 Threaded Events |
3.4.3 TCP Server Models |
3.4.3.1 OnExecute |
3.4.3.1.1 Example |
3.4.3.2 Command Handlers |
3.4.3.2.1 Example |
3.4.4 Thread Schedulers |
3.4.4.1 Thread Pooling |
3.4.4.2 Included Thread Schedulers |
3.4.4.2.1 TIdSchedulerOfThreadDefault |
3.4.4.2.2 TIdSchedulerOfThreadPool |
3.4.5 Zip Code Server |
3.4.5.1 OnExecute Implementation |
3.4.5.2 Support Code |
3.4.5.3 OnConnect |
3.4.5.4 OnExecute |
3.4.5.4.1 Code – C# |
3.4.5.4.2 Code – Delphi |
3.4.5.4.3 Discussion |
3.4.6 Command Handlers |
3.4.6.1 Implementation |
3.4.6.2 Example Protocol |
3.4.6.3 Base Demo |
3.4.6.4 Creating a Command Handler |
3.4.6.5 Command Handler Support |
3.4.6.5.1 Greeting |
3.4.6.5.2 ReplyExceptionCode |
3.4.6.5.3 ReplyUnknown |
3.4.6.5.4 Other Properties |
3.4.6.6 Testing the New Command |
3.4.6.7 Implementing HELP |
3.4.6.8 Automated HELP |
3.4.6.9 Implementing DATETIME |
3.4.6.10 Conclusion |
4 UDP |
4.1 Note |
4.2 Reliability |
4.3 Broadcasts |
4.4 Packet Sizes |
4.5 Confirmations |
4.5.1 Overview |
4.5.2 Acknowledgements |
4.5.3 Sequencing |
4.6 TIdUDPClient |
4.7 TIdUDPServer |
4.8 UDP Example – RBSOD |
4.8.1 Overview |
4.8.2 Usage |
4.8.3 Client |
4.8.4 Server |
5 SMTP Protocol |
5.1 What is SMTP? |
5.2 How does SMTP work? |
5.3 Indy SMTP Support |
5.4 TIdSMTP |
5.5 TIdMessage |
5.6 Constructing the Message |
5.7 Sending the Message |
5.8 QuickSend |
5.9 Send Mail Demo |
5.10 More Information |
6 POP3 Protocol |
6.1 Basic Overview |
6.2 POP3, the Deviant |
6.2.1 How does POP3 differ? |
6.3 Transactional |
6.4 Connection Lifetime |
6.5 Listing of Messages |
6.6 Identifying Messages |
6.7 Indy POP3 Client |
6.8 Demo – POP3 Tool |
6.8.1 Usage |
6.8.2 Listing Messages |
6.8.3 Deleting Messages |
6.8.4 Retrieving Messages |
6.8.4.1 Header |
6.8.4.2 Raw |
6.9 Demo – Simple retrieval in C# |
6.9.1 Running the Demo |
6.9.2 Output |
6.10 More Information |
7 HTTP Protocol |
7.1 The Firewall Friendly Protocol |
7.2 Demo – Minimal Web Server |
7.3 Demo – Eliza Web |
7.3.1 TEliza |
7.3.2 Building Eliza Web |
7.3.3 State Management |
7.3.4 Running Eliza Web |
7.4 More Information |
8 Implementing Protocols |
8.1 Protocol Terminology |
8.1.1 Conversational |
8.1.2 Plain Text |
8.1.3 Command |
8.1.4 Reply |
8.1.5 Response |
8.2 RFC Definitions |
8.2.1 RFC Status Codes |
8.2.1.1 Examples |
8.2.2 RFC Reply |
8.2.3 RFC Response |
8.2.4 RFC Transactions |
8.3 TIdRFCReply |
8.4 ReplyTexts |
8.5 The Chicken or the Egg? |
8.6 Defining a Custom Protocol |
8.7 Peer Simulation |
8.8 Zip Code Protocol |
8.8.1 Help |
8.8.2 Lookup |
8.8.3 Quit |
9 Debugging |
9.1 Logging |
9.2 Peer Simulation |
9.3 Record and Replay |
10 Proxies |
10.1 Transparent Proxies |
10.1.1 IP Masquerading / Network Address Translation (NAT) |
10.1.2 Mapped Ports / Tunnels |
10.1.3 FTP User@Site Proxy |
10.2 Non Transparent Proxies |
10.2.1 SOCKS |
10.2.2 HTTP (CERN) |
11 IOHandler Classes |
11.1 IOHandler Class |
11.1.1 IOHandlerSocket |
11.1.1.1 IOHandlerStack |
11.1.1.1.1 SSLIOHandlerSocketBase |
11.1.1.1.1.1 SSLIOHandlerSocketOpenSSL |
11.1.1.2 IOHandlerChain |
11.1.2 IOHandlerStream |
12 Intercept Classes |
12.1 Intercepts |
12.2 Logging |
12.3 Demo – Throttler |
12.3.1 Special Notes |
12.3.1.1 Exceptions May Occur |
12.3.1.2 Clear the Cache |
12.3.1.3 Non Aliased Host |
12.3.2 Running the Demo |
13 Encryption |
13.1 SSL – Secure Sockets |
13.1.1 Export Restrictions |
13.1.2 Secure HTTP / HTTPS |
13.1.3 Clients |
13.1.4 Servers |
13.1.5 Converting Certificates to PEM Format |
13.1.5.1 Exporting the Certificate |
13.1.5.2 Convert .pfx to .pem |
13.1.5.3 Splitting the .pem File |
13.1.5.4 Key.pem |
13.1.5.5 Cert.pem |
13.1.5.6 Root.pem |
13.1.6 SSL Buddy |
13.1.6.1 Generating Certificate Requests |
13.1.6.2 Generating Self-Signed Certificates |
13.1.6.3 Preparing Indy/IntraWeb Certificates |
13.1.6.4 Extracting a Root Certificate |
13.1.6.5 Installing Certificates |
13.1.6.6 Obtaining SSL Buddy |
14 Using C# and Visual Basic |
14.1 Why Delphi? |
14.2 What are TStream and IndyStrings? |
14.2.1 Conversion – C# |
14.2.2 Conversion – Visual Basic |
14.3 .NET differences |
14.4 What is the TId prefix for? |
14.5 Examples |
15 Indy 10 Overview |
15.1 Indy 10 Status |
15.2 Installing Concurrent Versions |
15.3 Compatibility |
15.4 Migration |
15.5 Major Changes and Additions |
15.5.1 .NET Support |
15.5.2 Separation of Packages |
15.5.3 IOHandler Restructuring |
15.5.3.1 Method Signatures |
15.5.4 TCP Server |
15.5.4.1 Server Split |
15.5.4.2 DFM Breakage |
15.5.4.3 Raw Reads and Writes |
15.5.4.4 New Event Sigature |
15.5.4.5 Contexts |
15.5.4.6 Schedulers |
15.5.5 SSL |
15.5.5.1 SSL Core |
15.5.5.2 SSL Protocols |
15.5.6 SASL |
15.5.7 FTP |
15.5.7.1 FTP Client |
15.5.7.2 FTP Server |
15.5.7.3 FTP List Parsing |
15.5.8 Super Core |
15.5.8.1 Network Interfaces |
15.5.8.2 Fibers |
15.5.8.3 Schedulers |
15.5.8.4 Work Queues |
15.5.8.5 Chains |
15.5.8.6 Chain Engines |
15.5.8.7 SuperCore Revealed |
15.5.9 Other |
15.6 Sample Conversions |
15.6.1 SendMail |
15.6.2 TCP Server |
16 Threading |
16.1 Concurrency |
16.1.1 Terminology |
16.1.1.1 Concurrency |
16.1.1.2 Contention |
16.1.1.3 Resource Protection |
16.1.2 Resolving Contention |
16.1.2.1 Read Only |
16.1.2.2 Atomic Operations |
16.1.2.3 Operating System Support |
16.1.2.4 Explicit Protection |
16.1.2.4.1 Critical Sections |
16.1.2.4.1.1 Win32 API Critical Sections |
16.1.2.4.1.2 Delphi 4 Standard Users |
16.1.2.4.2 TMultiReadExclusiveWriteSynchronizer (TMREWS) |
16.1.2.4.2.1 Delphi 4 and 5 |
16.1.2.4.2.2 Delphi 6 |
16.1.2.4.2.3 Kylix |
16.1.2.4.3 Choosing Between Critical Sections and TMREWS |
16.1.2.4.4 Mutexes |
16.1.2.4.5 Semaphores |
16.1.2.4.6 Events |
16.1.2.5 Thread Safe Classes |
16.1.2.6 Compartmentalization |
16.2 Threads |
16.2.1 What is a Thread? |
16.2.2 Threading Advantages |
16.2.2.1 Prioritization |
16.2.2.2 Encapselation |
16.2.2.3 Security |
16.2.2.4 Multiple Processors |
16.2.2.5 No Serialization |
16.2.3 Processes vs. Threads |
16.2.4 Threads vs. Processes |
16.2.5 Hundreds of Threads |
16.2.5.1 Realistic Thread Limits |
16.2.6 Threadable and ThreadSafe |
16.2.6.1 Threadable |
16.2.6.2 Threadsafe |
16.2.7 VCL Support |
16.2.7.1 TThread |
16.2.7.2 TThreadList |
16.2.7.3 Thread Variables |
16.2.7.4 Synchronization |
16.2.8 Indy Support |
16.2.8.1 TIdThread |
16.2.8.1.1 Thread Names |
16.2.8.2 TIdThreadComponent |
16.2.8.3 TIdSync |
16.2.8.4 TIdNotify |
16.2.8.5 TIdThreadSafe |
16.2.9 Common Problems |
16.3 Eliminating Bottlenecks |
16.3.1 Common Bottleneck Causes |
16.3.1.1 Critical Section Implementation |
16.3.1.2 TMREWS |
16.3.1.2.1 Performance Comparison |
16.3.1.3 Syncrhonizations |
16.3.1.4 User Interface Updates |
16.4 Fibers |
17 Bonus Materials |
17.1 Miscellany |
17.1.1 Piracy and Unconventional Wisdom |
17.1.1.1 Introduction |
17.1.1.2 Show Me the Money |
17.1.1.3 Ghost Sales |
17.1.1.4 Cat and Mouse |
17.1.1.5 A Little Piracy Can Be Good Now and Then |
17.1.1.6 Financial Incentives |
17.1.1.7 Your Software Will *NEVER* be Pirate Proof |
17.1.1.8 Impact to YOUR Customers |
17.1.1.9 Draconian Solutions |
17.1.1.10 Creating Pirates |
17.1.1.11 Example 1: Microsoft |
17.1.1.12 Example 2: Record Companies |
17.1.1.13 Release Often |
17.1.1.14 Sell Benefits They Cannot Pirate |
17.1.1.15 Make it Cheaper to Buy |
17.1.1.16 Defend, Don’t Attack |
17.1.1.17 Be Up Front |
17.1.1.18 Goals of Piracy Prevention |
17.1.1.19 DO’s of Piracy Protection |
17.1.2 Biological Studies as the Basis of Encryption |
17.1.3 Outsourcing and Dead Presidents |
17.1.4 Developers are from Mars, Managers are from Venus |
17.1.4.1 A Developer Says |
17.1.4.1.1 I refactored it |
17.1.4.1.2 Its an elegant implementation |
17.1.4.1.3 I saved 2 bytes |
17.1.4.1.4 It doesn’t need testing |
17.1.4.1.5 It dosen’t need comments |
17.1.4.1.6 I reused some code |
17.1.4.1.7 Oops…. Never mind |
17.1.4.1.8 Its not a bug, its a documentation issue |
17.1.4.1.9 We need some more time |
17.1.4.2 A Manager Says |
17.1.4.2.1 I just read about x. I want the whole team to use x. |
17.1.4.2.2 Just ship it. |
17.1.4.2.3 I don’t need it “good”, I need it fast |
17.1.4.2.4 If it will take you 4 weeks, 4 of you can do it in a week, right? |
17.1.4.2.5 Can you make a use case diagram? |
17.1.4.2.6 Will this affect the critical path? |
17.1.6 What is important in life? Are C++ developers human? |
17.2 Delphi |
17.2.1 Why Delphi for .NET? |
17.2.2 Porting Delphi applications to Delphi for the .NET framework |
17.2.2.1 Special Note |
17.2.2.2 Terms |
17.2.2.2.1 CIL |
17.2.2.2.2 CLR |
17.2.2.2.3 CTS |
17.2.2.2.4 CLS |
17.2.2.2.5 Managed Code |
17.2.2.2.6 Unmanaged Code |
17.2.2.2.7 Assembly |
17.2.2.3 Compilers / IDE’s |
17.2.2.3.1 DCCIL (Diesel) |
17.2.2.3.1.1 Beta |
17.2.2.3.2 Delphi 8 |
17.2.2.3.3 SideWinder |
17.2.2.3.4 Galileo |
17.2.2.4 Frameworks |
17.2.2.4.1 .Net Framework |
17.2.2.4.2 WinForms |
17.2.2.4.3 RTL |
17.2.2.4.4 CLX |
17.2.2.4.5 VCL for .Net |
17.2.2.4.6 WinForms or VCL for .Net? |
17.2.2.5 Additions |
17.2.2.5.1 Mapping to CTS |
17.2.2.5.2 Namespaces |
17.2.2.5.3 Nested Types |
17.2.2.5.4 Custom Attributes |
17.2.2.5.5 Other |
17.2.2.6 Restrictions |
17.2.2.6.1 Unsafe Items |
17.2.2.6.1.1 Unsafe Types |
17.2.2.6.1.2 Unsafe Code |
17.2.2.6.1.3 Unsafe Casts |
17.2.2.6.2 Deprecated Functionality |
17.2.2.7 Changes |
17.2.2.7.1 Destruction |
17.2.2.7.1.1 Deterministic Destruction |
17.2.2.7.1.2 Non-Deterministic Destruction |
17.2.2.7.2 Garbage Collection |
17.2.2.8 Porting Steps |
17.2.2.8.1 Remove Unsafe Warnings |
17.2.2.8.2 Unit Namespaces |
17.2.2.8.3 Convert DFM’s |
17.2.2.8.4 Convert Project File |
17.2.2.8.5 Resolve Class Differences |
17.2.2.8.6 Add Luck |
17.2.2.9 Credits |
17.2.3 Developing single source Delphi – Win32, .NET, and Linux |
17.2.3.1 Delphi 9 |
17.2.3.2 How? |
17.2.3.3 Cross Platform |
17.2.3.4 Platform Specific Features |
17.2.3.5 Pure Code |
17.2.3.5.1 Managed Code |
17.2.3.5.2 Safe Code |
17.2.3.5.3 P/Invoke Free |
17.2.3.6 Delphi |
17.2.3.6.1 Delphi 7 |
17.2.3.6.2 Delphi Magic |
17.2.3.6.3 P/Invoke Usage |
17.2.3.6.3.1 SysUtils Patch |
17.2.3.6.4 Unsafe Code |
17.2.3.7 .NET Common Error |
17.2.3.7.1 Object reference not set to something or other |
17.2.3.7.2 Object is not ready yet (XP style) |
17.2.3.7.3 It’s a .NET AV |
17.2.3.8 .NET – Things remembered |
17.2.3.8.1 Pointers |
17.2.3.8.2 Buffers (Untyped Variables) |
17.2.3.8.3 Win32 |
17.2.3.8.4 Globals |
17.2.3.8.4.1 Delphi Globals |
17.2.3.8.5 Sets |
17.2.3.9 Things Different |
17.2.3.9.1 Strings |
17.2.3.9.1.1 Immutable |
17.2.3.9.1.2 Empty String |
17.2.3.9.1.3 String Help |
17.2.3.9.1.3.1 StringBuilder |
17.2.3.9.1.3.2 AnsiString |
17.2.3.9.1.3.3 TIdBuffer |
17.2.3.9.2 TList / TStrings |
17.2.3.9.3 Initialization and Finalization |
17.2.3.9.3.1 Initialization |
17.2.3.9.3.2 Finalization |
17.2.3.9.4 Units |
17.2.3.9.5 TStream |
17.2.3.9.5.1 TStream – Win32 |
17.2.3.9.5.2 TStream – .NET |
17.2.3.9.5.3 TStream – Example |
17.2.3.9.5.4 TStream Problems |
17.2.3.9.6 Variants |
17.2.3.9.7 Typecasts |
17.2.3.9.8 Constructors and Destructors |
17.2.3.10 New Friends |
17.2.3.10.1 StringBuilder |
17.2.3.10.2 FCL |
17.2.3.10.3 Byte Arrays |
17.2.3.10.4 Unicode |
17.2.3.10.5 True Language Interoperability |
17.2.3.11 Handling Platform Differences |
17.2.3.11.1 Example |
17.2.3.11.2 Isolated Units |
17.2.3.11.3 Polymorphs |
17.2.3.11.4 Indy |
17.3 Design |
17.3.1 Short Circuits or Faulty Circuits? |
17.3.2 Database Design and Modelling for Developers |
17.3.2.1 Concepts |
17.3.2.1.1 Unique Key |
17.3.2.1.2 Primary Key |
17.3.2.1.3 Foreign Key |
17.3.2.1.4 Surrogate Key (a.k.a. Non Decomposable) |
17.3.2.1.5 Intelligent Key (a.k.a. Decomposable Key) |
17.3.2.1.6 Referential Integrity (RI) |
17.3.2.2 Ground Rules |
17.3.2.3 Database Design |
17.3.2.3.1 Naming |
17.3.2.3.1.1 Avoid Abbreviations |
17.3.2.3.1.2 Do Not Use Spaces |
17.3.2.3.1.3 Use Underscores |
17.3.2.3.1.4 Use ID and Code Suffixes |
17.3.2.3.1.4.1 Example |
17.3.2.3.1.5 Name Followed by a Modifier |
17.3.2.3.1.6 Liven Your Booleans |
17.3.2.3.1.7 Define Your Booleans |
17.3.2.3.1.7.1 Example Problem 1 |
17.3.2.3.1.7.2 Example Problem 2 |
17.3.2.3.1.8 Do Not Use Column Names That Match Parent Table Names |
17.3.2.3.1.9 Link Tables |
17.3.2.3.2 Tables |
17.3.2.3.2.1 Make Table Names Singular |
17.3.2.3.2.2 Use Referential Integrity |
17.3.2.3.2.3 A Database with a View |
17.3.2.3.2.4 Denormalization / Normalization |
17.3.2.3.2.5 Primary Keys |
17.3.2.3.2.5.1 Simple Keys |
17.3.2.3.2.5.2 Avoid Compound Keys |
17.3.2.3.2.5.3 Unique Names |
17.3.2.3.2.5.4 Foreign Keys |
17.3.2.3.2.5.5 Auto Generation |
17.3.2.3.2.5.6 Get High |
17.3.2.4 Happy Users |
17.3.2.4.1 Pause and Review |
17.3.2.4.2 Exercise |
17.3.3 Dude, Where’s my business logic? |
17.3.3.1 Introduction |
17.3.3.2 About this Article |
17.3.3.3 Goal |
17.3.3.4 Terms |
17.3.3.4.1 Tier |
17.3.3.4.2 Layer |
17.3.3.5 Evolution of a Problem |
17.3.3.5.1 Desktop |
17.3.3.5.2 Client Server |
17.3.3.5.3 3 – Tier |
17.3.3.6 What is Business Logic? |
17.3.3.6.1 Delete Customer |
17.3.3.6.2 Formatting |
17.3.3.6.3 Exceptions |
17.3.3.7 Systems Today |
17.3.3.7.1 Client Server |
17.3.3.7.2 N-Tier |
17.3.3.7.2.1 Scenario 1 |
17.3.3.7.2.2 Scenario 2 |
17.3.3.7.3 Consolidation |
17.3.3.8 Moving to the Middle Tier |
17.3.3.8.1 Slippery Slope |
17.3.3.8.2 Cheaper |
17.3.3.8.3 Easier |
17.3.3.8.4 Topology |
17.3.3.8.5 Grow the Middle |
17.3.3.8.6 Bottleneck |
17.3.3.9 Obstacles |
17.3.3.9.1 Habits |
17.3.3.9.2 Procedures |
17.3.3.9.3 Database Administrators |
17.3.3.9.4 Tools |
17.3.3.10 Solutions |
17.3.3.10.1 Architect Policing |
17.3.3.10.2 DA Education |
17.3.3.10.3 Management Education |
17.3.3.11 Further Reading |
17.3.3.12 Conclusion |
17.3.5 Tier Pressure and Isolationism |
17.3.5.1 Physical Tiers |
17.3.5.2 Tiers of Layers |
17.3.5.3 Logical Limbo |
17.3.5.4 Patterns |
17.3.5.4.1 Storage Layer Driven Pattern |
17.3.5.4.2 Presentation Layer Driven Pattern |
17.3.5.4.3 Isolation Driven Pattern |
17.3.5.4.4 Comparison |
17.3.5.5 Partitioned Roles |
17.3.5.5.1 Role Roaming |
17.3.5.5.2 Small Teams |
17.3.5.5.3 Tiny Teams and Lone Developers |
17.4 Databases |
17.4.1 Easier Database Transactions – Extending the Using Statement to Perform Automatic Database Transactions |
17.4.2 Extending C# to Support SQL Syntax at Compile Time |
17.4.2.1 Introduction |
17.4.2.2 C Omega |
17.4.2.3 Future Articles |
17.4.2.4 Neither Meat nor Fish |
17.4.2.5 Extreme Databases |
17.4.2.6 One Language |
17.4.2.7 Views |
17.4.2.7.1 View Types |
17.4.2.7.1.1 Tables / Views |
17.4.2.7.1.2 Stored Procedures |
17.4.2.7.1.3 Queries |
17.4.2.7.2 Generation |
17.4.2.8 Examples |
17.4.2.8.1 Database |
17.4.2.8.2 Code Samples |
17.4.2.8.2.1 Reading from a View |
17.4.2.8.2.1.1 Manual Read |
17.4.2.8.2.2 Accessing Columns |
17.4.2.8.2.2.1 Null |
17.4.2.8.2.3 Inserting a Row |
17.4.2.8.2.4 Updating a Row |
17.4.2.8.2.5 Filtering Data |
17.4.2.8.2.6 Other Operations |
17.4.2.9 DataBindings |
17.4.2.10 Supported Databases |
17.4.2.11 Implementation Notes |
17.4.2.11.1 Roots |
17.4.2.11.2 .NET 2.0 |
17.4.2.11.3 C# |
17.4.2.12 Open Source |
17.5 Mobile Agents |
17.5.1 Mobile Agents – Software on the Move |
17.5.2 Origins |
17.5.3 Focus on Mobility |
17.5.4 Remoting versus Mobile Agents |
17.5.5 No Single Solution |
17.5.6 No Client, no Server |
17.5.7 Items not Covered |
17.5.8 Advantages |
17.5.8.1 Single Code Base |
17.5.8.2 No Interprocess Communication |
17.5.8.3 No Deployment |
17.5.8.4 Easily Modified |
17.5.9 Disadvantages |
17.5.9.1 Bandwidth |
17.5.10 Concepts and Terms |
17.5.10.1 Tarakan |
17.5.10.2 Host |
17.5.10.3 Spawn |
17.5.10.4 Home |
17.5.10.5 Gateway |
17.5.11 Security using Gateways |
17.5.12 Examples |
17.5.12.1 Data Collection |
17.5.12.1.1 Scenario |
17.5.12.1.1.1 Traditional |
17.5.12.1.1.2 Implementation |
17.5.12.2 Data Collection – Larger Data |
17.5.12.2.1 Scenario |
17.5.12.2.1.1 Implementation |
17.5.12.3 Network Mapping |
17.5.12.3.1 Scenario |
17.5.12.3.1.1 Implementation |
17.5.12.4 Searching |
17.5.12.4.1 Scenario |
17.5.12.4.1.1 Implementation |
17.5.12.5 Finding Resources to Complete Task |
17.5.12.5.1 Scenario |
17.5.12.5.1.1 Implementation |
17.5.12.6 Distributed Processing |
17.5.12.6.1 Scenario |
17.5.12.7 Disconnected Processing |
17.5.12.7.1 Scenario |
17.5.12.7.1.1 Traditional |
17.5.12.8 Pushing |
17.5.12.8.1 Scenario |
17.5.12.9 Hold and Store |
17.5.12.9.1 Scenario 1 |
17.5.12.9.2 Scenario 2 |
17.5.12.10 Move from User to User |
17.5.12.10.1 Scenario |
17.5.12.10.1.1 Traditional |
17.5.12.10.1.2 Implementation |
17.5.12.11 Business Logic |
17.6 .NET |
17.6.1 Why .NET? |
17.6.1.1 Like it or not, .NET is coming |
17.6.1.2 Pure Code |
17.6.1.2.1 Managed Code |
17.6.1.2.2 Safe Code |
17.6.1.2.3 P/Invoke Free |
17.6.1.3 Reasons for .NET |
17.6.1.3.1 “It’s big, and it’s Microsoft.” |
17.6.1.3.2 Platform Potential |
17.6.1.3.3 Standardized, Rich Class Libraries |
17.6.1.3.4 The Future is Faster |
17.6.1.3.4.1 Future Exception |
17.6.1.3.5 Language Nuetral |
17.6.1.3.5.1 Improved Visual Basic |
17.6.1.3.5.2 Modernized C++ |
17.6.1.3.5.3 Delphi |
17.6.1.3.6 Saying good-bye, and good riddance |
17.6.1.3.6.1 Fewer Crashes |
17.6.1.3.6.2 Memory Corruption |
17.6.1.3.6.3 Access Violations |
17.6.1.3.6.4 Code Misjumps |
17.6.1.4 Debunking Myths |
17.6.1.4.1 .NET has a Big Runtime. |
17.6.1.4.2 .NET is Slow. |
17.6.1.4.3 But I ported my application and it’s 100 times slower! |
17.6.1.4.4 Loss of Control |
17.6.1.4.5 .NET is Interpreted |
17.6.1.5 Obstacles |
17.6.1.5.1 C++ |
17.6.1.5.2 C# |
17.6.1.5.3 Visual Basic |
17.6.1.5.4 Existing Code |
17.6.1.6 Java |
17.6.1.6.1 Why not Java? |
17.6.1.6.2 Java’s Future |
17.6.1.7 The Future of .NET |
17.6.1.7.1 Mainframes |
17.6.1.7.2 Servers |
17.6.1.7.3 Linux |
17.6.1.7.4 Windows |
17.6.1.8 Re-education |
17.6.1.9 Summary |
17.6.2 Storing Application Options and User Preferences in .NET |
17.6.2.1 Why not INI, Registry or XML? |
17.6.2.1.1 INI Files |
17.6.2.1.2 Registry |
17.6.2.1.3 Application.config |
17.6.2.1.4 System.XML |
17.6.2.2 What to use instead? |
17.6.2.3 Typed Datasets |
17.6.2.4 Simple Demo |
17.6.2.5 Conclusion |
17.6.3 For C# – For and For More |
17.6.3.1 Code |
17.6.4 Displaying and Working with Forms |
17.6.4.1 Non Modal |
17.6.4.1.1 Pattern |
17.6.4.1.2 Disposal |
17.6.4.2 Modal |
17.6.4.2.1 Pattern |
17.6.4.2.2 Disposal |
17.6.4.2.3 Returning a Result |
17.6.4.3 Passing Data |
17.6.4.4 Static Show |
17.6.4.5 Keeping a Reference |
17.6.5 Obtaining Current DataTable Row for a DataGrid |
17.6.5.1 Introduction |
17.6.5.2 Code |
17.6.5.3 Position |
17.6.5.4 Shortcutting |
17.6.6 Dynamically Loading Assemblies |
(C) Atozed Software