基于TCP的socket编程  
sockets(套接字)编程有三种,流式套接字(SOCK_STREAM),数据报套接字(SOCK_DGRAM),原始套接字(SOCK_RAW);基于TCP的socket编程是采用的流式套接字。  
正在装载数据…  
在这个程序中,将两个工程添加到一个工作区。要链接一个ws2_32.lib的库文件。  
服务器端编程的步骤:  
1:加载套接字库,创建套接字(WSAStartup()/socket());  
2:绑定套接字到一个IP地址和一个端口上(bind());  
3:将套接字设置为监听模式等待连接请求(listen());  
4:请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字(accept());  
5:用返回的套接字和客户端进行通信(send()/recv());  
6:返回,等待另一连接请求;  
7:关闭套接字,关闭加载的套接字库(closesocket()/WSACleanup())。  
服务器端代码如下:  
#include <stdio.h>  
#include <Winsock2.h>  
void main()  
{  
WORD wVersionRequested;  
WSADATA wsaData;  
int err;  
wVersionRequested = MAKEWORD( 1, 1 );  
err = WSAStartup( wVersionRequested, &wsaData );  
if ( err != 0 ) {  
return;  
}  
if ( LOBYTE( wsaData.wVersion ) != 1 ||  
HIBYTE( wsaData.wVersion ) != 1 ) {  
WSACleanup( );  
return;   
}  
SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);  
SOCKADDR_IN addrSrv;  
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);  
addrSrv.sin_family=AF_INET;  
addrSrv.sin_port=htons(6000);  
bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));  
listen(sockSrv,5);  
SOCKADDR_IN addrClient;  
int len=sizeof(SOCKADDR);  
while(1)  
{  
SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);  
char sendBuf[50];  
sprintf(sendBuf,"Welcome s to here!",inet_ntoa(addrClient.sin_addr));  
send(sockConn,sendBuf,strlen(sendBuf) 1,0);  
char recvBuf[50];  
recv(sockConn,recvBuf,50,0);  
printf("s\n",recvBuf);  
closesocket(sockConn);  
}  
}

客户端编程的步骤:  
1:加载套接字库,创建套接字(WSAStartup()/socket());  
2:向服务器发出连接请求(connect());  
3:和服务器端进行通信(send()/recv());  
4:关闭套接字,关闭加载的套接字库(closesocket()/WSACleanup())。  
客户端的代码如下:  
#include <stdio.h>  
#include <Winsock2.h>  
void main()  
{  
WORD wVersionRequested;  
WSADATA wsaData;  
int err;  
wVersionRequested = MAKEWORD( 1, 1 );  
err = WSAStartup( wVersionRequested, &wsaData );  
if ( err != 0 ) {  
return;  
}  
if ( LOBYTE( wsaData.wVersion ) != 1 ||  
HIBYTE( wsaData.wVersion ) != 1 ) {  
WSACleanup( );  
return;   
}  
SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);  
SOCKADDR_IN addrSrv;  
addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");  
addrSrv.sin_family=AF_INET;  
addrSrv.sin_port=htons(6000);  
connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));  
char recvBuf[50];  
recv(sockClient,recvBuf,50,0);  
printf("s\n",recvBuf);  
send(sockClient,"hello",strlen("hello") 1,0);  
closesocket(sockClient);  
WSACleanup();  
}  
请问:   
    我的client,server都是同步,想用tcp协议提供的heartbeat机制检测网络连接是否中断。网上找来如下代码,请问如和使用?是在client,server的socket创建好后都要加如下代码还是只需要一方加上就行了?另外通过如下代码我recv受到的数据包应该是什么内容?下面代码需要写在一个线程中不停的判断WSAIoctl返回值吗?请高人指点。   
//设置KeepAlive     
BOOL       bKeepAlive       =       TRUE;     
nRet       =       ::setsockopt(m_sockDesc,       SOL_SOCKET,       SO_KEEPALIVE,       (char*)&bKeepAlive,       sizeof(bKeepAlive));     
if       (nRet       !=0)     
{     
sprintf(m_pszError,       "Winsock       error       :       %s       (Error       Code       %d)\n   ",       "Socket       SetOpt       failed   ",       WSAGetLastError());     
return       FALSE;     
}     
//设置KeepAlive检测时间和次数     
TCP_KEEPALIVE       inKeepAlive       =       {0};       //输入参数     
unsigned       long       ulInLen       =       sizeof(TCP_KEEPALIVE);

