c# socket传输struct类型

data结构体类型

public struct datas
    {

public string test1;

public string test2;
    }

//socket服务器端

public void SocketServer()
        {
            Socket listener = new Socket(AddressFamily.InterNetwork,
                                         SocketType.Stream,
                                         ProtocolType.Tcp);
            listener.Bind(new IPEndPoint(getLocalmachineIPAddress(), 2323));
            listener.Listen(10);

while (true)
            {
                Socket socket = listener.Accept();
                string receivedValue = string.Empty;

while (true)
                {
                    byte[] receivedBytes = new byte[1024];
                    int numBytes = socket.Receive(receivedBytes);
                    Console.WriteLine("Receiving .");
                    receivedValue += Encoding.ASCII.GetString(receivedBytes,
                                      0, numBytes);
                    if (receivedValue.IndexOf("[FINAL]") > -1)
                    {
                        break;
                    }
                }

byte[] buffer = new byte[1024000];
                if (receivedValue.Contains("get gateway rooms"))
                {
                    MemoryStream mStream = new MemoryStream();
                    BinaryFormatter bf = new BinaryFormatter();
                    datas sendData;
                    sendData.m_DictRooms = FormMain.DictRooms;
                    sendData.m_DictRoomNameText = FormMain.DictRoomNameText;
                    bf.Serialize(mStream, sendData);
                    mStream.Flush();
                    mStream.Position = 0;
                    mStream.Read(buffer, 0, buffer.Length);
                }
                //string replyValue = "Message successfully received.";
                //byte[] replyMessage = Encoding.ASCII.GetBytes(replyValue);
                socket.Send(buffer);
                socket.Shutdown(SocketShutdown.Both);
                socket.Close();
            }
            listener.Close();
        }

//socket客户端

private void socketClient(object sender, EventArgs e)
        {
            if (comboBoxGateway.SelectedItem != null)
            {
                byte[] receivedBytes = new byte[1024000];
                IPHostEntry ipHost = Dns.Resolve(comboBoxGateway.SelectedItem.ToString());
                IPAddress ipAddress = ipHost.AddressList[0];
                IPEndPoint ipEndPoint = new IPEndPoint(ipAddress, 2323);

Socket sk = new Socket(AddressFamily.InterNetwork,
                                             SocketType.Stream,
                                             ProtocolType.Tcp);
                sk.Connect(ipEndPoint);
                string sendingMessage = "get gateway rooms";
                byte[] forwardMessage = Encoding.ASCII.GetBytes(sendingMessage
                   + "[FINAL]");
                sk.Send(forwardMessage);
                int totalBytesReceived = sk.Receive(receivedBytes);
                MemoryStream mStream = new MemoryStream();
                //ReceiveDatas = bf.Deserialize(receivedBytes,mStream );
                mStream.Write(receivedBytes, 0, receivedBytes.Length);
                mStream.Flush();
                mStream.Position = 0;
                BinaryFormatter bf = new BinaryFormatter();
                if (mStream.Capacity > 0)
                {
                   datas receiveDatas = (datas)bf.Deserialize(mStream);
                }
                sk.Shutdown(SocketShutdown.Both);
                sk.Close();

//加载新选择的网关房间
                InitializeSelectRoomsTab();
            }
        }

时间: 2024-11-06 12:07:44

c# socket传输struct类型的相关文章

C++ socket 传输不同类型数据的四种方式

使用socket传输组织好的不同类型数据,有四种不同的方式(我知道的嘿嘿): a. 结构体 b. Json序列化 c. 类对象 d. protobuf 下面逐一整理一下,方便以后进行项目开发. 1. 使用结构体 假设需要传送的结构体如下: struct person { char name[20]; // 注意:CPU访问内存的时候,对访问地址有对齐的要求,一般为2的幂次方.所以,有的数据被填充,以满足对齐要求. int age; float high; }; 可在发送数据的地方对数据进行处理,

[C#技术参考]Socket传输结构数据

最近在做一个机器人项目,要实时的接收机器人传回的坐标信息,并在客户端显示当前的地图和机器人的位置.当然坐标的回传是用的Socket,用的是C++的结构体表示的坐标信息.但是C#不能像C++那样很easy的把字节数组byte[]直接的转换成结构,来发送和接收.在C#中要多做一些工作.但是在C或者C++中这是一件很容易的事,只需要一个函数: void *memcpy(void *dest, const void *src, size_t n);//从源src所指的内存地址的起始位置开始拷贝n个字节到

Python Socket传输文件

发送端可以不停的发送新文件,接收端可以不停的接收新文件. 例如:发送端输入:e:\visio.rar,接收端会默认保存为 e:\new_visio.rar,支持多并发,具体实现如下: 接收端: 方法一: #-*- coding: UTF-8 -*- import socket,time,SocketServer,struct,os,thread host='192.168.50.74' port=12307 s=socket.socket(socket.AF_INET,socket.SOCK_S

unity探索者之socket传输protobuf字节流(一)

近期在做一个棋牌项目,需要用到socket传输protobuf字节流,在网上找了一些博客和文章后发现,没有特别全面的,所以把自己研究的全部源码拿出来和大家分享,因为刚开始做,可能会有不足的地方,欢迎拍砖~~ 这一篇主要是protocol buffer文件的序列化和解析,废话不多说了,直接上干货 1 /// <summary> 2 /// 将消息序列化为二进制的方法 3 /// </summary> 4 /// <param name="model">

Socket传输结构体数据注意事项

[1 背景] 在Socket通信中,要传输结构化的数据或者要进行协议数据传输的时候,发送端必须要构造结构体进行数据传输. 接收端也必须通过同样的结构体进行解析. 但Socket传输结构体数据时候,稍有不慎就会出现:1)解析数据出错:2)接收数据不完整:3)解析为乱码等的Bug. [2 举例] 如下是接收端解析数据为乱码甚至崩溃的一类常见错误. 结构体也就是一段连续的内存. 但是类似如下的结构体: typedef struct _PER_SPIDER_INFO { UINT nTimeDelay;

c++ Socket传输

服务端-监听接收 #include "winsock2.h" #pragma comment(lib,"WS2_32.LIB") int bufi; class mserver{ private: SOCKET ssock,csock; sockaddr_in saddr,caddr; int len; char buf[4096]; public: mserver(){ } mserver(int port,int maxclient){ saddr.sin_fa

sockaddr struct 类型重定义

windows.h和winsock2.h有类型重定义我是知道的,本来就一个库来说没问题,把winsock2放到windows.h前或先定义WIN32_LEAN_AND_MEAN都能解决问题但现的出了问题,自己写的一个库里要用到ws2tcpip,这个头文件第一个包含的头文件就是winsock2.h把它放到windows前,库是能成功编译了,但当我在一个wxWidgets中调用它时,又出现那个让人厌烦的错误 ““sockaddr”: “struct”类型重定义”明显是wxWidgets先包含了win

C# Socket传输大文件

1.基础类TransferFiles,client和server都需要 using System; using System.Collections.Generic; using System.Text; using System.Net; using System.Net.Sockets; using System.Windows.Forms; namespace Server { public class TransferFiles { public static int SendData(

Java使用Socket传输文件遇到的问题(转)

1.写了一个socket传输文件的程序,发现传输过去文件有问题.找了一下午终于似乎找到了原因,记录下来警示一下: 接受文件的一端,向本地写文件之前使用Thread.sleep(time)休息一下就解决了问题. 个人认为可能是传输过程中,接收端向磁盘写速度有点慢,被后面的覆盖导致错误. //---------------------------------------------------------------------------------------------------------