最近有点晕,关于以太网通讯。开个贴记录一下,便于思考和交流

wenluderen 2018-09-27 04:31:16
话说在VB.net里面进行网络通讯,是怎么个搞法,似乎是很复杂的。看了很多资料,网上说的也是你中有我,我中有你。 不成体系。

让人云里雾里。有几个小疑问?

硬件结构如下:两个电脑,A电脑IP地址为192.168.1.10 B电脑地址192.168.1.20.通过网线和交换机连接在一起


问题一:
在VB.net 里面,假设A和B进行网络通讯,使用最底层的协议是啥? 是 TCP /IP? 还是socket,还是一些API函数? 还是winsock?

问题二:
在VB.net里面,TCP/IP Socket Winsock 他们之间又包含 和被包含的关系吗?


问题三:
假设在A电脑里面 使用 TCP/IP创建服务器,在B电脑里面使用socket创建客户端,A和B可以通讯吗?

问题四:网上的很多VB.net socket范例,在一个电脑上运行客户端和服务器端,是可以通讯的,但是两个电脑就不行了
那个啥IP地址肯定是修改了,服务器端是本地IP,客户端写的服务器的IP,端口也是一样的,可惜他们还是无法通讯

问题五:网上有很多TCP/IP调试助手,这些程序内容用的是socket吗? 还是TCP类?

谢谢
...全文
1052 37 打赏 收藏 转发到动态 举报
写回复
用AI写文章
37 条回复
切换为时间正序
请发表友善的回复…
发表回复
ponymavericks 2018-09-30
  • 打赏
  • 举报
回复
猴赛雷
lemter110 2018-09-30
  • 打赏
  • 举报
回复
Tcp/IP协议中包含Socket,WinSock是Socket的一个实现。
qq_43309007 2018-09-29
  • 打赏
  • 举报
回复
那其实就一直在拿最底层最初级的东西在学习啊!你要注意这个。
  • 打赏
  • 举报
回复
在 .net framework 中封装了成熟的东西相当于几百万个 Socket 类,如果有的人不用 .net 中更加高级的现成的机制,非要纠结4、50年前的一些字眼儿(在 .net 中只是为了兼容 linux 等等而保留着)那其实就一直在拿最底层最初级的东西在学习啊!你要注意这个。
  • 打赏
  • 举报
回复
这就好像 vb 中有 Winsock 控件、有 open #1 这类操作语法一样,Socket 是 Unix 系统发明的一个 class,然后被许多系统类库抄袭。在 .net 中也抄袭各家(包括自家)c++、java 编程framework 中都有的 Socket 类,这一点也不新奇。把 Socket 跟 TCP 同日而语,这就好像是把白宫跟美国政府等价一样,他没有想到中国的乡镇农村也有许多镇政府甚至村委会叫做“白宫”甚至内外装饰都一样。
Disappear. 2018-09-29
  • 打赏
  • 举报
回复
winsock是.Net之前的东西,确实过时了。
现在都是基于socket(直接使用socket,或者用基于socket某个协议封装好的类库,比如tcplistener)
协议是一套标准,并非实物,通讯组件是遵循这套标准的具体工具,不是一个概念。
问题一:底层的协议是tcp、udp,软件本身位于7层,具体的通信过程属于4层以及更高层,3层和3层以下靠硬件来实现,无需人工干预;
socket也好,winsock也好,API函数也好,第三方库也好,都是提供给开发者进行网络开发的封装好的工具,互相之间并没有包含的关系。
问题二:见问题一和问题一前面的解释。
问题三:"使用TCP/IP创建服务器“并不是一个准确的表述,应该是使用某一个类(socket)也好,控件(winsock)也好,基于TCP/IP协议(这个所谓的基础是系统的一部分,无需人工干预)实现通讯(创建服务也好,创建客户端也好),大家都遵循标准协议,所以只要没有配置和链路问题,就可以正常通讯(比如在电脑A,192.168.1.10的1111端口创建一个TCP服务,B电脑通过一个TCP客户端访问A的1111端口就可以建立连接)。
问题四:见三,S端和C端能建立连接的基础是底层可达(物理链路,网络层可达)和配置正确(主要是防火墙将端口开放,并且配置了正确的端口),最简单的测试方法是S端服务启动后,从C端PC telnet S端的指定端口看能否建立连接。
问题四:见一,不需要关心太多他们实现的细节,实现方法可以多种多样,甚至你也可以用不同的组件自己写几套测试工具。
  • 打赏
  • 举报
