// 服务器

# 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. magic矩阵 分类: 数学 2015-07-31 22:56 2人阅读 评论(0) 收藏

    魔方矩阵 魔方矩阵是有相同的行数和列数,并在每行每列.对角线上的和都相等.你能构造任何大小(除了2x2)的魔方矩阵. 1.历史       魔方又称幻方.纵横图.九宫图,最早记录于我国古代的洛书.据说 ...

  2. arraylist 转json

    java.lang.ClassNotFoundException: org.apache.commons.lang.exception.NestableRuntimeException 标签: cla ...

  3. 解决Ubuntu下Sublime Text 3无法输入中文

    前言 sublime很好用,但是ubuntu下不能输入中文,这是一个很大的问题.不知道为什么开发着一直也不解决,好在还是有高手在,总能找到方法.网上方法很多,但是也很乱,现在我将自己的经验总结一下. ...

  4. PHP-通过strace定位故障原因

    俗话说:不怕贼偷,就怕贼惦记着.在面对故障的时候,我也有类似的感觉:不怕出故障,就怕你不知道故障的原因,故障却隔三差五的找上门来. 十一长假还没结束,服务器却频现高负载,Nginx出现错误日志: co ...

  5. rac 11g_第二个节点重启后无法启动实例:磁盘组dismount问题

    原创作品,出自 "深蓝的blog" 博客,欢迎转载,转载时请务必注明以下出处,否则追究版权法律责任. 深蓝的blog:http://blog.csdn.net/huangyanlo ...

  6. 大白话系列之C#委托与事件讲解(三)

    今天我接着上面的3篇文章来讲一下,为什么我们在日常的编程活动中遇到这么多sender,EventArgs e 参数:protected void Page_Load(object sender, Ev ...

  7. OCR是用来做什么的

    OCR(Optical Character Recognition,光学字符识别)是指电子设备(例如扫描仪或数码相机)检查纸上打印的字符,通过检测暗.亮的模式确定其形状,然后用字符识别方法将形状翻译成 ...

  8. 09-Java 工程结构管理

    (一)Java 工程结构管理 1.什么是Build Path: -- 一般包括:JRE运行时库 第三方功能扩展库(*.jar 格式文件) 其他的工程 其他的源代码或Class 文件 为什么使用~ :通 ...

  9. rsyslog

    http://www.rsyslog.com/ http://www.rsyslog.com/doc/v5-stable/troubleshooting/troubleshoot.html RSYSL ...

  10. Web Pages razor 学习

    1. Web Pages razor Web Pages 是三种 ASP.NET 编程模型中的一种,用于创建 ASP.NET 网站和 web 应用程序. 其他两种编程模型是 Web Forms 和 M ...