C#的socket:tcp/udp/unix

Socket 之 UDP 协议通信-c#实现 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。 TCP协议就相当于打电话,只有打通了,对方接了才算打电话成功。 但UDP更像发短信,我只要发出去了,就算成功,不管你看没看到。 UDP的用途很广泛,比如网上看球赛直播,用户更注重实时性,所以可以采用UDP协议,过程中丢一两帧,也无所谓,只要能跟上直播的速度就行。而且UDP相对TCP的一个优点就是:速度快(不用得到响应)。当然缺点就是:安全性低(过程中丢了数据你也不知道)...... 阅读详情

MS还为我们提供了几个助手类:TcpClient类、TcpListener类、UDPClient类。这几个类简化了一些操作

以下是原生c#的原生socket编写上述服务

tcp_socket

server

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

namespace tcpserver
{
    /// <summary>
    /// Class1 的摘要说明。
    /// </summary>
    class server
    {
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main(string[] args)
        {
            //
            // TODO: 在此处添加代码以启动应用程序
            //
            int recv;//用于表示客户端发送的信息长度
            byte[] data=new byte[1024];//用于缓存客户端所发送的信息,通过socket传递的信息必须为字节数组
            IPEndPoint ipep=new IPEndPoint(IPAddress.Any,9050);//本机预使用的IP和端口
            Socket newsock=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
            newsock.Bind(ipep);//绑定
            newsock.Listen(10);//监听
            Console.WriteLine("waiting for a client");
            Socket client=newsock.Accept();//当有可用的客户端连接尝试时执行,并返回一个新的socket,用于与客户端之间的通信
            IPEndPoint clientip=(IPEndPoint)client.RemoteEndPoint;
            Console.WriteLine("connect with client:"+clientip.Address+" at port:"+clientip.Port);
            string welcome="welcome here!";
            data=Encoding.ASCII.GetBytes(welcome);
            client.Send(data,data.Length,SocketFlags.None);//发送信息
            while(true)
            {//用死循环来不断的从客户端获取信息
                data=new byte[1024];
                recv=client.Receive(data);
                Console.WriteLine("recv="+recv);
                if (recv==0)//当信息长度为0,说明客户端连接断开
                    break;
                Console.WriteLine(Encoding.ASCII.GetString(data,0,recv));
                client.Send(data,recv,SocketFlags.None);
            }
            Console.WriteLine("Disconnected from"+clientip.Address);
            client.Close();
            newsock.Close();

        }
    }
}

client

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

namespace tcpclient
{
    /// <summary>
    /// Class1 的摘要说明。
    /// </summary>
    class client
    {
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main(string[] args)
        {
            //
            // TODO: 在此处添加代码以启动应用程序
            //
            byte[] data=new byte[1024];
            Socket newclient=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
            Console.Write("please input the server ip:");
            string ipadd=Console.ReadLine();
            Console.WriteLine();
            Console.Write("please input the server port:");
            int port=Convert.ToInt32(Console.ReadLine());
            IPEndPoint ie=new IPEndPoint(IPAddress.Parse(ipadd),port);//服务器的IP和端口
            try
            {
                //因为客户端只是用来向特定的服务器发送信息,所以不需要绑定本机的IP和端口。不需要监听。
                newclient.Connect(ie);
            }
            catch(SocketException e)
            {
                Console.WriteLine("unable to connect to server");
                Console.WriteLine(e.ToString());
                return;
            }
            int recv = newclient.Receive(data);
            string stringdata=Encoding.ASCII.GetString(data,0,recv);
            Console.WriteLine(stringdata);
            while(true)
            {
                string input=Console.ReadLine();
                if(input=="exit")
                    break;
                newclient.Send(Encoding.ASCII.GetBytes(input));
                data=new byte[1024];
                recv=newclient.Receive(data);
                stringdata=Encoding.ASCII.GetString(data,0,recv);
                Console.WriteLine(stringdata);
            }
            Console.WriteLine("disconnect from sercer");
            newclient.Shutdown(SocketShutdown.Both);
            newclient.Close();

        }
    }
}

udp_socket

server