TCP_KEEPALIVE       outKeepAlive       =       {0};       //输出参数     
unsigned       long       ulOutLen       =       sizeof(TCP_KEEPALIVE);

unsigned       long       ulBytesReturn       =       0;     
//设置socket的keep       alive为10秒,并且发送次数为3次     
inKeepAlive.onoff       =       1;         
inKeepAlive.keepaliveinterval       =       10000;       //两次KeepAlive探测间的时间间隔     
inKeepAlive.keepalivetime       =       3;       //开始首次KeepAlive探测前的TCP空闭时间     
nRet       =       WSAIoctl(m_sockDesc,         
SIO_KEEPALIVE_VALS,     
(LPVOID)&inKeepAlive,     
ulInLen,     
(LPVOID)&outKeepAlive,     
ulOutLen,     
&ulBytesReturn,     
NULL,     
NULL);     
if(SOCKET_ERROR       ==       nRet)     
{     
sprintf(m_pszError,       "Winsock       error       :       %s       (Error       Code       %d)\n   ",       "Nonblocking       socket       call       error   ",       WSAGetLastError());     
return       FALSE;     
}     
心跳是逻辑应用层的东西,需要自己实现,一般为自定义,当socket空闲时,发送心跳包,报文件格式自定义!   
我现在也遇到心跳检测的问题.网上查没查到,感觉大多比较笼统,就自己做吧.   
自己根据需要想了一下.客户端发自定义的心跳包,服务器端接收到心跳包向客户端返回个东西   
然后客户端再处理.实现上是可以的.   
因为水平有限,还是想学习一下标准的做法   
心跳检测需要以下步骤:   
1       客户端每隔一个时间间隔发生一个探测包给服务器   
2       客户端发包时启动一个超时定时器   
3       服务器端接收到检测包,应该回应一个包   
4       如果客户机收到服务器的应答包,则说明服务器正常,删除超时定时器   
5       如果客户端的超时定时器超时,请问:   
    我的client,server都是同步,想用tcp协议提供的heartbeat机制检测网络连接是否中断。网上找来如下代码,请问如和使用?是在client,server的socket创建好后都要加如下代码还是只需要一方加上就行了?另外通过如下代码我recv受到的数据包应该是什么内容?下面代码需要写在一个线程中不停的判断WSAIoctl返回值吗?请高人指点。   
//设置KeepAlive     
BOOL       bKeepAlive       =       TRUE;     
nRet       =       ::setsockopt(m_sockDesc,       SOL_SOCKET,       SO_KEEPALIVE,       (char*)&bKeepAlive,       sizeof(bKeepAlive));     
if       (nRet       !=0)     
{     
sprintf(m_pszError,       "Winsock       error       :       %s       (Error       Code       %d)\n   ",       "Socket       SetOpt       failed   ",       WSAGetLastError());     
return       FALSE;     
}     
//设置KeepAlive检测时间和次数     
TCP_KEEPALIVE       inKeepAlive       =       {0};       //输入参数     
unsigned       long       ulInLen       =       sizeof(TCP_KEEPALIVE);         
TCP_KEEPALIVE       outKeepAlive       =       {0};       //输出参数     
unsigned       long       ulOutLen       =       sizeof(TCP_KEEPALIVE);             
unsigned       long       ulBytesReturn       =       0;     
//设置socket的keep       alive为10秒,并且发送次数为3次     
inKeepAlive.onoff       =       1;         
inKeepAlive.keepaliveinterval       =       10000;       //两次KeepAlive探测间的时间间隔     
inKeepAlive.keepalivetime       =       3;       //开始首次KeepAlive探测前的TCP空闭时间

nRet       =       WSAIoctl(m_sockDesc,         
SIO_KEEPALIVE_VALS,     
(LPVOID)&inKeepAlive,     
ulInLen,     
(LPVOID)&outKeepAlive,     
ulOutLen,     
&ulBytesReturn,     
NULL,     
NULL);     
if(SOCKET_ERROR       ==       nRet)     
{     
sprintf(m_pszError,       "Winsock       error       :       %s       (Error       Code       %d)\n   ",       "Nonblocking       socket       call       error   ",       WSAGetLastError());     
return       FALSE;     
}

