他們是短連接的,服務器接受客戶端之后,馬上發送一個消息,發送完以后立即將客戶端斷開掉,然后繼續等待下一個連接.
使用Winsocket2必須要引用到的頭文件和需要包含到的鏈接庫文件:
#include <WinSock2.h>
#pragma comment( lib, "ws2_32.lib" )
以下代碼是Winsocket2的系統初始化和關閉的封裝代碼.
class WinSocketSystem


{
public:
WinSocketSystem()

{
int iResult = WSAStartup( MAKEWORD( 2, 2 ), &wsaData );
if (iResult != NO_ERROR)

{
exit(-1);
}
}

~WinSocketSystem()

{
WSACleanup();
}

protected:
WSADATA wsaData;
};

static WinSocketSystem g_winsocketsystem;
服務器端代碼:
class TCPServer


{
public:
TCPServer()
: mServerSocket(INVALID_SOCKET)

{
// 創建套接字
mServerSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
if (mServerSocket == INVALID_SOCKET)

{
std::cout << "創建套接字失敗!" << std::endl;
return;
}

// 填充服務器的IP和端口號
mServerAddr.sin_family = AF_INET;
mServerAddr.sin_addr.s_addr = INADDR_ANY;
mServerAddr.sin_port = htons((u_short)SERVER_PORT);

// 綁定IP和端口
if ( ::bind(mServerSocket, (sockaddr*)&mServerAddr, sizeof(mServerAddr)) == SOCKET_ERROR)

{
std::cout << "綁定IP和端口失敗!" << std::endl;
return;
}

// 監聽客戶端請求,最大同時連接數設置為10.
if ( ::listen(mServerSocket, SOMAXCONN) == SOCKET_ERROR)

{
std::cout << "監聽端口失敗!" << std::endl;
return;
}

std::cout << "啟動TCP服務器成功!" << std::endl;
}

~TCPServer()

{
::closesocket(mServerSocket);
std::cout << "關閉TCP服務器成功!" << std::endl;
}

void run()

{
int nAcceptAddrLen = sizeof(mAcceptAddr);
for (;;)

{
// 以阻塞方式,等待接收客戶端連接
mAcceptSocket = ::accept(mServerSocket, (struct sockaddr*)&mAcceptAddr, &nAcceptAddrLen);
std::cout << "接受客戶端IP:" << inet_ntoa(mAcceptAddr.sin_addr) << std::endl;

// 發送消息
int ret = ::send(mAcceptSocket, SEND_STRING, (int)strlen(SEND_STRING), 0);
if (ret != 0)

{
std::cout << "發送消息成功!" << std::endl;
}

// 關閉客戶端套接字
::closesocket(mAcceptSocket);
std::cout << "斷開客戶端端成功!" << std::endl;
}
}

private:

SOCKET mServerSocket; /**////< 服務器套接字句柄
sockaddr_in mServerAddr; ///< 服務器地址


SOCKET mAcceptSocket; /**////< 接受的客戶端套接字句柄
sockaddr_in mAcceptAddr; ///< 接收的客戶端地址
};

int _tmain(int argc, _TCHAR* argv[])


{
TCPServer server;
server.run();

return 0;
}
客戶端代碼:
class TCPClient


{
public:
TCPClient()

{
// 創建套接字
mServerSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
if (mServerSocket == INVALID_SOCKET)

{
std::cout << "創建套接字失敗!" << std::endl;
return;
}

// 填充服務器的IP和端口號
mServerAddr.sin_family = AF_INET;
mServerAddr.sin_addr.s_addr = inet_addr(SERVER_IP);
mServerAddr.sin_port = htons((u_short)SERVER_PORT);

// 連接到服務器
if ( ::connect(mServerSocket, (struct sockaddr*)&mServerAddr, sizeof(mServerAddr)))

{
::closesocket(mServerSocket);
std::cout << "連接服務器失敗!" << std::endl;
return;
}
}

~TCPClient()

{
::closesocket(mServerSocket);
}

void run()

{
int nRecvSize = 0;
char buff[BUFFER_SIZE];
memset(buff, 0, sizeof(buff) );
while (nRecvSize = ::recv(mServerSocket, buff, BUFFER_SIZE, 0) )

{
if (mServerSocket == INVALID_SOCKET)

{
break;
}

std::cout << buff << std::endl;
}

std::cout << "已經和服務器斷開連接!" << std::endl;
}

private:

SOCKET mServerSocket; /**////< 服務器套接字句柄
sockaddr_in mServerAddr; ///< 服務器地址
};


int _tmain(int argc, _TCHAR* argv[])


{
TCPClient client;
client.run();

system("pause");
return 0;
}

源代碼下載:
服務器端代碼:
testTCPServer.rar客戶端代碼:
testTCPClient.rar