回复
比如 java,c#,python,同样都能做一套一样需求的程序,而作为开发者的我们,肯定会选择用最快,最短的,最懂的方式去完成它,如果是以太网,网络能通,就可以找一些网上的代码来调试看看,而不是通过工具,工具只是告诉你能接收数据,有数据了,而深究技术,最终要能取出数据的只有用代码去实践
  • 打赏
  • 举报
回复
上位机经验,以太网是硬件配置,而socket只是软件书写代码功能,所以必须硬件配置好了主体,才有进行软件编写,而soclet只是tcp的一种协议写法,主流的通讯有以太网,232,485,作为开发者的我们,没有时间去深究这些技术,只能想办法和设备交互,取出最终数据,才是关键。以上纯属个人工作经验
xieyu1 2018-09-29
  • 打赏
  • 举报
回复
厉害了
weixin_43309365 2018-09-29
  • 打赏
  • 举报
回复
上位机与欧姆龙PLC以太网通信的实验,总结如下: 1.地
qq_19816685 2018-09-29
  • 打赏
  • 举报
回复
厉害了啊啊啊
wenluderen 2018-09-28
  • 打赏
  • 举报
回复
引用 8 楼 Runnerchin 的回复:
不过话说回来……回复的时候打了这么多字,你为什么不先看一下再提问?网络就这点东西,都是车轱辘话来回说。相同的内容我前后重复表述了这么多次,让人非常绝望啊。
网络通讯这个大概念,从上个世纪70年代产生,经过多次迭代,中间产生了多个分支,这些分支有消散了(WInsock)有的壮大了。 但是不论消散的还是壮大的都可以从网络找的到,新入门的人(特别是非科班出身的人)很难搞清楚这些来龙去脉,导致云里雾里。 另外,由于网络这个概念来自国外,翻译到国内。很多词汇的概念 非常模糊,每个人对他的理解都有些不一样。 比如说,TCP/IP ,很多人以为就是TCP协议+IP协议。 很多人以为 TCP/IP 是一些代码,稍微讲究一点的人 知道TCP/IP是一些网络通讯协议的总称。 但是在究竟一些呢,上面的描述都不准确。都不是严谨的描述。 不严谨的东西留毒于网络中,对新人也罢,对老人也罢,都是干扰项。 正如你所说,网络就这么点东西。可是这点东西藏在云里雾里。 车轱辘话 说来说去,大家还是很迷茫 个人感觉,网络的知识不成体系结构。 书本上的知识往往又有些陈旧。 能解决这个问题的,只有第一线的大神,实时修改书本上已经陈旧的东西,更新体系结构。 唯有如此,才可以将本来就不复杂的知识,最快速的传递下去。
X-i-n 2018-09-28
  • 打赏
  • 举报
回复
同时,服务端也需要在防火墙(进行系统设置,与代码无关)上开放11000端口的访问。
X-i-n 2018-09-28
  • 打赏
  • 举报
回复
                IPHostEntry ipHostInfo = Dns.GetHostEntry(Dns.GetHostName());
                IPAddress ipAddress = ipHostInfo.AddressList[0];
                IPEndPoint remoteEP = new IPEndPoint(ipAddress, 11000);
