c#socket TCP同步网络通信

一、socket简介

  socket就是套接字,它是引用网络连接的特殊文件描述符,由三个基本要素组成:

    1: AddressFamily(网络类型)

    2: SocketType(数据传输类型)

    3:ProtocolType(采用的网络协议)

  下面是可用于IP通信的套接字组合及其常用的属性和方法

二、socket与网络通信 

  IP连接领域有两种通信类型:面向连接的和无连接的,这里我要讲的是面向连接的,使用TCP协议来建立两个IP的值端点之间的会话,下面是它的基本步骤。

    a:建立一个套接字

    b:绑定本机的IP和端口

    c:使用listen()方法监听别人发过来的东西

    d:如果监听到连接,则可以使用Send/Receive来执行操作

    e:完成后使用Close()方法进行关闭

  工作原理如图所示:

  

三、一个简单的同步通信示例

  1.服务器端

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

namespace socket服务端
{
    class Program
    {
        static void Main(string[] args)
        {
            int port = 23456;//端口号
            int recv;//记录客户端信息的长度
            string address = "127.0.0.1";//IP地址,指向localhost主机名,常用于程序调试
            IPAddress addr = IPAddress.Parse(address);
            IPEndPoint ipe = new IPEndPoint(addr, port);
            Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            socket.Bind(ipe);//绑定端口
            socket.Listen(0);//开始监听,0表示任意数量
            Console.WriteLine("已启动监听,等待客户端连接。");
            Socket clientSocket = socket.Accept();
            IPEndPoint clientIp = (IPEndPoint)clientSocket.RemoteEndPoint;//获取远程终结点信息
            if (clientSocket != null)
                Console.WriteLine("成功与{0}的客户端建立联系",clientIp);
            while (true)//用死循环不断执行
            {
                try
                {
                    byte[] data = new byte[1024];
                    recv = clientSocket.Receive(data);//获取客户端传过来的信息
                    if (recv == 0)
                        break;
                    Console.WriteLine("客户端发来信息:{0}",Encoding.ASCII.GetString(data, 0, recv));
                    Console.Write("输入要发送的信息:");
                    String input = Console.ReadLine();
                    clientSocket.Send(Encoding.ASCII.GetBytes(input));
                }
                catch(Exception ex)
                {
                    Console.WriteLine("ERROR:{0}", ex.Message);
                }
            }
            Console.WriteLine("断开连接");
            clientSocket.Close();
            socket.Close();
        }
    }
}

  2.客户端

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.Sockets;

namespace socket客户端
{
    class Program
    {
        static void Main(string[] args)
        {
            int port = 23456;
            string address = "127.0.0.1";
            byte[] data = new byte[1024];
            IPAddress addr = IPAddress.Parse(address);
            IPEndPoint ipe = new IPEndPoint(addr, port);
            Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            socket.Connect(ipe);
            Console.WriteLine("与服务器连接成功");      

            try
            {
                while (true)
                {
                    Console.Write("输入信息内容:");
                    string input = Console.ReadLine();
                    if (input == "exit")
                        break;
                    socket.Send(Encoding.ASCII.GetBytes(input));//发送数据
                    data = new byte[1024];
                    int recv;
                    string strData;
                    recv = socket.Receive(data);
                    strData = Encoding.ASCII.GetString(data, 0, recv);
                    Console.WriteLine("服务器发来内容:{0}",strData);
                }
            }
            catch (SocketException ex)
            {
                Console.WriteLine(ex.ToString());
            }
            Console.WriteLine("断开连接...");
            socket.Shutdown(SocketShutdown.Both);
            socket.Close();
            Console.ReadKey();
        }
    }
}

  接下来对上面一些内容进行解释

    a.端口号:32位无符号整形,范围是0~65535,0~1023被系统进程和通信协议使用,1024~49251是用户可以使用的端口

    b.IPAddress类: 该类有一个Parse()方法,可以把点分的十进制IP转化为IPAdress类, 它还有四个可读字段

           Any:用于代表本地系统可用的任何IP地址

           Broadcase:用于代表本地网络的IP广播地址

           Loopback:用于代表本地系统的回送地址

           None:用于代表本地系统上没有网络接口

    c.IPEndPoint是一个端口和IP地址的绑定,可以代表一个服务,用来Socket通信,可以通过两种方法构造

           IPEndPoint( long address, int pot);

          IPEndPoint( IPAddress address, int pot)‘

    d. Accept 以同步方式从侦听套接字,在连接请求队列中提取第一个挂起的连接请求,然后创建并返回一个新Socket。 不能使用此返回Socket为接受任何其他连接的连接队列。 但是,可以调用RemoteEndPoint方法所返回的Socket来标识远程主机的网络地址和端口号。

    e.Receive()从绑定的 Socket套接字接收数据,将数据存入接收缓冲区。

注:同步通信每发完一个数据包后,需要等待接收方响应后再继续发送下一个数据包

运行时先启动服务器端,再启动客户端

原文地址:https://www.cnblogs.com/forever-Ys/p/10085799.html

时间: 2024-10-18 10:10:48

c#socket TCP同步网络通信的相关文章

C#网络编程系列文章(二)之Socket实现同步TCP服务器

