Click here to Skip to main content
15,894,343 members
Articles / Programming Languages / C

A Generic C-Language TCP Client Application

Rate me:
Please Sign up or sign in to vote.
3.67/5 (2 votes)
9 May 2010CPOL4 min read 29.1K   793   20  
A library for writing simple TCP client applications
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<title>TcpClient2: util/Thread.h Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="doxygen.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<!-- Generated by Doxygen 1.6.3 -->
<div class="navigation" id="top">
  <div class="tabs">
    <ul>
      <li><a href="main.html"><span>Main&nbsp;Page</span></a></li>
      <li><a href="annotated.html"><span>Classes</span></a></li>
      <li class="current"><a href="files.html"><span>Files</span></a></li>
    </ul>
  </div>
  <div class="tabs">
    <ul>
      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
    </ul>
  </div>
<h1>util/Thread.h</h1><a href="Thread_8h.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/// @source      Thread.h</span>
<a name="l00002"></a>00002 <span class="comment"></span><span class="comment">/// @description Public interface for class Thread.</span>
<a name="l00003"></a>00003 <span class="comment"></span><span class="comment">//  See licensing information in the file README.TXT.</span>
<a name="l00004"></a>00004 
<a name="l00005"></a>00005 <span class="comment">// -----------------------------------------------------------------------------</span>
<a name="l00006"></a>00006 <span class="preprocessor">#ifndef __THREAD_H__</span>
<a name="l00007"></a>00007 <span class="preprocessor"></span><span class="preprocessor">#define __THREAD_H__</span>
<a name="l00008"></a>00008 <span class="preprocessor"></span><span class="comment">// -----------------------------------------------------------------------------</span>
<a name="l00009"></a>00009 
<a name="l00010"></a>00010 <span class="preprocessor">#if PLATFORM(Windows)</span>
<a name="l00011"></a>00011 <span class="preprocessor"></span><span class="preprocessor">#include &lt;windows.h&gt;</span>
<a name="l00012"></a>00012 <span class="preprocessor">#endif</span>
<a name="l00013"></a>00013 <span class="preprocessor"></span>
<a name="l00014"></a>00014 <span class="preprocessor">#if PLATFORM(Linux)</span>
<a name="l00015"></a>00015 <span class="preprocessor"></span><span class="preprocessor">#include &lt;pthread.h&gt;</span>
<a name="l00016"></a>00016 <span class="preprocessor">#include &lt;unistd.h&gt;</span> <span class="comment">// for convenience (provides sleep)</span>
<a name="l00017"></a>00017 <span class="preprocessor">#endif</span>
<a name="l00018"></a>00018 <span class="preprocessor"></span>
<a name="l00019"></a>00019 <span class="comment">// -----------------------------------------------------------------------------</span>
<a name="l00020"></a>00020 <span class="preprocessor">#ifdef __cplusplus</span>
<a name="l00021"></a>00021 <span class="preprocessor"></span><span class="keyword">extern</span> <span class="stringliteral">&quot;C&quot;</span> {
<a name="l00022"></a>00022 <span class="preprocessor">#endif</span>
<a name="l00023"></a>00023 <span class="preprocessor"></span><span class="comment">// -----------------------------------------------------------------------------</span>
<a name="l00024"></a>00024 
<a name="l00025"></a>00025 <span class="comment">// Linux-specific declarations</span>
<a name="l00026"></a>00026 <span class="preprocessor">#if PLATFORM(Linux)</span>
<a name="l00027"></a>00027 <span class="preprocessor"></span><span class="comment"></span>
<a name="l00028"></a>00028 <span class="comment">/// Return type of the main function of a thread.</span>
<a name="l00029"></a>00029 <span class="comment"></span><span class="keyword">typedef</span> <span class="keywordtype">void</span>* THREAD_RESULT;
<a name="l00030"></a>00030 <span class="comment"></span>
<a name="l00031"></a>00031 <span class="comment">/// Calling convention for the main function of a thread.</span>
<a name="l00032"></a>00032 <span class="comment"></span><span class="preprocessor">#define __THREAD__ </span><span class="comment">/* nothing! */</span>
<a name="l00033"></a>00033 <span class="comment"></span>
<a name="l00034"></a>00034 <span class="comment">/// Type of the main function of a thread main.</span>
<a name="l00035"></a>00035 <span class="comment"></span><span class="keyword">typedef</span> THREAD_RESULT ( __THREAD__ *ThreadFunc)(<span class="keywordtype">void</span>*);
<a name="l00036"></a>00036 <span class="preprocessor">#define threadfunc THREAD_RESULT  __THREAD__</span>
<a name="l00037"></a>00037 <span class="preprocessor"></span><span class="comment"></span>
<a name="l00038"></a>00038 <span class="comment">/// Identification of the current thread.</span>
<a name="l00039"></a>00039 <span class="comment"></span><span class="preprocessor">#define currentThreadID pthread_self()</span>
<a name="l00040"></a>00040 <span class="preprocessor"></span>
<a name="l00041"></a>00041 <span class="preprocessor">#define currentProcessID()  ((uint)getpid())</span>
<a name="l00042"></a>00042 <span class="preprocessor"></span>
<a name="l00043"></a>00043 <span class="preprocessor">#endif // PLATFORM(Linux)</span>
<a name="l00044"></a>00044 <span class="preprocessor"></span>
<a name="l00045"></a>00045 <span class="comment">// -----------------------------------------------------------------------------</span>
<a name="l00046"></a>00046 
<a name="l00047"></a>00047 <span class="comment">// Windows-specific declarations</span>
<a name="l00048"></a>00048 <span class="preprocessor">#if PLATFORM(Windows)</span>
<a name="l00049"></a>00049 <span class="preprocessor"></span>
<a name="l00050"></a>00050 <span class="comment">// *** when using CreateThread</span>
<a name="l00051"></a>00051 <span class="comment">// *** /// Return type of the main function of a thread.</span>
<a name="l00052"></a>00052 <span class="comment">// *** typedef DWORD THREAD_RESULT;</span>
<a name="l00053"></a>00053 
<a name="l00054"></a>00054 <span class="comment">// when using _beginthreadex</span><span class="comment"></span>
<a name="l00055"></a>00055 <span class="comment">/// Return type of the main function of a thread.</span>
<a name="l00056"></a>00056 <span class="comment"></span><span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> THREAD_RESULT;
<a name="l00057"></a>00057 
<a name="l00058"></a>00058 <span class="comment">// *** when using CreateThread</span>
<a name="l00059"></a>00059 <span class="comment">// *** /// Calling convention for the main function of a thread.</span>
<a name="l00060"></a>00060 <span class="comment">// *** #define __THREAD__ WINAPI</span>
<a name="l00061"></a>00061 
<a name="l00062"></a>00062 <span class="comment">// when using _beginthreadex (in fact, WINAPI and __stdcall are identical!)</span><span class="comment"></span>
<a name="l00063"></a>00063 <span class="comment">/// Calling convention for the main function of a thread.</span>
<a name="l00064"></a>00064 <span class="comment"></span><span class="preprocessor">#define __THREAD__ __stdcall</span>
<a name="l00065"></a>00065 <span class="preprocessor"></span><span class="comment"></span>
<a name="l00066"></a>00066 <span class="comment">/// Type of the main function of a thread.</span>
<a name="l00067"></a>00067 <span class="comment"></span><span class="keyword">typedef</span> THREAD_RESULT ( __THREAD__ *ThreadFunc)(<span class="keywordtype">void</span>*);
<a name="l00068"></a>00068 <span class="preprocessor">#define threadfunc THREAD_RESULT  __THREAD__</span>
<a name="l00069"></a>00069 <span class="preprocessor"></span><span class="comment"></span>
<a name="l00070"></a>00070 <span class="comment">/// Identification of the current thread.</span>
<a name="l00071"></a>00071 <span class="comment"></span><span class="preprocessor">#define currentThreadID GetCurrentThreadId()</span>
<a name="l00072"></a>00072 <span class="preprocessor"></span>
<a name="l00073"></a>00073 <span class="preprocessor">#define currentProcessID()  ((uint)GetCurrentProcessId())</span>
<a name="l00074"></a>00074 <span class="preprocessor"></span>
<a name="l00075"></a>00075 <span class="preprocessor">#endif // PLATFORM(Windows)</span>
<a name="l00076"></a>00076 <span class="preprocessor"></span>
<a name="l00077"></a>00077 <span class="comment">// -----------------------------------------------------------------------------</span>
<a name="l00078"></a>00078 
<a name="l00079"></a>00079 <span class="comment">// the Thread opaque type</span>
<a name="l00080"></a>00080 <span class="comment">// typedef struct Thread Thread;</span>
<a name="l00081"></a>00081 
<a name="l00082"></a>00082 <span class="comment">// class initialization</span><span class="comment"></span>
<a name="l00083"></a>00083 <span class="comment">/// see Thread::thread_init</span>
<a name="l00084"></a>00084 <span class="comment"></span><span class="keyword">extern</span> TC2API <span class="keywordtype">void</span> <a class="code" href="classThread.html#a9ec6194c3c11f3640faff031399170a6" title="Thread class initialization.">thread_init</a>(<span class="keywordtype">void</span>);
<a name="l00085"></a>00085 
<a name="l00086"></a>00086 <span class="comment">// query</span>
<a name="l00087"></a>00087 <span class="comment">// ~~~~~</span>
<a name="l00088"></a>00088 <span class="comment"></span>
<a name="l00089"></a>00089 <span class="comment">/// see Thread::thread_selfSeqNo</span>
<a name="l00090"></a>00090 <span class="comment"></span><span class="keyword">extern</span> TC2API <a class="code" href="config_8h.html#a91ad9478d81a7aaf2593e8d9c3d06a14" title="unsigned int abbreviation">uint</a> <a class="code" href="classThread.html#a69aa31f942175e542162ca49937e9223" title="The chronological activation number of the running Thread.">thread_selfSeqNo</a>(<span class="keywordtype">void</span>);
<a name="l00091"></a>00091 <span class="comment"></span>
<a name="l00092"></a>00092 <span class="comment">/// The current thread id provided by the operating system</span>
<a name="l00093"></a><a class="code" href="Thread_8h.html#aa2dff81a18da64711d073e003dd6c59e">00093</a> <span class="comment"></span><span class="preprocessor">#define thread_selfID() ((uint)(currentThreadID))</span>
<a name="l00094"></a>00094 <span class="preprocessor"></span><span class="comment"></span>
<a name="l00095"></a>00095 <span class="comment">/// The current process id provided by the operating system</span>
<a name="l00096"></a><a class="code" href="Thread_8h.html#af3c1431be1989bc994d540a5dbb584c8">00096</a> <span class="comment"></span><span class="preprocessor">#define thread_pid() currentProcessID()</span>
<a name="l00097"></a>00097 <span class="preprocessor"></span>
<a name="l00098"></a>00098 <span class="comment">// operations</span>
<a name="l00099"></a>00099 <span class="comment">// ~~~~~~~~~~</span>
<a name="l00100"></a>00100 <span class="comment"></span>
<a name="l00101"></a>00101 <span class="comment">/// see Thread::thread_addThreads</span>
<a name="l00102"></a>00102 <span class="comment"></span><span class="keyword">extern</span> TC2API <span class="keywordtype">void</span> <a class="code" href="classThread.html#adffb4841c4fce629f5adb68ca7bc25c3" title="Starts n instances of a Thread.">thread_addThreads</a>(<a class="code" href="config_8h.html#a91ad9478d81a7aaf2593e8d9c3d06a14" title="unsigned int abbreviation">uint</a>, ThreadFunc, <span class="keywordtype">void</span>*);
<a name="l00103"></a>00103 
<a name="l00104"></a>00104 <span class="comment">// convenience</span>
<a name="l00105"></a>00105 <span class="comment">// ~~~~~~~~~~~</span>
<a name="l00106"></a>00106 <span class="comment"></span>
<a name="l00107"></a>00107 <span class="comment">/// see Thread::thread_printf</span>
<a name="l00108"></a>00108 <span class="comment"></span><span class="keyword">extern</span> TC2API <span class="keywordtype">void</span> <a class="code" href="classThread.html#a923bfc5f69f35b92907b426101c9fd28" title="Thread-safe printf substitute.">thread_printf</a>(<a class="code" href="config_8h.html#a0f128c3e0c83721af0220c00554e9c4e" title="const char abbreviation">cchar</a>*, ...);
<a name="l00109"></a>00109 
<a name="l00110"></a>00110 <span class="comment">// -----------------------------------------------------------------------------</span>
<a name="l00111"></a>00111 <span class="preprocessor">#ifdef __cplusplus</span>
<a name="l00112"></a>00112 <span class="preprocessor"></span>} <span class="comment">// #ifdef __cplusplus</span>
<a name="l00113"></a>00113 <span class="preprocessor">#endif</span>
<a name="l00114"></a>00114 <span class="preprocessor"></span><span class="comment">// -----------------------------------------------------------------------------</span>
<a name="l00115"></a>00115 <span class="preprocessor">#endif // __THREAD_H__</span>
<a name="l00116"></a>00116 <span class="preprocessor"></span><span class="comment">// -----------------------------------------------------------------------------</span>
</pre></div></div>
<hr class="footer"/><address style="text-align: right;"><small>Generated on Sat May 8 16:16:36 2010 for TcpClient2 by&nbsp;
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.3 </small></address>
</body>
</html>

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
zvx
Software Developer
Brazil Brazil
I'm a long-time software developer living in Brazil.

I've been developing software for retail and banking automation in C/C++ for many years now. In the old days I even did some COBOL programming, and some assembly for the 8080.

My experience ranges from low level software such as interface code for serial devices for DOS and Windows (bar code scanners, printers, cash dispensers, etc) and goes to writing end user applications for POS terminals and bank ATMs. In between I've done a great deal of TCP/IP programming using the basic Berkeley sockets interface, which is my main interest nowadays.

Comments and Discussions