C端里的remoteEP定义了一个对端(S端),本机联调的时候S端和C端在一台PC上,所以在客户端代码里用Dns.GetHostEntry()取本机地址直接就可以当成服务器地址来用。 如果A运行客户端,B运行服务端,那就必须在客户端代码实例化一个IPEndPoint时显式指定B的IP和端口,而不是通过GetHostEntry()来取本机IP
IPEndPoint iPEndPoint = new IPEndPoint(System.Net.IPAddress.Parse( "B的IP"), 11000);
wenluderen 2018-09-28
  • 打赏
  • 举报
回复
这一段代码,是C#代码 代码是用于实现一个TCP 服务端 我们可以看到 他是直接使用 Socket 来做的。 这个socket是.NET 里面封装好的。

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

namespace ConsoleApplication1
{
    class Program
    {
        // Incoming data from the client.  
        public static string data = null;

        public static void StartListening()
        {
            // Data buffer for incoming data.  
            byte[] bytes = new Byte[1024];

            // Establish the local endpoint for the socket.  
            // Dns.GetHostName returns the name of the   
            // host running the application.  
            IPHostEntry ipHostInfo = Dns.GetHostEntry(Dns.GetHostName());
            IPAddress ipAddress = ipHostInfo.AddressList[0];
            IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 11000);

            // Create a TCP/IP socket.  
            Socket listener = new Socket(ipAddress.AddressFamily,
                SocketType.Stream, ProtocolType.Tcp);

            // Bind the socket to the local endpoint and   
            // listen for incoming connections.  
            try
            {
                listener.Bind(localEndPoint);
                listener.Listen(10);

                // Start listening for connections.  
                while (true)
                {
                    Console.WriteLine("Waiting for a connection...");
                    // Program is suspended while waiting for an incoming connection.  
                    Socket handler = listener.Accept();
                    data = null;

                    // An incoming connection needs to be processed.  
                    while (true)
                    {
                        int bytesRec = handler.Receive(bytes);
                        data += Encoding.ASCII.GetString(bytes, 0, bytesRec);
                        if (data.IndexOf("<EOF>") > -1)
                        {
                            break;
                        }
                    }

                    // Show the data on the console.  
                    Console.WriteLine("Text received : {0}", data);

                    // Echo the data back to the client.  
                    byte[] msg = Encoding.ASCII.GetBytes(data);

                    handler.Send(msg);
                    handler.Shutdown(SocketShutdown.Both);
                    handler.Close();
                }

            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
            }

            Console.WriteLine("\nPress ENTER to continue...");
            Console.Read();

        } 

        static void Main(string[] args)
        {
            StartListening();  
        }
    }
}

以下是客户端


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


namespace ConsoleApplication1
{
    class Program
    {
        public static void StartClient()
        {
            // Data buffer for incoming data.  
            byte[] bytes = new byte[1024];

            // Connect to a remote device.  
            try
            {
                // Establish the remote endpoint for the socket.  
                // This example uses port 11000 on the local computer.  
                IPHostEntry ipHostInfo = Dns.GetHostEntry(Dns.GetHostName());
                IPAddress ipAddress = ipHostInfo.AddressList[0];
                IPEndPoint remoteEP = new IPEndPoint(ipAddress, 11000);

                // Create a TCP/IP  socket.  
                Socket sender = new Socket(ipAddress.AddressFamily,
                    SocketType.Stream, ProtocolType.Tcp);

                // Connect the socket to the remote endpoint. Catch any errors.  
                try
                {
                    sender.Connect(remoteEP);

                    Console.WriteLine("Socket connected to {0}",
                        sender.RemoteEndPoint.ToString());

                    // Encode the data string into a byte array.  
                    byte[] msg = Encoding.ASCII.GetBytes("This is a test  Gsz <EOF>");

                    // Send the data through the socket.  
                    int bytesSent = sender.Send(msg);

                    // Receive the response from the remote device.  
                    int bytesRec = sender.Receive(bytes);
                    Console.WriteLine("Echoed test = {0}",
                        Encoding.ASCII.GetString(bytes, 0, bytesRec));

                    // Release the socket.  
                    sender.Shutdown(SocketShutdown.Both);
                    sender.Close();

                }
                catch (ArgumentNullException ane)
                {
                    Console.WriteLine("ArgumentNullException : {0}", ane.ToString());
                }
                catch (SocketException se)
                {
                    Console.WriteLine("SocketException : {0}", se.ToString());
                }
                catch (Exception e)
                {
                    Console.WriteLine("Unexpected exception : {0}", e.ToString());
                }

            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
            }
        }