原创性声明 本文作者:小竹zz  本文地址http://blog.csdn.net/zhujunxxxxx/article/details/44258719 转载请注明出处 本文介绍 在上一篇博客中我说了,我将会介绍c#中使用Socket和TcpListener和UdpClient实现各种同步和异步的TCP和UDP服务器,这些都是是我自己花了很多天的时间来总结的,这样一来相信刚接触c#网络编程的朋友们不会像以前的我一样到处出找资料,到处调试.本次我介绍的是使用Socket来实现的同步的TCP服务

Socket & TCP &HTTP

1.TCP协议的三次握手和四次挥手2.SOCKET连接与TCP连接3.SOCKET详解 3.1 socket套接字的起源 3.2 套接字描述符 3.3. SOCKET连接的程序 4.TCP/IP.Http,Socket关系研究,TCP和UDP的区别 1.TCP协议的三次握手和四次挥手 TCP协议的三次握手和四次挥手是很经典的内容 内容来源于 http://blog.csdn.net/whuslei/article/details/6667471 http://blog.csdn.net/zeng

27.Socket,TCP,UDP,HTTP基本通信原理

Socket,TCP,UDP,HTTP基本通信原理(摘自百度): TCP.UDP,HTTP 底层通信都是通过 socket 套接字实现 网络上不同的计算机,也可以通信,那么就得使用网络套接字(socket). socket就是在不同计算机之间进行通信的一个抽象. 他工作于TCP/IP协议中应用层和传输层之间的一个抽象  如图所示: 1.Socket 是对 TCP/IP 协议族的一种封装,是应用层与TCP/IP协议族通信的中间软件抽象层.从设计模式的角度看来,Socket其实就是一个门面模式,它把

[转载]C# Socket编程 同步以及异步通信

原文地址:C# Socket编程 同步以及异步通信     作者:  BLoodMaster 套接字简介:套接字最早是Unix的,window是借鉴过来的.TCP/IP协议族提供三种套接字:流式.数据报式.原始套接字.其中原始套接字允许对底层协议直接访问,一般用于检验新协议或者新设备问题,很少使用. 套接字编程原理:延续文件作用思想,打开-读写-关闭的模式. C/S编程模式如下: 服务器端: 打开通信通道,告诉本地机器,愿意在该通道上接受客户请求——监听,等待客户请求——接受请求,创建专用链接进

C#网络编程系列文章(六)之Socket实现同步UDP服务器

原创性声明 本文作者:小竹zz 本文地址http://blog.csdn.net/zhujunxxxxx/article/details/44258719 转载请注明出处 本文介绍 在.Net中,System.Net.Sockets 命名空间为需要严密控制网络访问的开发人员提供了 Windows Sockets (Winsock) 接口的托管实现.System.Net 命名空间中的所有其他网络访问类都建立在该套接字Socket实现之上,如TCPClient.TCPListener 和 UDPCl

unp第七章补充之socket tcp 产生 rst响应的情况

socket tcp 产生 rst响应的情况(属于硬错误) 1.     syn发送到服务器主机,但是目的端口并未运行.则产生一个ECONRFUSED错误.客户端立即返回.比如telnet 192.168.1.55 8889,条件:55主机在局域网上并且可达(也可以换成可以到达的网络ip地址),但是8889这个端口并未使用(可能服务器已经关闭),则服务器(对方主机tcp内核)发送一个rst相应给客户端,于是客户端立即关闭. 注意一下,如果输入的网络ip不可达的话,客户端将会持续发送syn,最后产

关于socket tcp 断线重连

这个问题困扰过我几次,都没有来得及研究,今天研究一下. 首先写一个最简易的socket tcp程序,连接成功后再关闭服务器然后再用客户端各种操作看是什么情况 测试表明 (1)客户端已经连接,当服务端关闭程序时,客户端调用send函数发送失败,WSAGetLastError() 返回10054(远程主机强迫关闭了一个现有的连接) (2)客户端已经连接,当客户端关闭程序时,服务端调用recv函数接收失败,WSAGetLastError() 返回10054(远程主机强迫关闭了一个现有的连接) ,这时对

c#异步Socket Tcp服务器实现

原创性申明 本文作者: 小竹zz  本文地址:http://blog.csdn.net/zhujunxxxxx 转载请注明出处. 介绍 我之前写过一篇IOCP的文章: http://blog.csdn.net/zhujunxxxxx/article/details/43573879 这个比异步socket性能好,因为它复用对象了. 在c#中微软已经提供了TcpListener和TcpClient来实现Tcp的通讯,这部分已经有人写了比较好的异步服务器代码 http://www.cnblogs.c

SOCKET TCP 粘包及半包问题

大家在使用SOCKET通信编程的时候,一般会采用UDP和TCP两种方式:TCP因为它没有包的概念,它只有流的概念,并且因为发送或接收缓冲区大小的设置问题,会产生粘包及半包的现象. 场景: 服务端向连续发送三个"HelloWorld"(三次消息无间隔),那么客户端接收到的情况会有以下三种: 1)HelloWorld HelloWorld HelloWorld (客户端接收三次) 2)HelloWorldHelloWor ldHelloWorld (客户端接收两次) 3)HelloWorl