游戏网络通讯方式基于TCP
2014-10-25 14:28
417 查看
SERVER:
CLIENT:
#include "stdafx.h" #include< stdio.h > #include< stdlib.h > #include< windows.h > #include< winsock.h > #include< string.h > #pragma comment( lib, "ws2_32.lib" ) #define PORT 2046 #define BACKLOG 10 #define TRUE 1 int _tmain(int argc, _TCHAR* argv[]) { //判断是否输入了端口号 /*if (argc != 2){ printf("Usage: %s PortNumber/n", argv[0]); exit(-1); }*/ //把端口号转化成整数 /*short port; if ((port = atoi(argv[1])) == 0){ printf("端口号有误!"); exit(-1); }*/ WSADATA wsa; //初始化套接字DLL if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0){ printf("套接字初始化失败!"); exit(-1); } //创建套接字 SOCKET serverSocket; if ((serverSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET){ printf("创建套接字失败!"); exit(-1); } struct sockaddr_in serverAddress; memset(&serverAddress, 0, sizeof(sockaddr_in)); serverAddress.sin_family = AF_INET; serverAddress.sin_addr.S_un.S_addr = htonl(INADDR_ANY); serverAddress.sin_port = htons(PORT); //绑定 if (bind(serverSocket, (sockaddr*)&serverAddress, sizeof(serverAddress)) == SOCKET_ERROR){ printf("套接字绑定到端口失败!端口: %d\n", PORT); exit(-1); } //进入侦听状态 if (listen(serverSocket, SOMAXCONN) == SOCKET_ERROR){ printf("侦听失败!"); exit(-1); } printf("Server %d is listening......\n", PORT); while (true) { SOCKET clientSocket;//用来和客户端通信的套接字 struct sockaddr_in clientAddress;//用来和客户端通信的套接字地址 memset(&clientAddress, 0, sizeof(clientAddress)); int addrlen = sizeof(clientAddress); //接受连接 if ((clientSocket = accept(serverSocket, (sockaddr*)&clientAddress, &addrlen)) == INVALID_SOCKET){ printf("接受客户端连接失败!"); closesocket(clientSocket); continue; } printf("Accept connection from %s\n", inet_ntoa(clientAddress.sin_addr)); char buf[4096]; //while (1){ //接收数据 int bytes; if ((bytes = recv(clientSocket, buf, sizeof(buf), 0)) == SOCKET_ERROR){ printf("接收数据失败!\n"); closesocket(clientSocket); continue; } buf[bytes] = '\0'; printf("Message from %s: %s\n", inet_ntoa(clientAddress.sin_addr), buf); if (send(clientSocket, buf, bytes, 0) == SOCKET_ERROR){ printf("发送数据失败!"); closesocket(clientSocket); continue; } closesocket(clientSocket); //清理套接字占用的资源 printf("%s exit!\n", inet_ntoa(clientAddress.sin_addr)); } WSACleanup(); return 0; }
CLIENT:
</pre><pre name="code" class="cpp">#include "stdafx.h" #include< stdio.h > #include< stdlib.h > #include< windows.h > #include< winsock.h > #include< string.h > #pragma comment( lib, "ws2_32.lib" ) #define PORT 2046 #define BACKLOG 10 #define TRUE 1 #define MAXDATASIZE 100 int _tmain(int argc, _TCHAR* argv[]) { //判断是否输入了IP地址和端口号 /*if (argc != 3){ printf("Usage: %s IPAddress PortNumber/n", argv[0]); exit(-1); }*/ //把字符串的IP地址转化为u_long unsigned long ip = inet_addr("127.0.0.1"); /*if ((ip = inet_addr(argv[1])) == INADDR_NONE){ printf("不合法的IP地址:%s", argv[1]); exit(-1); }*/ //把端口号转化成整数 //short port; /*if ((port = atoi(argv[2])) == 0){ printf("端口号有误!"); exit(-1); }*/ printf("Connecting to %s:%d......\n", inet_ntoa(*(in_addr*)&ip), PORT); WSADATA wsa; //初始化套接字DLL if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0){ printf("套接字初始化失败!"); exit(-1); } while (1){ //创建套接字 SOCKET sock; if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET){ printf("创建套接字失败!"); exit(-1); } struct sockaddr_in serverAddress; memset(&serverAddress, 0, sizeof(sockaddr_in)); serverAddress.sin_family = AF_INET; serverAddress.sin_addr.S_un.S_addr = ip; serverAddress.sin_port = htons(PORT); //建立和服务器的连接 if (connect(sock, (sockaddr*)&serverAddress, sizeof(serverAddress)) == SOCKET_ERROR){ printf("建立连接失败!"); exit(-1); } char buf[4096]; printf(">"); //从控制台读取一行数据 gets(buf); int index = 0; while (buf[index]) { buf[index]=buf[index]^0xf; index++; } //发送给服务器 if (send(sock, buf, strlen(buf), 0) == SOCKET_ERROR){ printf("发送数据失败!"); exit(-1); } int bytes; if ((bytes = recv(sock, buf, sizeof(buf), 0)) == SOCKET_ERROR){ printf("接收数据失败!/n"); exit(-1); } index = 0; while (buf[index]) { buf[index] = buf[index] ^ 0xf; index++; } buf[bytes] = '\0'; printf("Message from %s: %s\n", inet_ntoa(serverAddress.sin_addr), buf); closesocket(sock); } //清理套接字占用的资源 WSACleanup(); return 0; }
相关文章推荐
- 基于TCP的网络游戏黑白棋系列(四):游戏棋盘
- TCP和UDP网络通讯的区别及实现方式
- 基于 Pomelo TCP 网络通讯的 Flash as3 组件(v0.0.5a)
- TCP和UDP网络通讯的区别及实现方式
- TCP和UDP网络通讯的区别及实现方式
- 基于TCP的网络游戏黑白棋系列教程开篇
- 用Robot Framework+python来测试基于socket通讯的C/S系统(网络游戏)
- 基于TCP的网络游戏黑白棋系列(二):数据传输
- 17、TCP和UDP网络通讯的区别及实现方式
- 基于TCP的网络游戏黑白棋系列(一):建立连接
- 网络通讯方式 ------ TCP、UDP
- 基于TCP的网络游戏黑白棋系列(一):建立连接
- TCP和UDP网络通讯的区别及实现方式
- 基于TCP的网络游戏黑白棋系列(三):游戏大厅
- 最近cocos2d-x项目需求, 写了个客户端的基于TCP的网络通讯模块(ios,android, win32),
- TCP和UDP网络通讯的区别及实现方式
- 浅析H5中的WebSocket对象,创建 一个基于node的TCP网络协议的通讯协议
- 基于TCP的网络游戏黑白棋系列(二):数据传输
- 基于TCP的网络游戏黑白棋系列教程开篇
- 基于TCP的网络游戏黑白棋系列(三):游戏大厅