心跳检测需要以下步骤:   
1       客户端每隔一个时间间隔发生一个探测包给服务器   
2       客户端发包时启动一个超时定时器   
3       服务器端接收到检测包,应该回应一个包   
4       如果客户机收到服务器的应答包,则说明服务器正常,删除超时定时器   
5       如果客户端的超时定时器超时,依然没有收到应答包,则说明服务器挂了

依然没有收到应答包,则说明服务器挂了   
DWORD   NetSessionEnum(   LPSTR,     
DWORD,     
LPBYTE,     
DWORD,     
LPDWORD,     
LPDWORD   )     
参数1:   NULL表示枚举本机的网络连接     
参数2:   不详.在枚举中是常量0x32.     
参数3:   存放信息的缓冲区指针     
参数4:   缓冲区长度     
参数5:   指向返回连接个数     
参数6:   指向总共连接个数     
Top  
在WINDOWS95&WINDOWS98下如何关闭网络连接       
   --------------------------------------------------------------------------------     
如果你有这个方面的问题请到C/C++去提问或发表你的意见        来源:论坛转载无法确定出处,如有版权问题请与我们联系      在WINDOWS95&WINDOWS98下如何关闭网络连接     
一.问题提出:       每当你通过WINDOWS95或WINDOWS98访问"网上邻居"时,系统自动的建立了两     
台机器之间的网络连接关系,但是在访问结束后,并不自动的断开网络连接,     
所以有时我们关闭WINDOWS系统时,会弹出一个对话框,询问是否关闭网络连     
接,在回答"YES"后,才真正开始关闭计算机.     
程序员编制系统关闭程序时,就需要考虑这种情况,虽然SDK提供了关机的API:     
ExitWindowsEx()和ExitWindows(),但实际应用中我发现,在指定FORCE关机时     
在特定情况下会出问题.所以,必须想办法首先断开网络连接.        
二.编程接口:        
WINDOWS95及WINDOWS98提供的这方面的网络编程接口在SVRAPI.DLL中,利用它     
我们可以列举出当前网络连接状态,控制或删除网络连接.WINDOWS附件中的     
NETWATCH.EXE工具就是这样实现的.     
也许您会问,NetAPI的详细说明在开发工具的SDK文档中很详细了,没有必要在     
此演示.但是,在查寻了很多资料后,我不得不说:MSDN中有关NetAPI的部分说     
明是错误的,至少是不完整而且含混不清的,可以说,依靠这些文档,你不能实     
现全部的功能!下面的代码是本人自己分析得来,使用后,您会发现正确的应用     
和文档说明有多么大的差距.        
三.API声明:        
关闭网络连接的实现方法分两步:   枚举出当前所有的网络连接状况;   依次     
断开枚举出的网络连接.        
1.枚举出当前所有的网络连接状况:     
依照开发帮助文档,这个API是这样的:     
NET_API_STATUS   NetSessionEnum(     
LPWSTR   servername,       
LPWSTR   UncClientName,       
LPWSTR   username,       
DWORD   level,       
LPBYTE   *bufptr,       
DWORD   prefmaxlen,       
LPDWORD   entriesread,       
LPDWORD   totalentries,       
LPDWORD   resume_handle       
);        
但是,实际情况是,在WINDOWS95和WINDOWS98平台下,     
这样调用根本就无法连接上库文件.真正的API声明应该是:     
DWORD   NetSessionEnum(   LPSTR,     
DWORD,     
LPBYTE,     
DWORD,     
LPDWORD,     
LPDWORD   )     
参数1:   NULL表示枚举本机的网络连接     
参数2:   不详.在枚举中是常量0x32.     
参数3:   存放信息的缓冲区指针     
参数4:   缓冲区长度     
参数5:   指向返回连接个数     
参数6:   指向总共连接个数     
可见,参数个数完全不同,另外参数意义也发生了变化.     
      
2.依次断开枚举出的网络连接:     
还算幸运的是,断开网络连接的API声明是正确的:     
NET_API_STATUS   NetSessionDel(     
LPWSTR   servername,       
LPWSTR   UncClientName,       
LPWSTR   username   );     
不过要注意的是,第2个和第3个参数的内容需要     
从枚举得到的缓冲区中去取.具体方法参见程序.     
      
四.源代码:     
      
以下是实现断开网络连接的子程序,你可以方便的把它们加入到自己的项目中     
去,而不用和我一样浪费时间去研究到底怎样实现网络枚举了.     
      
注:由于本程序只实际用到了一个SVRAPI.DLL中的函数声明,简便期间,我没有     
用原有的头文件,自己定义一下就可以了.     
      
