• C# 使用Socket发送和接收TCP数据,包含客户端和服务器端,发送Send,监听Listen ,C#运行环境VS2010
  • using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Net; using System.Net.Sockets; ...namespace TcpSocketA

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Net;
    using System.Net.Sockets;
    using System.Text;
    
    namespace TcpSocketApplication
    {
        class SocketTest
        { 
            private static Encoding encode = Encoding.Default;
    
            static void Main(string[] args)
            {
                SocketTest.Listen(8888);//服务端
                //SocketTest.Send("127.0.0.1", 8888, "www.111cn.net");//客户端
            }
    
            /// <summary>
            /// 监听请求
            /// </summary>
            /// <param name="port"></param>
            public static void Listen(int port)
            {
                Socket listenSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                listenSocket.Bind(new IPEndPoint(IPAddress.Any, port));
                listenSocket.Listen(100);
                Console.WriteLine("Listen"+port+"```");
    
                while (true)
                {
                    Socket acceptSocket = listenSocket.Accept();
                    string receiveData = Receive(acceptSocket, 5000); //5 seconds timeout.
                    Console.WriteLine("Receive:" + receiveData);
                    acceptSocket.Send(encode.GetBytes("ok"));
                    DestroySocket(acceptSocket); //import
                }
    
            }
    
    
            /// <summary>
            /// 发送数据
            /// </summary>
            /// <param name="host"></param>
            /// <param name="port"></param>
            /// <param name="data"></param>
            /// <returns></returns>
            public static string Send(string host, int port, string data)
            {
                string result = string.Empty;
                Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                clientSocket.Connect(host, port);
                clientSocket.Send(encode.GetBytes(data));
                Console.WriteLine("Send:" + data);
                result = Receive(clientSocket, 5000 * 2); //5*2 seconds timeout.
                Console.WriteLine("Receive:" + result);
                DestroySocket(clientSocket);
                return result;
            }
            /// <summary>
            /// 接收数据
            /// </summary>
            /// <param name="socket"></param>
            /// <param name="timeout"></param>
            /// <returns></returns>
            private static string Receive(Socket socket, int timeout)
            {
                string result = string.Empty;
                socket.ReceiveTimeout = timeout;
                List<byte> data = new List<byte>();
                byte[] buffer = new byte[1024];
                int length = 0;
                try
                {
                    while ((length = socket.Receive(buffer)) > 0)
                    {
                        for (int j = 0; j < length; j++)
                        {
                            data.Add(buffer[j]);
                        }
                        if (length < buffer.Length)
                        {
                            break;
                        }
                    }
                }
                catch { }
                if (data.Count > 0)
                {
                    result = encode.GetString(data.ToArray(), 0, data.Count);
                }
                return result;
            }
    
            /// <summary>
            /// 销毁Socket对象
            /// </summary>
            /// <param name="socket"></param>
            private static void DestroySocket(Socket socket)
            {
                if (socket.Connected)
                {
                    socket.Shutdown(SocketShutdown.Both);
                }
                socket.Close();
            }
    
    
    
        }
    }
    


    展开全文
  • 发生TCP粘包或拆包有很多原因,现列出常见...3、要发送的数据小于TCP发送缓冲区的大小,TCP将多次写入缓冲区的数据一次发送出去,将会发生粘包。 4、接收数据端的应用层没有及时读取接收缓冲区中的数据,将发生粘包。
  • C# Tcp协议收发数据(TCPClient发,Socket收) 运行这个程序前需要先关闭Windows防火墙,Win7系统关闭防火墙的方法是在控制面板的“控制面板\系统和安全\Windows 防火墙\自定义设置”路径中,将“家庭或...

    C# Tcp协议收发数据(TCPClient发,Socket收)

    运行这个程序前需要先关闭Windows防火墙,Win7系统关闭防火墙的方法是在控制面板的“控制面板\系统和安全\Windows 防火墙\自定义设置”路径中,将“家庭或工作(专用)网络位置设置”和“公用网络位置设置”下面的选项都选到“关闭Windows防火墙(不推荐)”。

    1.界面设计

    左侧为发送数据的输入框,单击“发送数据”把数据发送到指定IP地址的指定端口号。(本例中,IP地址和端口号都被写死到代码中)

    id="iframe_0.07628443697467446" src="data:text/html;charset=utf8,%3Cimg%20id=%22img%22%20src=%22http://static.oschina.net/uploads/space/2014/1127/195033_fxEK_1425762.png?_=5340617%22%20style=%22border:none;max-width:772px%22%3E%3Cscript%3Ewindow.onload%20=%20function%20()%20%7Bvar%20img%20=%20document.getElementById('img');%20window.parent.postMessage(%7BiframeId:'iframe_0.07628443697467446',width:img.width,height:img.height%7D,%20'http://www.cnblogs.com');%7D%3C/script%3E" frameborder="0" scrolling="no" style="margin: 0px; padding: 0px; border-style: none; border-width: initial; width: 498px; height: 412px;">

    2.程序代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
     
    using System.Net;
    using System.Net.Sockets;
    using System.IO;
    using System.Threading;
     
    namespace TcpClientTest
    {
        public partial class FormMain : Form
        {
            public FormMain()
            {
                InitializeComponent();
            }
     
            private void FormMain_Load(object sender, EventArgs e)
            {
                //初始化控件
                txtSendMssg.Text = "测试数据";
     
                //打开Listener开始监听
                Thread thrListener = new Thread(new ThreadStart(Listen));
                thrListener.Start();
            }
     
            private void FormMain_FormClosing(object sender, FormClosingEventArgs e)
            {
                //强制关闭程序(强行终止Listener)
                Environment.Exit(0);
            }
     
            //发送数据
            private void btnSend_Click(object sender, EventArgs e)
            {
                TcpClient tcpClient = new TcpClient();
                //tcpClient.Connect(IPAddress.Parse("170.0.0.78"), 2014);
                tcpClient.Connect(IPAddress.Parse("127.0.0.1"), 2014);
     
                NetworkStream ntwStream = tcpClient.GetStream();
                if (ntwStream.CanWrite)
                {
                    Byte[] bytSend = Encoding.UTF8.GetBytes(txtSendMssg.Text);
                    ntwStream.Write(bytSend, 0, bytSend.Length);
                }
                else
                {
                    MessageBox.Show("无法写入数据流");
     
                    ntwStream.Close();
                    tcpClient.Close();
     
                    return;
                }
     
                ntwStream.Close();
                tcpClient.Close();
            }
     
            //监听数据
            private void Listen()
            {
                Socket listener = new Socket(AddressFamily.InterNetwork, 
                    SocketType.Stream, ProtocolType.Tcp);
                listener.Bind(new IPEndPoint(IPAddress.Any, 2014));
     
                //不断监听端口
                while (true)
                {
                    listener.Listen(0);
                    Socket socket = listener.Accept();
                    NetworkStream ntwStream = new NetworkStream(socket);
                    StreamReader strmReader = new StreamReader(ntwStream);
                    Invoke(new PrintRecvMssgDelegate(PrintRecvMssg), 
                        new object[] { strmReader.ReadToEnd() });
                    socket.Close();
                }
     
                //程序的listener一直不关闭
                //listener.Close();
            }
     
            //线程内向文本框txtRecvMssg中添加字符串及委托
            private delegate void PrintRecvMssgDelegate(string s);
            private void PrintRecvMssg(string info)
            {
                txtRecvMssg.Text += string.Format("[{0}]:{1}\r\n"
                    DateTime.Now.ToLongTimeString(), info);
            }
        }
    }

    3.运行效果

    在发送数据的文本框中分别输入“千山鸟飞绝”、“万径人踪灭”、“孤舟蓑笠翁”、“独钓寒江雪”四句话,输完一句话,单击一次“发送数据”按钮,就可以在接收数据里看到这四句话了。上面代码中,信息的发送时通过TcpClient连接到127.0.0.1的2014端口,信息的接收是通过Listen函数不断监听本机的2014端口实现的。从自己创建的线程中修改控件信息,用到了委托。

    id="iframe_0.43656031298451126" src="data:text/html;charset=utf8,%3Cimg%20id=%22img%22%20src=%22http://static.oschina.net/uploads/space/2014/1127/195245_hML4_1425762.png?_=5340617%22%20style=%22border:none;max-width:772px%22%3E%3Cscript%3Ewindow.onload%20=%20function%20()%20%7Bvar%20img%20=%20document.getElementById('img');%20window.parent.postMessage(%7BiframeId:'iframe_0.43656031298451126',width:img.width,height:img.height%7D,%20'http://www.cnblogs.com');%7D%3C/script%3E" frameborder="0" scrolling="no" style="margin: 0px; padding: 0px; border-style: none; border-width: initial; width: 491px; height: 378px;">

    END

    展开全文
  • C# TCP Socket 分包传送数据,这个代码也是从别的地方淘来的,用的还不错。
  • C# TCP异步数据传输

    2020-07-10 08:07:08
    TCP的接收要发送功能都已经封状成类,大家可以尽量少的代码就可以复用。实现的功能也很简 单,只有一个接收和一个发送。代码中注释满满,大家一起研究吧。希望大家通过这个小程序 熟悉TCP实的基本过程和要求。 VS...
  • 这是我用C#写的一个TCP协议下通信的实例,可以实现多客户通信、数据、文件的传输等功能。。。
  • C# tcp发送十六进制数据 通讯里发送的都是byte,是不存在十六进制数据的,十六进制的全称叫十六进制字符串,也就是说比如F0,转换后就是一个byte字节,值为十进制240,只有当把收到的240转成十六进制字符串时才有F0...
     C# tcp发送十六进制数据
    
    通讯里发送的都是byte,是不存在十六进制数据的,十六进制的全称叫十六进制字符串,也就是说比如F0,转换后就是一个byte字节,值为十进制240,只有当把收到的240转成十六进制字符串时才有F0
    
    只需要用下面方法调用,将得到的byte数组发送出去就行
    public static byte[] HexStringToByteArray(string s)
    {
        s = s.Replace(" ", "");
        byte[] buffer = new byte[s.Length / 2];
        for (int i = 0; i < s.Length; i += 2)
            buffer[i / 2] = (byte)Convert.ToByte(s.Substring(i, 2), 16);
        return buffer;
    }
     
    示例来说就是
    string datapacket = "f02e00010200ff";
    byte[] array=HexStringToByteArray(datapacket); 
               
     socConnection.Send (array);

     

    展开全文
  • TCP多个客户端与服务端数据传输,c#winfrom源码,有注释,支持局域网,服务器端客服端分开的,vs2017调试
  • TCP数据报帧格式

    2017-06-13 14:00:46
    用户应用程序采用首先调用TCP(或UDP),然后将应用程序数据递交给TCP这一方式,在IP网络上传送数据TCP将这些数据打包分段并调用IP模块向目的主机传送每个数据段。接收方的TCP将段中的数据放入接收缓冲器,然后将...
     

    TCP报文格式

    传输控制协议(TCP)向上与用户应用程序进程接口,向下与网络层协议IP接口。用户应用程序采用首先调用TCP(或UDP),然后将应用程序数据递交给TCP这一方式,在IP网络上传送数据。TCP将这些数据打包分段并调用IP模块向目的主机传送每个数据段。接收方的TCP将段中的数据放入接收缓冲器,然后将段重装为应用程序数据,再将这些数据发送到目的的应用程序进程。
           尽管TCP和UDP都使用相同的网络层(IP),TCP却向应用层提供与UDP完全不同的服务。
        TCP提供一种面向连接的、可靠的字节流服务。

     

     TCP报文格式如下图:  

    TCP数据报帧格式 - wangshh03 - 王世宏的博客

     

    图2.TCP数据报格式

    源端口号(16位),标识主机上发起传送的应用程序;目的端口(16位)标识主机上传送要到达的应用程序。源端和目的端的端口号,用于寻找发端和收端应用进程。这两个值加上I P首部中的源端I P地址和目的端I P地址唯一确定一个T C P连接。一个I P地址和一个端口号有时也称为一个插口(socket),插口对(socket pair)(包含客户I P地址、客户端口号、服务器 I P地址和服务器端口号的四元组 )可唯一确定互联网络中每个T C P连接的双方。IP+TCP端口唯一确定一个TCP连接。

    TCP协议通过使用"端口"来标识源端和目标端的应用进程。端口号可以使用0到65535之间的任何数字。在收到服务请求时,操作系统动态地为客户端的应用程序分配端口号。在服务器端,每种服务在"众所周知的端口"(Well-Know Port)为用户提供服务。

    ●序号字段:占32比特。用来标识从TCP源端向TCP目标端发送的数据字节流,它表示在这个报文段中的第一个数据字节。
      ●确认号字段:占32比特。只有ACK标志为1时,确认号字段才有效。它包含目标端所期望收到源端的下一个数据字节。
      ●头部长度字段:占4比特。给出头部占32比特的数目。没有任何选项字段的TCP头部长度为20字节;最多可以有60字节的TCP头部。

    预留:由跟在数据偏移字段后的6位构成,预留位通常为0.

    ●标志位字段(U、A、P、R、S、F):占6比特。各比特的含义如下:
       ◆URG:紧急指针(urgent pointer)有效。
       ◆ACK:确认序号有效。
       ◆PSH:接收方应该尽快将这个报文段交给应用层。
       ◆RST:重建连接。
       ◆SYN:发起一个连接。
       ◆FIN:释放一个连接。
      ●窗口大小字段:占16比特。此字段用来进行流量控制。单位为字节数,这个值是本机期望一次接收的字节数。
      ●TCP校验和字段:占16比特。对整个TCP报文段,即TCP头部和TCP数据进行校验和计算,并由目标端进行验证。
      ●紧急指针字段:占16比特。它是一个偏移量,和序号字段中的值相加表示紧急数据最后一个字节的序号。
      ●选项、填充字段:占32比特。可能包括"窗口扩大因子"、"时间戳"等选项。

    展开全文
  • IP头和TCP数据结构(C#版) public struct ip_hdr //IP头 { public byte h_lenver; //4位首部长度+4位IP版本号 public byte tos; //8位服务类型TOS public ushort total_len; //16位总长度(字
    IP头和TCP头数据结构(C#版)

           public struct ip_hdr   //IP头
            {
                public byte h_lenver; //4位首部长度+4位IP版本号 
                public byte tos; //8位服务类型TOS 
                public ushort total_len; //16位总长度(字节) 
                public ushort ident; //16位标识 
                public ushort frag_and_flags; //3位标志位+13报片偏移 
                public byte ttl; //8位生存时间 TTL 
                public byte proto; //8位协议 (TCP, UDP 或其他) 
                public ushort checksum; //16位IP首部校验和 
                public uint sourceIP; //32位源IP地址 
                public uint destIP; //32位目的IP地址 
            }
            public struct tcp_hdr  //TCP头
            {
                public ushort th_sport; //16位源端口 
                public ushort th_dport; //16位目的端口 
                public uint th_seq; //32位序列号 
                public uint th_ack; //32位确认号 
                public byte th_lenres; //4位首部长度/6位保留字 
                public byte th_flag; //6位标志位 
                public ushort th_win; //16位窗口大小 
                public ushort th_sum; //16位校验和 
                public ushort th_urp; //16位紧急数据偏移量
            }  
    展开全文
  • c#TCP发送结构体数据

    2019-04-25 17:07:12
    c#TCP发送结构体数据byte数组与结构体数据相互转换结构体数据定义服务端客户端 byte数组与结构体数据相互转换 using System.Collections; using System.Collections.Generic; using System; using System.IO; using ...
  • c#TCP传输文件

    2020-01-06 19:22:30
    本文转载自:https://www.cnblogs.com/bianlan/archive/2012/08/10/2632349.html 作者:bianlan 转载请注明该声明...一旦通信双方建立了TCP连接,连接中的任何一方都能向对方发送数据和接受对方发来的数据TCP协议...
  • C#TCP 通信(TCP发送16进制)
  • 基于C# TCP 的摄像头的图像视频传输
  • C#写的TCP服务器端程序,支持多个TCP客户端连入,程序当中有一个监听进程不断监听来自客户端的TCP连接请求,请求建立后交由一个专门的处理进程来处理接收到的数据(在本程序当中只是简单的将收到的数据返回给客户端...
  • 这次经历大致分为以下几个阶段:一、C#基本操作学习和简单TCP通信实现 先前有使用MFC的经历,因此对于C#的控件使用比较容易上手,每次使用之前可通过网络查询到控件使用方法,直接拖拽就OK,唯一不适应的就是C#全部...
  • C#菜鸟做这个东东竟然花了快三天的时间了,真是菜,菜,菜~~~ 下面是我用C#写的 一个简单的TCP通信,主要的功能有: (1) 多个客户端与服务器间的数据交流 (2)可以实现群发的功能 (3)客户端与服务端可以...
  • c# TCP程序设计

    2019-04-24 07:42:15
    (3)TCP可以保证从一端将数据传送至另一端,数据能够实时的送达,而且送达的数据排列顺序和送出时的顺序相同。 (4)面向连接的、可靠的、基于字节流的传输通信协议。 TCP通信就像两个人电话通话,必须先播对方...
  • // 接收数据,并返回数据的长度; } catch (SocketException se) { ShowMsg("异常:" + se.Message); dictSocket.Remove(sokClient.RemoteEndPoint.ToString()); dictThread.Remove(sokClient....
1 2 3 4 5 ... 20
收藏数 39,990
精华内容 15,996