// 服务器

# pragma once
using namespace std;
# include <iostream>
# include <string>
# include <stdio.h>
# include <winsock2.h>
# pragma comment(lib,”ws2_32.lib”) # include “Tool.h” void main()
{
WSAData wsadata;
SOCKET ListeningSocket;
SOCKET newConnection; sockaddr_in serverAddr;
sockaddr_in clientAddr; // Struct sockaddr_in
// {
// short sin_family; Sin_family:代表协议族,一般为AF_INET.代表使用TCP/IP协议族
// u_short sin_port; Sin_port: 代表端口号16位。注意字节序
// struct in_addr sin_addr; Sin_addr:代表32位IPV4地址。
// char sin_zero[8]; Sin_zero:8个字节的0补充。
// } int clientAddrLen = sizeof(sockaddr_in);
int port = ;
int ret;
char dataBuffer[]; // int WSAStartup(WORD version, LPWSADATA lpWSAData); /* 此函数在应用程序中初始化Windows Sockets DLL ,只有此函数调用成功后,应用程序才可以再调用其他Windows Sockets DLL中的API函数。如果成功返回0。
Version 代表程序需要的Winsock的最高版本。其中主版本号在低
字节,次版本号在高字节。
比如:使用1.2的版本, version的值0x0201。 也可以使用MAKEWORD(2, 2)。
WORD MAKEWORD
(
BYTE bLow,
BYTE bHigh
); lpWSAData 代表WSADATA的指针,里面包括本机系统的信息。它是返回值
struct WSAData
{
WORD wVersion; 代表建议使用的版本号
WORD wHighVersion; 代表系统最高支持的版本号
char szDescription[WSADESCRIPTION_LEN + 1];
char szSystemStatus[WSASYSSTATUS_LEN + 1];
unsigned short iMaxSockets;
unsigned short iMaxUdpDg;
char FAR * lpVendorInfo;
};
*/ if ((ret = WSAStartup(MAKEWORD(, ), &wsadata)) != )
{
cout << “WSAStart up is failed with error\t” << ret << endl;
return;
} /* SOCKET socket(int af, int type, int protocol)
af:代表协议族,一般为AF_INET.
Type : 代表套接口类型,SOCK_STREAM流套接字, SOCK_DGRAM数据报套接字 流套接字上数据进出是无边界的,可靠的。
数据报套接字是有边界的,不可靠的(相对于流套接字而言)
流套接字是速度慢,数据报套字速度快。
流套接字是有序的,数据报套接字是无序的(后发的数据有可能先被接收到。) 所以一般tcp 用刘套接字,udp用数据报 关于udp协议,后章会给出(好吧,可能会给出,看有没有时间)
估计qq的消息用得是udp,具体没去研究—- Protocol : 指定所用的协议.如:IPPROTO_TCP、PPROTO_UDP
返回值:如果没有错误发生,返回一个新的套接字,
否则返回INVALID_SOCKET。
*/ // 创建一个监听套接字,所谓监听,就是看看有没有客户端连接上来
if (INVALID_SOCKET == (ListeningSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)))
{
cout << “socket is falied with error\t” << WSAGetLastError() << endl;
WSACleanup();
return;
} // 本机系统所用的字节序称为:本机字节顺序
// 网络标准使用的字节序称为:网络字节顺序 /* htons()——本机到网络(short)
htonl()——本机到网络(Long)
ntohs()——网络到本机(short)
ntohl()——网络到本机(long)
*/ serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(port);
serverAddr.sin_addr.s_addr = htonl(INADDR_ANY);
//INADDR_ANY就是指定地址为0.0.0.0的地址,这个地址事实上表示不确定地址,或“所有地址”、“任意地址”。 一般来说,在各个系统中均定义成为0值。 // 绑定端口
// bind(SOCKET s, const struct sockaddr FAR *name, int namelen); // 接下来要为服务器端定义的这个监听的socket指定一个地
// 及端口(Port),这样客户端才知道待会要连接哪一个地址的哪个
// 端口,为此我们要调用bind()函数,该函数调用成功返回0,否则
// 返回SOCKET_ERROR if (SOCKET_ERROR == bind(ListeningSocket, (sockaddr*)&serverAddr, sizeof(serverAddr)))
{
cout << “bind is falied with error\t” << WSAGetLastError() << endl;
closesocket(ListeningSocket);
WSACleanup();
return;
} // 监听
// int listen( SOCKET s, int backlog ); // 服务器端的socket对象绑定完成之后,服务器端必须建立一个监听的队列来接收客户端的连接请求。
// listen()函数使服务器端的socket 进入监听状态,并设定可以建立的最大连接数(目前最大值限制为 5, 最小值为1)。
// 该函数调用成功返回0,否则返回SOCKET_ERROR。 if (SOCKET_ERROR == listen(ListeningSocket, ))
{
cout << “listen is falied with error\t” << WSAGetLastError() << endl;
closesocket(ListeningSocket);
WSACleanup();
return;
} cout << “now we are waiting a connection from client” << endl; cout <<“sizeof sockaddr_in:\t”<< sizeof(sockaddr_in) << “\tsizeof sockaddr\t” << sizeof(sockaddr) << endl; // 服务器端接受客户端的连接请求
// SOCKET accept( SCOKET s, struct sockaddr FAR *addr,int FAR *addrlen );
// 为了使服务器端接受客户端的连接请求,就要使用accept() 函数,
// 该函数新建一个socket与客户端的socket相通,原先监听之socket继续进入监听状态,
// 等待他人的连接要求。该函数调用成功返回一个新产生的socket对象,否则返回INVALID_SOCKET。
if (INVALID_SOCKET == (newConnection = accept(ListeningSocket, (sockaddr*)&clientAddr, &clientAddrLen)))
{
cout << “accept is falied with error\t” << WSAGetLastError() << endl;
closesocket(ListeningSocket);
WSACleanup();
return;
} cout << “get a connect from client addr\t” << inet_ntoa(clientAddr.sin_addr) << “\t” << ntohs(clientAddr.sin_port) << endl; // 数据的接收
// int recv( SOCKET s, char FAR *buf, int len, int flags ); // 参数:
// s为socket 的识别码
// buf:存放接收到的信息的暂存区
// len:buf的长度
// flags:此函数被调用的方式
// 返回值就是接受的字符串的长度(在没出错的情况下) if (SOCKET_ERROR == (ret = recv(newConnection, dataBuffer, sizeof(dataBuffer), )))
{
cout << “recv is errow with\t” << WSAGetLastError() << endl;
closesocket(newConnection);
WSACleanup();
return;
} dataBuffer[ret] = ‘\’; //wchar_t *temp = Tool::getSingleTon()->charToWchar(dataBuffer); //cout << “ret:\t” << ret << “\tdata\t” << temp << endl; // 暂时不知道怎么解析unity客户端发过来的中文,,,忧伤的不行,试了好几种方法,有知道的可以告诉我下 cout << dataBuffer << endl; // 结束 socket 连接 // 结束服务器和客户端的通信连接是很简单的,这一过程可以由服务器或客户机的任一端启动,
// 只要调用closesocket()就可以了,而要关闭Server端监听状态的socket,同样也是利用此函数。
// 另外,与程序启动时调用WSAStartup()憨数相对应,程式结束前,需要调用 WSACleanup()
// 来通知Winsock Stack释放socket所占用的资源。这两个函数都是调用成功返回0,否则返回SOCKET_ERROR。 // int PASCAL FAR closesocket(SOCKET s);
// 参 数:s为socket 的识别码;
// int PASCAL FAR WSACleanup(void); closesocket(newConnection); WSACleanup();
}
unity客户端