///     
//   File:   NetClose.H     
//   Version:   1.01     
      
#define   NETBUFF_SIZE   0x208     
      
#define   NetSessionEnum_PROFILE   (   DWORD   (__stdcall   *)   (   LPSTR,   DWORD,   LPBYTE,   DWORD,   LPDWORD,   LPDWORD   )   )     
#define   NetSessionDel_PROFILE   (   DWORD   (__stdcall   *)   (   LPSTR,   LPSTR,   DWORD   )   )     
///     
//   File:   NetClose.CPP     
//   Version:   1.01     
///     
//   Define:   BOOL   NetCloseAll(   VOID   )     
//   Parameters:   None     
//   Return:   TRUE   or   FALSE     
//     
//   Author:   Mr.Huang   fei     
//   Time:   5/7/1998     
//   Note:   Can   only   be   used   on   Windows95   &   Windows98     
//   Remark:   Close   all   network   conneCTions     
///     
BOOL   NetCloseAll(   VOID   )     
{     
BYTE   byBuff[NETBUFF_SIZE];     
DWORD   dwNetRet   =   0;;     
DWORD   i   =   0;     
DWORD   dwEntries   =   0;     
DWORD   dwTotalEntries   =   0;     
LPSTR   szClient   =   NULL;     
DWORD   dwUserName   =   0;     
BOOL   bRet   =   FALSE;     
LPBYTE   lpbyBuff   =   (LPBYTE)byBuff;     
      
DWORD   (__stdcall   *   hookNetSessionEnum)(   LPSTR,   DWORD,   LPBYTE,   DWORD,   LPDWORD,   LPDWORD   );     
DWORD   (__stdcall   *   hookNetSessionDel)(   LPSTR,   LPSTR,   DWORD   );     
      
HINSTANCE   hMod   =   LoadLibrary(   "SVRAPI.DLL"   );     
if(   hMod   !=   NULL   )     
{     
//   Get   the   address   of   function     
hookNetSessionEnum   =   NetSessionEnum_PROFILE     
GetProcAddress     
(   hMod,   TEXT("NetSessionEnum")   );     
hookNetSessionDel   =   NetSessionDel_PROFILE     
GetProcAddress     
(   hMod,   TEXT("NetSessionDel")   );     
      
if(   (   hookNetSessionDel   !=   NULL   )   &&     
(   hookNetSessionEnum   !=   NULL   )   )     
{     
dwNetRet   =   hookNetSessionEnum(   NULL,     
0x32,   byBuff,     
NETBUFF_SIZE,   &dwEntries,     
&dwTotalEntries   );     
if(   dwNetRet   ==   0   )     
{     
bRet   =   TRUE;     
for(   i=0;   i   <   dwTotalEntries;   i++   )     
{     
szClient   =   (LPSTR)(((DWORD   *)     
lpbyBuff)[0]);     
dwUserName   =   ((DWORD   *)lpbyBuff)[2];     
dwNetRet   =   hookNetSessionDel(   NULL,     
szClient,   dwUserName   );     
if(   dwNetRet   !=   0   )     
{     
bRet   =   FALSE;     
break;     
}     
lpbyBuff   +=   26;     
}     
}   //   NetSessionEnum(...)     
else     
bRet   =   FALSE;     
}   //   GetProcAddress(...)     
else     
bRet   =   FALSE;     
      
FreeLibrary(   hMod   );     
}   //   LoadLibrary(...)     
return   bRet;     
}     
      
五.总结:     
      
以上是开发过程中的一点经验,希望对大家有所帮助,有不对的地方请谅解并     
指出.另外,众所周知Microsoft的开发文档有相当一部分是未公开的,这些未     
公开信息有时会给我们造成很大的困难,在此希望有类似体验的程序开发者     
把自己的经验写出来,让后来者少走一些弯路.     
8 楼sevencat(七猫)回复于 2003-10-05 15:47:13 得分 0 要稍微翻译一下吗?InternetGetConnectedState这个函数获得当前系统的连接状态。     
参数     
      
lpdwFlags   是一个指向整数的指针。     
获取的状态就放在这里面     
      
