客户端部分
来源:互联网 发布:传奇霸业轮回升级数据 编辑:程序博客网 时间:2024/05/01 10:43
来自:http://www.codeproject.com/Articles/412511/Simple-client-server-network-using-Cplusplus-and-W
这里做了一些修改,当然还需做进一步完善。
包含四个文件:
ClientNetwork.h //客户端socket的初始化,数据收发
ClientNetwork.cpp
ClientGame.h
ClientGame.cpp //客户端收据收发的处理
// Networking libraries#include <winsock2.h>#include <ws2tcpip.h>// port to connect sockets through #define DEFAULT_PORT "6881"class ClientNetwork{public: // socket for client to connect to server SOCKET ConnectSocket; // ctor/dtor ClientNetwork(void); ~ClientNetwork(void);int receivePackets(char *);};
#include "StdAfx.h"#include <stdio.h> #include "ClientNetwork.h"#include "NetworkServices.h"#include "NetworkData.h"ClientNetwork::ClientNetwork(void){int iResult; // create WSADATA object WSADATA wsaData; // socket ConnectSocket = INVALID_SOCKET; // holds address info for socket to connect to struct addrinfo *result = NULL, *ptr = NULL, hints; // Initialize Winsock iResult = WSAStartup(MAKEWORD(2,2), &wsaData); if (iResult != 0) { printf("WSAStartup failed with error: %d\n", iResult); exit(1); } // set address info ZeroMemory(&hints, sizeof(hints)); hints.ai_family = AF_UNSPEC;//协议无关 hints.ai_socktype = SOCK_STREAM;//流 hints.ai_protocol = IPPROTO_TCP;//TCP connection!!! //resolve server address and port iResult = getaddrinfo("127.0.0.1", DEFAULT_PORT, &hints, &result); if (iResult != 0 ) { printf("getaddrinfo failed with error: %d\n", iResult); WSACleanup(); exit(1); } //Attempt to connect to an address until one succeeds for (ptr = result; ptr != NULL; ptr = ptr->ai_next){ // Create a SOCKET for connecting to server ConnectSocket = socket(ptr->ai_family, ptr->ai_socktype, ptr->ai_protocol); if (ConnectSocket == INVALID_SOCKET) { printf("socket failed with error: %ld\n", WSAGetLastError()); WSACleanup(); exit(1); } // Connect to server. iResult = connect( ConnectSocket, ptr->ai_addr, (int)ptr->ai_addrlen); if (iResult == SOCKET_ERROR) { closesocket(ConnectSocket); ConnectSocket = INVALID_SOCKET; printf ("The server is down... did not connect"); } } // no longer need address info for server freeaddrinfo(result); // if connection failed if (ConnectSocket == INVALID_SOCKET) { printf("Unable to connect to server!\n"); WSACleanup(); exit(1); }// Set the mode of the socket to be nonblocking u_long iMode = 1; iResult = ioctlsocket(ConnectSocket, FIONBIO, &iMode); if (iResult == SOCKET_ERROR) { printf("ioctlsocket failed with error: %d\n", WSAGetLastError()); closesocket(ConnectSocket); WSACleanup(); exit(1); }//disable nagle char value = 1; setsockopt( ConnectSocket, IPPROTO_TCP, TCP_NODELAY, &value, sizeof( value ) );}ClientNetwork::~ClientNetwork(void){}int ClientNetwork::receivePackets(char * recvbuf) {int iResult; iResult = NetworkServices::receiveMessage(ConnectSocket, recvbuf, MAX_PACKET_SIZE); if (iResult == 0) { printf("Connection closed\n"); closesocket(ConnectSocket); WSACleanup(); exit(1); } return iResult;}
#include "ClientNetwork.h"#include "NetworkData.h"class ClientGame{public:ClientGame(void);~ClientGame(void); void update();private:char network_data[MAX_PACKET_SIZE];ClientNetwork* network;void sendActionPackets();};
ClientGame::ClientGame(void){ network = new ClientNetwork(); // send init packet const unsigned int packet_size = sizeof(Packet); char packet_data[packet_size]; Packet packet; packet.packet_type = INIT_CONNECTION; packet.serialize(packet_data); NetworkServices::sendMessage(network->ConnectSocket, packet_data, packet_size);}ClientGame::~ClientGame(void){}void ClientGame::sendActionPackets(){ // send action packet const unsigned int packet_size = sizeof(Packet); char packet_data[packet_size]; Packet packet; packet.packet_type = ACTION_EVENT; packet.serialize(packet_data); NetworkServices::sendMessage(network->ConnectSocket, packet_data, packet_size);}void ClientGame::update(){ Packet packet; int data_length = network->receivePackets(network_data); if (data_length <= 0) { //no data recieved return; } unsigned int i = 0; while (i < (unsigned int)data_length) { packet.deserialize(&(network_data[i])); i += sizeof(Packet); switch (packet.packet_type) {case ACTION_EVENT: printf("client received action event packet from server\n"); sendActionPackets(); break; default: printf("error in packet types\n"); break; } }}
简单使用:
void clientLoop(void);ClientGame * client;int main(){ // initialize the client client = new ClientGame();clientLoop();}void clientLoop(){while(true){//do game stuffclient->update();}}
- 客户端部分
- SOCKET客户端部分程序
- 客户端 服务端公共部分
- UDP网络编程客户端部分
- 百度客户端分析之bdsug.js部分(原创部分)
- 百度客户端分析之bdsug.js部分(原创部分)
- ajax实际应用(1)客户端部分
- Android Tomcat 的应用之客户端部分
- [原创]HBase客户端开发举例(第三部分)
- 新闻客户端制作(第一部分)
- cocos2dx-网络连接客户端部分学习
- hadoop2.xWordCount执行过程-客户端部分
- [Java基础笔记]服务器/客户端交互部分
- Hadoop RPC源码研究----客户端部分
- 游戏聊天系统设计(客户端部分)
- 第二人生客户端程序, 第一部分: 探索第二人生
- 第二章(契约 实现一个双向契约的客户端部分)
- 在 ServiceModel 客户端配置部分中,找不到名称
- 你到底占多大内存?---字符变量
- 从"破窗效应"谈起
- C++标准异常类
- NYOJ房间安排
- simple_network说明
- 客户端部分
- 关键字this、super、final、static、synchronized及 中断线程的方法
- 要熟练掌握的七个人生工具
- 杭电4223
- 提高OCR识别率的一些菜鸟方法
- 揭开linux内核中container_of的神秘面纱
- Liunx命令工作总结(2)
- 初探Tomcat源码 (4) —— Catalina容器结构
- cvFloodFill