using UnityEngine;
using System.Collections;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.IO; public class TestScoket : MonoBehaviour
{ void Start()
{
ConncetServer();
} void ConncetServer()
{
IPAddress ipAdr = IPAddress.Parse(“10.0.0.22”); IPEndPoint ipEp = new IPEndPoint(ipAdr, ); Socket clientScoket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); clientScoket.Connect(ipEp); string output = “zhangsan”;// 中文暂时不知道怎么解析 “中文” byte[] concent = Encoding.UTF8.GetBytes(output); //byte[] concent = Encoding.Unicode.GetBytes(output);
int count = clientScoket.Send(concent); Debug.LogError(count); //byte[] response = new byte[1024]; //int bytesRead = clientScoket.Receive(response); //string input = Encoding.UTF8.GetString(response, 0, bytesRead); //print(“Client request:” + input);
clientScoket.Shutdown(SocketShutdown.Both);
clientScoket.Close();
} private void ConnectCallBack(System.IAsyncResult ar)
{
Debug.LogError(“连接成功”);
}
}

unity客户端与c++服务器之间的简单通讯_1的更多相关文章

  1. Java开发之使用websocket实现web客户端与服务器之间的实时通讯

    使用websocket实现web客户端与服务器之间的实时通讯.以下是个简单的demo. 前端页面 <%@ page language="java" contentType=& ...

  2. Android 客户端 okhttp3 与服务器之间的双向验证

    [原文]https://blog.csdn.net/leng_wen_rou/article/details/58596142 本篇是Android 客户端基于okhttp3的网络框架 和后台服务器之 ...

  3. TFTP服务 简单文件传输协议)是TCP/IP协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议,默认端口号为69

    (1)yum安装:tftp.tftp-server   (2)启动tftp CentOS 6 service xinetd restart chkconfig tftp on CentOS 7 sys ...

  4. 转一篇Unity客户端与Java服务器的通信

    转自:http://www.programering.com/a/MTNxYDMwATQ.html A few days ago a friend asked me about Unity3D ins ...

  5. 解如何利用 XML 和 JavaScript Object Notation 在 Ajax 客户端和 Java 服务器之间传输数据(代码)(Oracle)。

    ---------------------------------ajaxUtil----------------------------------------------------------- ...

  6. C#.NET 大型企业信息化系统集成快速开发平台 4.2 版本 - 服务器之间的接口通讯功、信息交换

    1:当远程调用方法时,会有很多种可能性发生.接口调用之后,发生错误是什么原因发生的?反馈给开发人员需要精确.精准.高效率,这时候若能返回出错状态信息的详细信息,接口之间的调用就会非常顺利,各种复杂问题 ...

  7. UNP学习笔记2——从一个简单的ECHO程序分析TCP客户/服务器之间的通信

    1 概述 编写一个简单的ECHO(回复)程序来分析TCP客户和服务器之间的通信流程,要求如下: 客户从标准输入读入一行文本,并发送给服务器 服务器从网络输入读取这个文本,并回复给客户 客户从网络输入读 ...

  8. Portable Basemap Server:多数据源多客户端的底图服务器

    Portable Basemap Server:多数据源多客户端的底图服务器 [poll id=”1″]2014.3.8更新v3.1~在线切片转换为MBTiles时,增加RecreateEmptyCa ...

  9. Mui --- app与服务器之间的交互原理、mui ajax使用

    1.APP与服务器之间的交互原理 app端(客户端)与服务端的交互其实理解起来和容易,客户端想服务器端发送请求,服务器端进行数据运算后返回最终结果.结果可以是多种格式: 1.text 文本格式 2.x ...