        static void Main(string[] args)
        {
            StartClient();
          //  return 0;
        }
    }

}


问题是在一个PC上是可以运行的,在两个PC上就不行了 我修改的IP 可惜没有用 各位老大,假设A电脑运行客户端,B电脑运行服务器端。 这个IP地址该如何设定呢?
X-i-n 2018-09-28
  • 打赏
  • 举报
回复
不过话说回来……回复的时候打了这么多字,你为什么不先看一下再提问?网络就这点东西,都是车轱辘话来回说。相同的内容我前后重复表述了这么多次,让人非常绝望啊。
X-i-n 2018-09-28
  • 打赏
  • 举报
回复
引用 6 楼 wenluderen 的回复:
我查了资料 https://zh.wikipedia.org/wiki/TCP/IP%E5%8D%8F%E8%AE%AE%E6%97%8F 在严谨的TCPI/IP协议的定义中 是找不到socket这个字眼的 我猜测: TCP/IP是一种纯粹的理论,不受限于任何一种计算机编程语言(C++ VB C# 等等) ××× 在不同的硬件或是语言平台,各自的开发者,依据TCP/IP这个理论知识并且结合OSI七层模型,构建一些实实在在的代码,这些是用于实现TCP/IP协议的。 ××× 比如说:在PC平台下Windows环境下, 微软公司开发了一个叫socket的东西,这个东西提供了多种计算机编程语言的版本 这个socket实现TCP/IP通讯,或者让TCP/IP有了实际的意义,不再是一个理论,而是变成了一个实际的应用。 各位大神,我的理解和猜测是否正确的,严谨的?
是的。协议是对一种通信过程所遵循规则的抽象描述,socket是由系统底层提供的实实在在的一个对象,二者完全不是一个东西。 tcp/ip狭义上是一套协议的总集,广义上是一套分层的网络体系,与之类似的还有OSI/RM,都是在用一个框架来描述计算机互联的网络,二者也不是同一个东西。后者因为分层过细,偏理论,反而与实际有些脱节,所以偏理论的讨论会用它来分析问题,而偏应用的讨论会采用tcp/ip模型来分析问题。
wenluderen 2018-09-28
  • 打赏
  • 举报
回复
我查了资料 https://zh.wikipedia.org/wiki/TCP/IP%E5%8D%8F%E8%AE%AE%E6%97%8F 在严谨的TCPI/IP协议的定义中 是找不到socket这个字眼的 我猜测: TCP/IP是一种纯粹的理论,不受限于任何一种计算机编程语言(C++ VB C# 等等) ××× 在不同的硬件或是语言平台,各自的开发者,依据TCP/IP这个理论知识并且结合OSI七层模型,构建一些实实在在的代码,这些是用于实现TCP/IP协议的。 ××× 比如说:在PC平台下Windows环境下, 微软公司开发了一个叫socket的东西,这个东西提供了多种计算机编程语言的版本 这个socket实现TCP/IP通讯,或者让TCP/IP有了实际的意义,不再是一个理论,而是变成了一个实际的应用。 各位大神,我的理解和猜测是否正确的,严谨的?
X-i-n 2018-09-28
  • 打赏
  • 举报