INTERNET_CONNECTION_CONFIGURED   有一个internet上的无效连接,不过当前可能不工作。     
INTERNET_CONNECTION_LAN   Local   用当地网络连上互连网的     
INTERNET_CONNECTION_MODEM   用MODEM上网的     
INTERNET_CONNECTION_MODEM_BUSY   不使用了。     
INTERNET_CONNECTION_OFFLINE   脱状态下。     
INTERNET_CONNECTION_PROXY   用代理服务器连上网的。       
INTERNET_RAS_INSTALLED   用了RAS了。Top  
2 楼Skt32(荒城之月)回复于 2003-10-03 21:08:49 得分 5DWORD   NetSessionEnum(   LPSTR,     
DWORD,     
LPBYTE,     
DWORD,     
LPDWORD,     
LPDWORD   )     
参数1:   NULL表示枚举本机的网络连接     
参数2:   不详.在枚举中是常量0x32.     
参数3:   存放信息的缓冲区指针     
参数4:   缓冲区长度     
参数5:   指向返回连接个数     
参数6:   指向总共连接个数     
Top

在WINDOWS95&WINDOWS98下如何关闭网络连接       
一.问题提出:     
      
每当你通过WINDOWS95或WINDOWS98访问"网上邻居"时,系统自动的建立了两   台机器之间的网络连接关系,但是在访问结束后,并不自动的断开网络连接,   所以有时我们关闭WINDOWS系统时,会弹出一个对话框,询问是否关闭网络连   接,在回答"YES"后,才真正开始关闭计算机.   程序员编制系统关闭程序时,就需要考虑这种情况,虽然SDK提供了关机的API:   ExitWindowsEx()和ExitWindows(),但实际应用中我发现,在指定FORCE关机时     
在特定情况下会出问题.所以,必须想办法首先断开网络连接.     
      
二.编程接口:     
      
WINDOWS95及WINDOWS98提供的这方面的网络编程接口在SVRAPI.DLL中,利用它   我们可以列举出当前网络连接状态,控制或删除网络连接.WINDOWS附件中的 NETWATCH.EXE工具就是这样实现的.     
也许您会问,NetAPI的详细说明在开发工具的SDK文档中很详细了,没有必要在 此演示.但是,在查寻了很多资料后,我不得不说:MSDN中有关NetAPI的部分说   明是错误的,至少是不完整而且含混不清的,可以说,依靠这些文档,你不能实   现全部的功能!下面的代码是本人自己分析得来,使用后,您会发现正确的应用     
和文档说明有多么大的差距.        
三.API声明:        
关闭网络连接的实现方法分两步:   枚举出当前所有的网络连接状况;   依次 断开枚举出的网络连接.     
      
1.枚举出当前所有的网络连接状况:     
依照开发帮助文档,这个API是这样的:     
NET_API_STATUS   NetSessionEnum(     
LPWSTR   servername,       
LPWSTR   UncClientName,       
LPWSTR   username,       
DWORD   level,       
LPBYTE   *bufptr,       
DWORD   prefmaxlen,       
LPDWORD   entriesread,       
LPDWORD   totalentries,       
LPDWORD   resume_handle       
);     
      
但是,实际情况是,在WINDOWS95和WINDOWS98平台下,   这样调用根本就无法连接上库文件.真正的API声明应该是:   
DWORD   NetSessionEnum(   LPSTR,     
DWORD,     
LPBYTE,     
DWORD,     
LPDWORD,     
LPDWORD   )     
参数1:   NULL表示枚举本机的网络连接     
参数2:   不详.在枚举中是常量0x32.     
参数3:   存放信息的缓冲区指针     
参数4:   缓冲区长度     
参数5:   指向返回连接个数     
参数6:   指向总共连接个数     
可见,参数个数完全不同,另外参数意义也发生了变化.        
2.依次断开枚举出的网络连接:     
还算幸运的是,断开网络连接的API声明是正确的:     
NET_API_STATUS   NetSessionDel(     
LPWSTR   servername,       
LPWSTR   UncClientName,       
LPWSTR   username   );     
不过要注意的是,第2个和第3个参数的内容需要     
从枚举得到的缓冲区中去取.具体方法参见程序.        
四.源代码:        
以下是实现断开网络连接的子程序,你可以方便的把它们加入到自己的项目中     
去,而不用和我一样浪费时间去研究到底怎样实现网络枚举了.        
注:由于本程序只实际用到了一个SVRAPI.DLL中的函数声明,简便期间,我没有     
用原有的头文件,自己定义一下就可以了.   
///     
//   File:   NetClose.H     
//   Version:   1.01     
      
#define   NETBUFF_SIZE   0x208     
      