随机推荐

  1. leetcode 40 Combination Sum II --- java

    Given a collection of candidate numbers (C) and a target number (T), find all unique combinations in ...

  2. 英语语法最终珍藏版笔记-6“情态动词+have+ done”的含义

    “情态动词+have+ done”的含义 1.Must have done的含义.“must have+过去分词”表示对过去的推测,意思是“一定已经,想必已经,准是已经….”,只用于肯定句中.例如: ...

  3. Andoid 利用ndk-stack定位崩溃代码

    Android NDK自从版本R6开始, 提供了一个工具ndk-stack( 在目录{ndk_root}/中 ). 这个工具能自动分析dump下来的crash log, 将崩溃时的调用内存地址和c++ ...

  4. shell下的作业管理[转]

    作业管理 举例来说,我们在登陆 bash 后, 想要一边复制文件.一边进行数据搜寻.一边进行编译,还可以一边进行 vi 程序撰写! 当然我们可以重复登陆那六个文字介面的终端机环境中,不过,能不能在一个 ...

  5. (转)现代C++函数式编程

    本文转自:http://geek.csdn.net/news/detail/96636     现代C++函数式编程 C++ 函数式编程 pipeline 开发经验 柯里化 阅读2127    作者简 ...

  6. Mysql源码目录结构

    Programs for handling SQL commands. The "core" of MySQL. These are the .c and .cc files in ...

  7. Fixing Poor MySQL Default Configuration Values

    I've recently been accumulating some MySQL configuration variables that have defaults which have pro ...

  8. Java_数组

    一.java数组 1.数组定义:数组就是形象于一个容器(容器即可理解为:装东西的容器) 2.数组特征:数据是连续的,分配大小固定,数组中数据类型完全一致 创建规则:int[] arr = new in ...

  9. Openjudge计算概论-角谷猜想

    /*===================================== 角谷猜想 总时间限制: 1000ms 内存限制: 65536kB 描述 所谓角谷猜想,是指对于任意一个正整数,如果是奇数 ...

  10. 【转】C#程序打包安装部署之添加注册表项

    今天为大家整理了一些怎样去做程序安装包的具体文档,这些文档并不能确保每个人在做安装包的时候都能正确去生成和运行,但是这些文档的指导作用对于需要的朋友来说还是很有必要的,在实际产品的安装部署过程中可能有 ...