using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.Sockets;
namespace SimpleUdpSrvr
{
    class Program
    {
        static void Main(string[] args)
        {
            int recv;
            byte[] data = new byte[1024];
            IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 9050);//定义一网络端点
            Socket newsock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);//定义一个Socket
            newsock.Bind(ipep);//Socket与本地的一个终结点相关联
            Console.WriteLine("Waiting for a client..");

            IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);//定义要发送的计算机的地址
            EndPoint Remote = (EndPoint)(sender);//
            recv = newsock.ReceiveFrom(data, ref Remote);//接受数据           
            Console.WriteLine("Message received from{0}:", Remote.ToString());
            Console.WriteLine(Encoding.ASCII.GetBytes(data,0,recv));

            string welcome = "Welcome to my test server!";
            data = Encoding.ASCII.GetBytes(welcome);
            newsock.SendTo(data, data.Length, SocketFlags.None, Remote);
            while (true)
            {
                data = new byte[1024];
                recv = newsock.ReceiveFrom(data, ref Remote);
                Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv));
                newsock.SendTo(data, recv, SocketFlags.None, Remote);
            }
        }
    }
}

client

using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.Sockets;
namespace SimpleUdpClient
{
    class Program
    {
        static void Main(string[] args)
        {
            byte[] data = new byte[1024];//定义一个数组用来做数据的缓冲区
            string input, stringData;
            IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9050);
            Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            string welcome = "Hello,are you there?";
            data = Encoding.ASCII.GetBytes(welcome);
            server.SendTo(data, data.Length, SocketFlags.None, ipep);//将数据发送到指定的终结点

            IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
            EndPoint Remote = (EndPoint)sender;
            data = new byte[1024];
            int recv = server.ReceiveFrom(data, ref Remote);//接受来自服务器的数据

            Console.WriteLine("Message received from{0}:", Remote.ToString());
            Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv));
            while (true)//读取数据
            {
                input = Console.ReadLine();//从键盘读取数据
                if (input == "text")//结束标记
                {
                    break;
                }
                server.SendTo(Encoding.ASCII.GetBytes(input), Remote);//将数据发送到指定的终结点Remote
                data = new byte[1024];
                recv = server.ReceiveFrom(data, ref Remote);//从Remote接受数据
                stringData = Encoding.ASCII.GetString(data, 0, recv);
                Console.WriteLine(stringData);
            }
            Console.WriteLine("Stopping client");
            server.Close();
        }
    }
}     

unix_socket

using System;
using System.Net.Sockets;
using System.Threading.Tasks;

class Program
{
    static void Main(string[] args)
    {
        var path = "/tmp/foo.sock";

        // client
        Task.Run(async () =>
        {
            // wait 2 seconds
            await Task.Delay(2000);

            using (var socket = new Socket(AddressFamily.Unix, SocketType.Stream, ProtocolType.Unspecified))
            {
                socket.Connect(new UnixDomainSocketEndPoint(path));

                // send hello world
                var dataToSend = System.Text.Encoding.UTF8.GetBytes("Hello-world!");

                socket.Send(dataToSend);
            }
        });

        // Server
        {
            // delete file if it exists
            if (System.IO.File.Exists(path))
                System.IO.File.Delete(path);

            var socket = new Socket(AddressFamily.Unix, SocketType.Stream, ProtocolType.Unspecified);
            socket.Bind(new UnixDomainSocketEndPoint(path));
            socket.Listen(5);
            Console.WriteLine("Server started waiting for client to connect...");

            var s = socket.Accept();

            Console.WriteLine("Client connected");

            var buffer = new byte[1024];
            var numberOfBytesReceived = s.Receive(buffer, 0, buffer.Length, SocketFlags.None);

            var message = System.Text.Encoding.UTF8.GetString(buffer, 0, numberOfBytesReceived);

            Console.WriteLine($"Received: {message}");
        }

    }
}

 

【Socket】Python UDP和TCP的socket实例 [TOP]Socket又称”套接字”,应用程序通常通过”套接字”向网络发出请求或者应答网络请求。 具体定义看百科 socket有两种,一种基于UDP,一种基于TCP。UDP是面向非连接的,传递的是数据报,每次传递都要指定目的地址端口;而TCP是面向连接的,经过三次握手协议建立起连接,所以不用每次都指定目的地址端口。当然还有很多的区别,这里就不一一列举。一般服务器端和客户端各有一个socket,你 阅读详情