#define   NetSessionEnum_PROFILE   (   DWORD   (__stdcall   *)   (   LPSTR,   DWORD,   LPBYTE,   DWORD,   LPDWORD,   LPDWORD   )   )     
#define   NetSessionDel_PROFILE   (   DWORD   (__stdcall   *)   (   LPSTR,   LPSTR,   DWORD   )   )     
///     
//   File:   NetClose.CPP     
//   Version:   1.01     
///     
//   Define:   BOOL   NetCloseAll(   VOID   )     
//   Parameters:   None     
//   Return:   TRUE   or   FALSE     
//     
//   Author:   Mr.Huang   fei     
//   Time:   5/7/1998     
//   Note:   Can   only   be   used   on   Windows95   &   Windows98     
//   Remark:   Close   all   network   conneCTions     
///     
BOOL   NetCloseAll(   VOID   )     
{     
BYTE   byBuff[NETBUFF_SIZE];     
DWORD   dwNetRet   =   0;;     
DWORD   i   =   0;     
DWORD   dwEntries   =   0;     
DWORD   dwTotalEntries   =   0;     
LPSTR   szClient   =   NULL;     
DWORD   dwUserName   =   0;     
BOOL   bRet   =   FALSE;     
LPBYTE   lpbyBuff   =   (LPBYTE)byBuff;     
      
DWORD   (__stdcall   *   hookNetSessionEnum)(   LPSTR,   DWORD,   LPBYTE,   DWORD,   LPDWORD,   LPDWORD   );     
DWORD   (__stdcall   *   hookNetSessionDel)(   LPSTR,   LPSTR,   DWORD   );     
      
HINSTANCE   hMod   =   LoadLibrary(   "SVRAPI.DLL"   );     
if(   hMod   !=   NULL   )     
{     
//   Get   the   address   of   function     
hookNetSessionEnum   =   NetSessionEnum_PROFILE     
GetProcAddress     
(   hMod,   TEXT("NetSessionEnum")   );     
hookNetSessionDel   =   NetSessionDel_PROFILE     
GetProcAddress     
(   hMod,   TEXT("NetSessionDel")   );     
      
if(   (   hookNetSessionDel   !=   NULL   )   &&     
(   hookNetSessionEnum   !=   NULL   )   )     
{     
dwNetRet   =   hookNetSessionEnum(   NULL,     
0x32,   byBuff,     
NETBUFF_SIZE,   &dwEntries,     
&dwTotalEntries   );     
if(   dwNetRet   ==   0   )     
{     
bRet   =   TRUE;     
for(   i=0;   i   <   dwTotalEntries;   i++   )     
{     
szClient   =   (LPSTR)(((DWORD   *)     
lpbyBuff)[0]);     
dwUserName   =   ((DWORD   *)lpbyBuff)[2];     
dwNetRet   =   hookNetSessionDel(   NULL,     
szClient,   dwUserName   );     
if(   dwNetRet   !=   0   )     
{     
bRet   =   FALSE;     
break;     
}     
lpbyBuff   +=   26;     
}     
}   //   NetSessionEnum(...)     
else     
bRet   =   FALSE;     
}   //   GetProcAddress(...)     
else     
bRet   =   FALSE;     
      
FreeLibrary(   hMod   );     
}   //   LoadLibrary(...)     
return   bRet;     
}     
      
五.总结:     
怎么设置客户端自动连接服务器啊?   
现在要开发一个网络通讯客户端程序,用的是TCP/IP协议,具体的协议已经拟订好了。简单的描述及时每隔30秒客户端自动向服务器端传输一组数据。因为我的客户端机器要一天24小时不停的运行,而且是无人值守的,那万一网络中断或是服务器端关机等异常情况发生,导致连接中断时,我的客户端程序必须保证在服务器端启动后,客户端能自动连接上服务器。我现在不清楚该怎么设置connect函数,才能做到这一点。   
还有,对于这种程序,我该采用多线程阻塞模式好呢,还是采用非阻塞模式好些?对于我这一点,我始终都确定不了别人都是采取哪种方法实现的?   
如果我要在程序中发送心跳包的话,该怎么做呢?