回复
引用 4 楼 xomix 的回复:
引用
问题一: 在VB.net 里面,假设A和B进行网络通讯,使用最底层的协议是啥? 是 TCP /IP? 还是socket,还是一些API函数? 还是winsock?
最底层的协议是网卡间的通讯协议,例如无线网卡之间的802.11。系统上来说,你问的基于ip地址通信的可见的最底层是Tcp/IP协议。
引用
问题二: 在VB.net里面,TCP/IP Socket Winsock 他们之间又包含 和被包含的关系吗?
Tcp/IP协议中包含Socket,WinSock是Socket的一个实现。
引用
问题三: 假设在A电脑里面 使用 TCP/IP创建服务器,在B电脑里面使用socket创建客户端,A和B可以通讯吗?
要看是什么服务器,你使用Tcp/IP协议创建一个监听127.0.0.1的Http Web服务器,是不可能实现和其他电脑的任何通讯的。
引用
问题四:网上的很多VB.net socket范例,在一个电脑上运行客户端和服务器端,是可以通讯的,但是两个电脑就不行了 那个啥IP地址肯定是修改了,服务器端是本地IP,客户端写的服务器的IP,端口也是一样的,可惜他们还是无法通讯
建议从防火墙和端口监听看起。
引用
问题五:网上有很多TCP/IP调试助手,这些程序内容用的是socket吗? 还是TCP类?
这两个没有本质区别,所以用的哪个都一个效果。
TCP/IP协议簇有自己的分层模型,从物理层一直到应用层,对应到OSI模型里,是一个涵盖了部分2层直到7层协议的协议集,而非简单的tcp协议+ip协议,更不是单个的协议。 协议和socket是完全不同的两个概念,协议是一套定义了如何进行交互的标准,它只是一个定义文档,并没有自己的实体;SOCKET是协议的使用者,是协议的实现,是真实存在的对象,所以tcp/ip协议与socket并没有任何包含关系。比如:A用遥控打开空调,空调根据不同的信号执行不同的动作,发送和接收信号的组件就是socket,而信号携带的指令如何定义,如何识别,这套标准就是协议。 操作系统提供socket对象的调用接口,并隐藏了3层以下的内容,可以由开发人员借此实现通信,并且无需关心底层细节。 在socket的基础上,又可以封装出类似TcpListener,WinSock之类的类库供开发人员更方便地使用,甚至也可以自己封装MySocket,并且进而封装MySocket2,再进而封装MySocket3……但是它们并没有层级高低之分,都处于同一层,无论如何离不开传输层(有可能会涵盖进更高层的内容) http是一个应用层协议,底层基于tcp协议,具有tcp协议的所有性质,浏览器、httpclient、甚至telnet都可以与服务器进行交流,这种交流是真正意义上的通讯。
wenluderen 2018-09-28
  • 打赏
  • 举报
回复
引用 18 楼 sp1234 的回复:
.net framework 中实现了在几乎所有的 c 语言类库中都包含的 Socket 类,与 linux 系列兼容。但是同时它又提高了,起码包括 TcpClient、TcpListener、几百种其它的网络通讯类(例如几十种 web 封装类型)等等。不要纠结于 vb。 要学 vb.net,不要纠结于某种编程语言,必须学 .net framework。在 .net 下各种编程语言只是体验不同而已,不同编程语言都是基于统一的 .net framework 丰富框架,这个才是你要学习的。 学习编程是学习 framework,而不是纠结于某种编程语言的语法形式。
很久以前,就听说VB很鸡肋,也就没有学习。是从C++开始的。 学了一些,也做了些简单项目。感觉比较吃力。 后来接手一个VB.net项目。 发觉VB.net 和VB相比,好的不是一点点。 VB.net基于.net结构。一切都是对象,程序代码非常清晰明了,很容易看懂。  代码间调用关系非常清晰简单,代码自身也清晰明了。 ×× VB.net 对PC硬件各种调用,都已经封装好了,直接使用即可。而且这些封装好的东西都在VS里面集成了,不需要去配置复杂环境,不需要去配置各种动态库。 目前我感觉.NET 平台除了运行效率低,代码容易被反编译。其他的应该没有啥缺点了。 另外,正如你所说, .net里面将C  C++ 里面的很多常用功能类 都重新封装了,比如网络通讯 数据库访问等等。
加载更多回复(17)

16,553

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