一、echo客户/服务器程序
1、网络结构模型
a、集中式系统----有一个大型的中央处理系统,有点是数据容易备份,不易感染病毒,日常生活中的ATM、POS等使用的都是集中式系统
b、分布式系统----具有高度的可靠性、均衡负载、满足不同的需要
c、对等网络模型----P2P网络,每一台主机处于同等地位,既作为客户端,又充当其他主机的服务器,有可非为无结构网络、有结构网络、混合式网络、集中式网络
2、echo客户程序
mySocketClient.cpp:
- #include "stdafx.h"
- #include "winsock2.h"
- #include "iostream"
- #pragma comment(lib, "ws2_32")
- #define ECHO_DEF_PORT 7 //连接的默认端口
- #define ECHO_BUF_SIZE 256 //缓冲区的大小
- #define InitSockets() { \
- WORD version; \
- WSADATA wsaData; \
- version = MAKEWORD( 2,0 ); \
- WSAStartup(version, &wsaData); }
- #define CleanupSockets() WSACleanup()
- void DoSoming()
- {
- SOCKET echoSoc = 0;
- struct sockaddr_in servAddr;
- unsigned short port = ECHO_DEF_PORT;
- int result = 0;
- int sendLen = 0;
- char *testSendData = "hello world";
- char recv_buf[ECHO_BUF_SIZE];
- sendLen = strlen(testSendData);
- servAddr.sin_family = AF_INET;
- servAddr.sin_port = htons(port);
- servAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
- if (servAddr.sin_addr.s_addr == INADDR_NONE)
- {
- std::cout << "[ECHO] invalid address" << WSAGetLastError() << std::endl;
- exit(-1);
- }
- echoSoc = socket(AF_INET, SOCK_STREAM, 0);
- result = connect(echoSoc, (struct sockaddr *)&servAddr, sizeof(servAddr));
- if (result == 0)
- {
- result = send(echoSoc, testSendData, sendLen, 0);
- result = recv(echoSoc, recv_buf, ECHO_BUF_SIZE, 0);
- }
- if (result > 0)
- {
- recv_buf[result] = 0;
- std::cout << "[Echo Client] receives : " << recv_buf << std::endl;
- }
- else
- {
- std::cout << "[Echo Client] error : " << WSAGetLastError() << std::endl;
- }
- closesocket(echoSoc);
- CleanupSockets();
- }
- int _tmain(int argc, _TCHAR* argv[])
- {
- DoSoming();
- return 0;
- }
3、echo服务器程序
mySokcetSer.cpp:
- #include "stdafx.h"
- #include "winsock2.h"
- #include "iostream"
- #pragma comment(lib, "ws2_32")
- #define ECHO_DEF_PORT 7 //连接的默认端口
- #define ECHO_BUF_SIZE 256 //缓冲区的大小
- #define InitSockets() { \
- WORD version; \
- WSADATA wsaData; \
- version = MAKEWORD( 2,0 ); \
- WSAStartup(version, &wsaData); }
- #define CleanupSockets() WSACleanup()
- void DoSoming()
- {
- SOCKET echoSoc = 0;
- SOCKET acptSoc = 0;
- struct sockaddr_in servAddr;
- struct sockaddr_in clntAddr;
- unsigned short port = ECHO_DEF_PORT;
- int result = 0;
- int addrLen = sizeof(struct sockaddr_in);
- char recvBuf[ECHO_BUF_SIZE];
- echoSoc = socket(AF_INET, SOCK_STREAM, 0);
- servAddr.sin_family = AF_INET;
- servAddr.sin_port = htons(port);
- servAddr.sin_addr.s_addr = INADDR_ANY;
- result = bind(echoSoc, (struct sockaddr *)&servAddr, sizeof(servAddr));
- if (result == SOCKET_ERROR)
- {
- std::cout << "[Echo Server] bind error : " << WSAGetLastError() << std::endl;
- closesocket(echoSoc);
- exit(-1);
- }
- listen(echoSoc, SOMAXCONN);
- std::cout << "[Echo Server] is running ... ..." << std::endl;
- while (true)
- {
- acptSoc = accept(echoSoc, (struct sockaddr *)&clntAddr, &addrLen);
- if (acptSoc == INVALID_SOCKET)
- {
- std::cout << "[Echo Server] bind error : " << WSAGetLastError() << std::endl;
- break;
- }
- result = recv(acptSoc, recvBuf, ECHO_BUF_SIZE, 0);
- if (result > 0)
- {
- recvBuf[result] = 0;
- std::cout << "[Echo Server] receives : " << recvBuf << "from : "
- << inet_ntoa(clntAddr.sin_addr) << std::endl;
- result = send(acptSoc, recvBuf, result, 0);
- }
- closesocket(acptSoc);
- }
- closesocket(acptSoc);
- CleanupSockets();
- }
- int _tmain(int argc, _TCHAR* argv[])
- {
- DoSoming();
- return 0;
- }