基于TCP的socket编程网络掉线重连相关推荐

  1. 【转/TCP协议编程】 基于TCP的Socket 编程

    基于TCP(面向连接)的socket编程,分为客户端和服务器端. 客户端的流程如下: (1)创建套接字(socket) (2)向服务器发出连接请求(connect) (3)和服务器端进行通信(send ...

  2. 基于TCP的Socket编程实例

    1.Socket通常称为套接字,应用程序通常通过套接字像网络发送请求或者应答网络请求 2.本文给出了一个服务端与客户端交流的实例代码,可以实现循环交流,代码如下                     ...

  3. 网络编程懒人入门(八):手把手教你写基于TCP的Socket长连接

    转自即时通讯网:http://www.52im.net/ 本文原作者:"水晶虾饺",原文由"玉刚说"写作平台提供写作赞助,原文版权归"玉刚说" ...

  4. socket网络编程 java_Java Web 基础(一) 基于TCP的Socket网络编程

    一.Socket简单介绍 Socket通信作为Java网络通讯的基础内容,集中了异常.I/O流模式等众多知识点.学习Socket通信,既能够了解真正的网络通讯原理,也能够增强对I/O流模式的理解. 1 ...

  5. Java TCP/IP Socket 编程 笔记

    http://jimmee.iteye.com/blog/617110 http://jimmee.iteye.com/category/93740 Java TCP/IP Socket 编程 笔记( ...

  6. api有哪些 javasocket_基于java的socket编程及API解析

    一.socket通讯过程 1.socket与socket编程简介: socket 被翻译为"套接字",它是计算机之间进行通信的一种约定或一种方式.通过 socket 这种约定,一台 ...

  7. Java中基于TCP通过socket嵌套字连接方式传送文件

    这里写目录标题 Java中通过socket连接传送文件 前言 socket嵌套字 发送方 接收方 总结 Java中通过socket连接传送文件 前言 在项目的开发中经常遇到需要传送文件的情况,有时候是 ...

  8. 基于TCP的socket详解(Linux系统)

    内容有点多建议配合实例学习:https://blog.csdn.net/FUN6367/article/details/105294984 1.基于TCP的socket五元组结构 两个程序:Serve ...

  9. java基础篇18-网络编程的常识和基于TCP协议的编程模型

    1.网络编程的常识   目前主流的网络通讯软件有:微信.QQ.YY.陌陌.探探.飞信.阿里旺旺....   在吗?  1.1 七层网络模型   为了保证数据传递的可靠安全等等,ISO(国际标准委员会组 ...

最新文章

  1. 纯国产敏捷项目管理软件,可基于scrum敏捷开发落地
  2. JSP内置对象-page
  3. 比特币黄金BTG遭遇51%算力攻击,即将归零?
  4. 【并发编程】线程中的Sleep、Yield、Join等api方法方法线程状态转换
  5. html文本显示_「前端开发」HTML入门与实战
  6. 洛谷 - P3980 [NOI2008]志愿者招募(最小费用最大流+思维建边)
  7. 分支程序与循环程序设计-汇编实验二
  8. C#综合揭秘——深入分析委托与事件(上)
  9. linux下日志文件的查找(tail和grep)
  10. pytorch学习笔记(一):Tensor(张量)
  11. 简单的maven引入外部jar项目打包
  12. VirtualBox安装RedHat7
  13. mac python3.8上怎么安装pygame 第三方库_Python3.8安装Pygame教程步骤详解
  14. 计算机用户里的AppData,AppData是什么意思,Appdata文件夹可以删除吗?
  15. 超火的快闪文字视频制作,用这个软件就能轻松学会
  16. oracle安装搜狗输入法教程,Ubuntu12.04安装搜狗拼音输入法
  17. 对于人生道路的些许感慨
  18. 达内培训python百度云下载
  19. 详解比较好的音视频通话SDK开发包的技术要点
  20. idea的项目模板的创建

热门文章

  1. javascript利用自定义函数向页面输出自定义的表格,在调用函数时通过传递的参数指定表格的行数
  2. 2017年计算机组装视频,2017年电脑CPU组装技巧
  3. AI摄影,华为P20 Pro让每一拍都是大片
  4. 【Linux】Rsync远程同步及备份工具(Rsync简介、Rsync安装、rsync认证方式)
  5. 【渝粤题库】广东开放大学 跨境电商实务英语 形成性考核
  6. 基于Python+树莓派的婴幼儿智能监测机器人
  7. JAVA11_16学习总结(集合!)
  8. CF 103A.Testing Pants for Sadness
  9. 网站安全检测之图片验证码
  10. 硬触发控制相机拍照matlab代码,使用matlab调用摄像头拍照并发到邮箱