相关推荐

C# WinForm基础三 socket网络编程

一、Socket网络编程 概念:Socket ocket的英文原义是“孔”或“插座”。作为BSD UNIX的进程通信机制,取后一种意思。通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信。

tufeiax的专栏 3786

C# socket(TCP/IP协议)通信

C# socket(TCP/IP协议)通信 转载https://www.cnblogs.com/z178443085/p/13757579.html ##服务端 using System; using System.Text; using System.Net; using System.Net.Sockets; namespace socketServer { class Program { //1、创建一个用于监听连接的Socket对像; //2、将服务器的字符串ip地址转换为网络地址(IPAddres

p878934160的博客 1204

Unity——Socket

Socket套接字的作用 它是C#提供给我们用于网络通信的一个类(在其他语言当中也有对应的Socket类) 类名:Socket 命名空间:using System.Net.Sockets Socket套接字是支持TCP/IP网络通信的基本操作单位 一个套接字对象包含 1.本机的IP地址和端口 2.对方主机的IP地址和端口 ...

m0_51743362的博客 2450

socket编程学习笔记, Unix Socket和Windows Socket

1,关于Unix Socket1.1 什么是Socket? Socket是网络文件描述符。在基于Socket的编程技术中,用户不直接访问发送和接收包的网络接口设备,而是建立一个中间文件描述符来处理编程接口到网络的操作。1.2 Socket包括哪些内容? 一个特殊的通信域,比如一个网络连接 一个特殊的通信类型,比如流或者数据报 一个特殊的协议,比如TCP或者UDP1.3 Unix的S

技术天地 3119

C#实现局域网双向通信(附完整源码)

C#实现局域网双向通信(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 546

基于Unix域Socket收发Demo程序示例

基于Unix Domain的Socket服务器和客户端简单收发Demo程序实例。与传统的Socket相比较,Unix Domain Socket不走网络层和传输层,是通过文件的方式进行socket传输,这样大大减少了内部资源消耗,提高效率。

C#Socket通信原理(基础篇)

在本地可以通过进程PID来唯一标识一个进程,但是在网络中这是行不通的。其实TCP/IP协议族已经帮我们解决了这个问题,网络层的“ip地址”可以唯一标识网络中的主机,而传输层的“协议+端口”可以唯一标识主机中的应用程序(进程)。这样利用三元组(ip地址,协议,端口)就可以标识网络的进程了,网络中的进程通信就可以利用这个标志与其它进程进行交互。 什么是Socket? 通俗一点的说法 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。 建立网络通信连接至少要一对端口号(so

qq_43231176的博客 748

《UE4游戏开发》之 《音效系统的实现》

音效系统需要负责管理什么事情: 1.1 确定声音控制的分类:如背景音乐、技能音效、界面音效、角色配音等,不同游戏对声音有不同的分类 1.2 控制每个分类的声音的开启与关闭,以及调节每个分类声音的大小 解决如何分类: 2.1 首先需要知道ue4为声音分类提供了什么:SoundClass通常需要一个根分类【SC_RPG_Master】,便于总体控制音效,以及指定引擎默认启动的音效 打开SoundClass资产【SC_RPG_Master】,对根控制的设置,将逐级传递并按比例进行设置,以此达到控制一类声音的目的.

qq_21919621的博客 2126

UNIX Domain Socket使用

Unix domain socket 或者 IPC socket是一种终端,可以使同一台操作系统上的两个或多个进程进行数据通信。与管道相比,Unix domain sockets 既可以使用字节流,又可以使用数据队列,而管道通信则只能使用字节流。Unix domain sockets的接口和Internet socket很像,但它不使用网络底层协议来通信。Unix domain socket 的功能是POSIX操作系统里的一种组件。

u012633462的专栏 7697

工业机器人关节拆装流程_一文读懂模块化直驱电机及机器人关节模组

私信“干货”二字,即可领取138G伺服与机器人专属及电控资料!如果说芯片是智能行业最为重要的核心元件,那么电机几乎可以说是支撑了整个自动化和大工业生产以及现代社会最为重要的部件,全世界90%的能源是由电机发出来的,而70%是由电机消耗调的,电机可以说是整个人类社会能源循环的占有绝对地位的产品。普通伺服电机伺服电机其实已经算是电动机中比较高端的类型,特别是永磁同步类型的伺服电机,由于其启动快速,惯量...

weixin_32159771的博客 2153

UG NX与PLC-1500的在环虚拟测试

TIA、PLCSIM、NetToPLCsim、KEPServerEX以及UG NX的在环虚拟测试

lvtlvtlvtlvt的博客 4217

【C#网络编程】Socket,TCP,UDP

上一章节让我们对于套接字的概念有了一些了解,对于如何使用还是有所疑惑。下面让我们去学习一下这一章节,相信学习完这一章,你的疑惑一定能解开不少,让我们开始吧。TCP 旨在检测 IP 提供的主机到主机通道中可能发生的丢失、重复和其他错误,并从中恢复。TCP 提供了一个可靠的字节流通道,因此应用程序不必处理这些问题。它是一个面向连接的协议:在使用它进行通信之前,两个程序必须首先建立 TCP 连接,这涉及在两台通信计算机上的 TCP 实现之间完成握手消息的交换。使用 TCP 类似于文件输入/输出 (I/O)。

weixin_43676950的博客 2127

基于YOLOv8的铁路轨道异物检测系统设计与实现

目标检测是计算机视觉领域的核心任务之一,旨在识别图像中特定目标的位置和类别。传统方法主要依赖手工特征(如HOG、SIFT等)和分类器(如SVM),而深度学习方法通过卷积神经网络自动学习特征表示,显著提升了检测性能。YOLO(You Only Look Once)系列算法作为单阶段目标检测的代表,以其高效的检测速度著称。YOLOv8是Ultralytics公司于2023年发布的最新版本,在精度和速度上都有进一步提升。

YOLO 574

Linux Socket 编程与 TCP/UDP协议流程

本文系综合网络上多个博客的内容,整理而成,以方便自己将来查阅 1、网络中进程之间如何通信? 本地的进程间通信(IPC)有很多种方式,但可以总结为下面4类: 消息传递(管道、FIFO、消息队列) 同步(互斥量、条件变量、读写锁、文件和写记录锁、信号量) 共享内存(匿名的和具名的) 远程过程调用(Solaris门和Sun RPC) 我们要讨论的是网络中

banbanlin的专栏 4828

小众但实用:Python爬取钉钉/企业微信消息,实现办公数据自动化采集(完整版)

钉钉/企业微信的办公数据自动化采集,属于「小众但极度实用」的Python技巧——它不像爬虫爬取电商/网页数据那样被广泛关注,但能直接解决职场人的「刚需痛点」,把每天1-2小时的手动数据整理工作,变成「一键自动化完成」。这套技巧的核心价值,不在于「技术有多高深」,而在于「能真正落地、能真正提升效率」—— 几行简单的Python代码,就能解放双手,让你从繁琐的重复工作中解脱出来,专注于更有价值的核心工作。更重要的是:所有的技术和代码,都是基于「合规合法」的前提,守住了技术的底线,也守住了职场的原则。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1929

rk3576 点亮 LCD(eDP)

RK3576 处理器集成了对 **eDP (Embedded DisplayPort)** 接口的支持,主要用于驱动嵌入式或笔记本电脑的内置屏幕。支持 **eDP 1.3 版本协议**, 最大可支持 ****4K@120Hz**。

weixin_35723192的博客 352

Socket编程(高并发TCP/UDP)

Socket编程(TCP/UDP) <sys/socket.h> 如有问题请多多指教, 1.Tcp模式(由客户端链接服务器) 2.UDP模式: 3.多线程tcp 4.多进程tcp 首先我们需要知道tcp和udp的协议的特点。 1.Tcp模式(由客户端链接服务器) 服务器端 客户端 socket() 创建套接字...

weixin_42078660的博客 1138

Win10 系统下VisualStudio2022 配置Open3D-0.18.0(C++)

Win10 系统下VisualStudio2022 配置Open3D-0.18.0

点云侠的博客 2655

Socket通信(以C#为例)

目录: 1、为什么要用Socket? 2、什么是Socket? 3、Socket通信的基本原理 4、Socket应用示例 正文: 1、为什么要用Socket? 我们深谙信息交流的价值,网络中进程之间是如何通信,我们每天打开浏览器浏览网页时,浏览器的进程怎么与web服务器通信的?当你用QQ聊天时,QQ进程怎么与服务器或你好友所在的QQ进程通信?这些都得靠socket。 就目前而言,几乎所有的应用程序都是采用socket,而现在又是网络时代,网络中进程通信是无处不在,这就是为什么说“...

weixin_45839478的博客 9266

人形机器人电源系统硬件开发:从原理图设计到PCB布局的完整流程

人形机器人是“移动的智能终端”,其电源系统如同“心脏+血管”:既要为大脑(主控)、肌肉(电机)、感官(传感器)提供稳定能量,又要在有限体积内应对高动态负载(如跳跃时电机瞬间大电流)。本文聚焦“硬件开发”维度,覆盖从需求分析到PCB制板的完整流程,适合硬件工程师、机器人爱好者快速掌握工程实战方法。

AI天才研究院 2173

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

C# TCP和UDP编程

看到这个题目,是不是很眼熟?在博客园里搜下,保证会发现关于这个东东的文章实在是太多了~~~真得是没有写得必要,而且我也有点懒得去琢磨字句。(看到这,肯定得来个转折的了,不然就看不到下文了,不是吗)但是,为了自己下一篇要写的文章做参考,还是有必要先补充一下socket基础知识。       注意:如果你已经接触过socket,那就没什么必要耽误时间看下去了。另外,如果发现其中任何错误,欢迎直接指出

Godsight的博客 2798

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

TCP 和 UDP 在socket编程中的区别(转载)

一、TCP与UDP的区别 基于连接与无连接   对系统资源的要求(TCP较多,UDP少)   UDP程序结构较简单   流模式与数据报模式   TCP保证数据正确性,UDP可能丢包   TCP保证数据顺序,UDP不保证   部分满足以下几点要求时,应该采用UDP 面向数据报方式 网络数据大多为短消息   拥有大量Client   对数据安全性无特殊要求   网络负担非常重,但对响应速度要求高   具体编程时的区别 socket()的参数不同   UDP Server不需要调用listen和accept   

LIN943168247的博客 1642

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

TCP/UDP编程基础

目录一.Socket1.TCP/IP2.socket3.socket通信流程二.UDP通信1.项目创建过程2.各部分代码发送端接受端3.结果三、Form窗口程序项目创建客户端代码3.运行结果4.端口扫描单线程多线程四、抓包分析五、总结六.参考文献 一.Socket 1.TCP/IP 要想理解socket首先得熟悉一下TCP/IP协议族, TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,定义了主机如何连入因特网及数据如何再

louderIII的博客 1360

socket 基础编程 UDP 协议 TCP 协议 socket 编程流程图 bind listen accept connect send recv sendto recvfrom

粉丝不过W socket 基础编程 函数说明 socket:建立一个 socket 连接,可指定 socket 类型等信息。在建立socket连接之后,可对 socketadd 或 sockaddr_in 进行初始化,以保存所建立的 socket 信息 bind...

记录点点滴滴 1570

python unix socket_python3实现unix域协议(tcp、udp)通讯

socket API原本是为网络通讯设计的,但后来在socket的框架上发展出一种IPC机制,就是UNIXDomain Socket。虽然网络socket也可用于同一台主机的进程间通讯(通过loopback地址127.0.0.1),但是UNIX Domain Socket用于IPC更有效率:不需要经过网络协议栈,不需要打包拆包、计算校验和、维护序号和应答等,只是将应用层数据从一个进程拷贝到另一个进...

weixin_39917211的博客 698

SOCKET与TCP,UDP有什么关系?

SOCKET是Java实现数据通信的API。 这个词语起源于BSD相关的UNIX,程序开发中用于process之间通信的API名称。 TCP/UDP是OSI模型的第四层中定义的两种通信方式。 也就是说,SOCKET是API,而TCP/UPD是通信协议,两种根本不同的东西。  语言表达的例子: 用SOCKET实现TCP(或者UDP)通信。 (相反,TCP或者UDP通信也可以不使

dongsheng186的专栏 608
上一篇: linux的socket连接限制
下一篇: VRF
HideInTime
博客等级 码龄9年 86粉丝 131原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值