当前位置:首页 > 海外服务器 > 正文

虚拟机和主机socket连接无法建立(...在两个物理主机上ubuntu虚拟机,如何使用sockets()通信,)

host-only方式:虚拟机与本地机形成一个网络,有一个vent1网卡,你需要将本地网卡开通共享vent1就可以与虚拟机连接,这种方式不需要外部环境,虚拟机ip不能与本地机ip同一段。

大家好,今天小编关注到一个比较有意思的话题,就是关于虚拟主机建socket的问题,于是小编就整理了6个相关介绍虚拟主机建socket的解答,让我们一起看看吧。

文章目录:

  1. 虚拟机和主机socket连接无法建立
  2. ...在两个物理主机上ubuntu虚拟机,如何使用sockets()通信,
  3. SocketTool怎么用/如何建立Socket服务端/客户端
  4. 公司内网里能ping的通的网站,却不能建立socket连接??
  5. 如何建立socket连接
  6. 如何建立socket连接

一、虚拟机和主机socket连接无法建立

VMware 有虚拟玩卡,有4种连接方式,主要常用的有bridge,和host-only方式,

bridge方式:你的虚拟机与本地机在同一局域网内,ip应该在同一ip段,有局域网环境才能访问,同时局域网内的其他客户机也可以访问你的虚拟机。

host-only方式:虚拟机与本地机形成一个网络,有一个vent1网卡,你需要将本地网卡开通共享vent1就可以与虚拟机连接,这种方式不需要外部环境,虚拟机ip不能与本地机ip同一段,例如:你本地机ip:192.168.0.11; 你可以将虚拟机ip设置为 192.168.1.22,网关为:192.168.1.1 此时网关就是本地机与虚拟机连接的ip,可以ping通,这种方式不需要外部环境。

你要是想传输文件可以借助别的软件:xmanager等。

二、...在两个物理主机上ubuntu虚拟机,如何使用sockets()通信,

首先,你得找到问题的原因,确保两部虚拟机直接能直接ping通。我对编程不了解,但接触过点网络。我知道在网络中要通讯,得有个地址,有地址之后还有有查找地址的方法-路由。我看你的描述,你两台虚拟机都是在NAT之后,那它们之间通讯用的就是转换之后的地址了,而不是私有地址了。

呵呵,这个问题比较 好排查解决。

分清两点:

1、当前你编写的网络session程序,是OK的。物理机测试有效;

2、问题点在于,两个虚拟机系统之间不在同一个IP网段内,所以ping不能。说白一点,是未能打通物理网络连接层。

方法思路:

1、首先先要确定,打通了两台PC物理系统的网络连接,在同一IP网段。

2、若物理机用的是动态IP连接,则可可考虑虚拟机中两个OS,用NAT Vnet8进行IP地址转换,一般可以实现连接成功;

3、如果物理机用的都是固定IP,和网关地址。那更好,直接在虚拟机OS中采用物理地址共享,在虚拟机OS中设置好各自的IP地址。该 地址,是实际物理机IP的后一位。

比如:物理机IP:172.18.6.6,网关:172.18.6.126 子网:255.255.255.128

则虚拟机IP:172.18.6.7-254(都可以)网关和子网掩码相同。

注意DNS地址,要和物理机DNS要一致。以保证需要做域名解析服务时正常。

三、SocketTool怎么用/如何建立Socket服务端/客户端

以 TCP 举例:

(1) 建立服务端时,请选择左侧树形菜单中的 “TCP Server”,然后点击上方的“创建”按钮,会弹出一个窗口,输入 TCP “监听端口”即可。

(2) 建立客户端时,请选择左侧树形菜单中的“TCP Client”,然后点击上方的“创建”按钮,在弹出的对话框中,输入对方 IP,由于你在本地启动的服务端,所以 IP 输入 127.0.0.1 即可,然后在“对方端口”中输入步骤 (1) 时设定的端口号,然后,点击上方的“连接”按钮,如此,客户端与服务端的 TCP 连接便已建立。

(3) 在左侧会 TCP Server 和 TCP Client 树形下会多出一个已建立的连接,点击它后,在右侧可以给对端发送消息。

四、公司内网里能ping的通的网站,却不能建立socket连接??

我是用java写的,也遇到这个情况,解决办法:

在防火墙里面把这个放开就好了,你可以试试,把这些带java的勾选上,具体路径是:控制面板\系统和安全\Windows Defender 防火墙\允许的应用,找到带java的勾选上。

能顺利ping通外网网址,说明你的计算机与外网网站是互通的。

之所以socket TCP连接失败或者UDP无响应,原因可以从以下三个环节中查找:

1)本机(你的计算机)

防火墙是否屏蔽掉你使用的端口?

2)公司外网路由(或网关)

路由(网关)是否开放了你所指定的协议(TCP或UDP)以及端口?

3)外网网站

外网网站是否允许使用你所指定的协议(TCP或UDP)以及端口?

--

虚拟机和主机socket连接无法建立(...在两个物理主机上ubuntu虚拟机,如何使用sockets()通信,)  第1张

上述三个环节,只要有一个出问题,都会导致Socket连接失败,或UDP无响应!

五、如何建立socket连接

socket建立连接的过程如下:

  1. 建立套接字

    socket()打开一个网络通讯端口,如果成功的话,就像open()一样返回一个文件描述符,应用程序可以像读写文件一样用read/write在网络上收发数据,如果socket()调用出错则返回-1。

  2. 在 INET BSD 套接字上绑定(bind)地址

     为了监听传入的 Internet 连接请求,每个服务器都需要建立一个 INET BSD 套接字,并且将自己的地址绑定到该套接字。绑定操作主要在 INET 套接字层中进行,还需要底层 TCP 层和 IP 层的某些支持。将地址绑定到某个套接字上之后,该套接字就不能用来进行任何其他的通讯。

  3. 在 INET BSD 套接字上建立连接(connect)

      创建一个套接字之后,该套接字不仅可以用于监听入站的连接请求,也可以用于建立出站的连接请求。不论怎样都涉及到一个重要的过程:建立两个应用程序之间的虚拟电路。

  4. 监听(listen) INET BSD 套接字

    典型的服务器程序可以同时服务于多个客户端,当有客户端发起连接时,服务器调用的accept()返回并接受这个连接,如果有大量的客户端发起连接而服务器来不及处理,尚未accept的客户端就处于连接等待状态,listen()声明sockfd处于监听状态,并且最多允许有backlog个客户端处于连接待状态,如果接收到更多的连接请求就忽略。listen()成功返回0,失败返回-1。

  5. 接受连接请求 (accept)

    其过程如下:接受操作首先传递到支持协议层,即 INET 中,以便接受任何传入的连接请求。相反,接受操作进一步传递到实际的协议,例如TCP 上。接受操作可以是阻塞的,也可以是非阻塞的。接受操作为非阻塞的情况下,如果没有可接受的传入连接,则接受操作将失败,而新建立的 socket 数据结构被抛弃。接受操作为阻塞的情况下,执行阻塞操作的网络应用程序将添加到等待队列中,并保持挂起直到接收到一个 TCP 连接请求为至。

六、如何建立socket连接

一般socket链接有以下两种方式:长(常)链接和短链接。

长链接:当数据发送完成后socket链接不断开。一直保留到异常或者是程序退出为止 ,这种方式的好处是不用每次去发起连接断开,在速度上可以比短连接要快一些,但是相 对来说对服务器的资源压力也要大些。长链接用的范围很广,比如游戏系统,qq等等,长 (常)链接一般还需要定时向服务器ping数据,以保证socket链接畅通。当ping不通服务 器时,需要重新开启链接。

短链接:当一次数据发送完毕后,主动断开链接,每次发送数据都要一次链接、断开 操作,这种方式的好处是:对服务器的资源占用相对来说比较小,但是由于每次都要重新 链接,速度开销上也比较大,这种方式对于那种不需要经常与服务器交互的情况下比较适 用。

上面两种方法在用户量非常大的情况下都存在着很大的不足,因此,考虑可以用 一种折衷的办法,那就是使用socket的连接池。

程序一开始初始化创建若干数量的长链接。给他们设置一个标识位,这个标识位表示 该链接是否空闲的状态。当需要发送数据的时候,系统给它分配一个当前空闲的链接。同 时,将得到的链接设置为“忙”,当数据发送完毕后,把链接标识位设置为 “闲”,让系统可以分配给下个用户,这样使得两种方式的优点都充分的发挥 出来了。用户数量足够多的时候,只需要动态增加链接池的数量即可。

下面我们用具体的程序来讲解下:

首先声明一个socket类:

public class XieGouSocket

{

public Socket m_socket; //Socket对象

虚拟机和主机socket连接无法建立(...在两个物理主机上ubuntu虚拟机,如何使用sockets()通信,)  第2张

public bool m_isFree; //判断是否空闲

public int m_index; //在链接缓存池中的索引值

}

下面的函数是创建socket链接池,这里为了使代码更加清晰,特地把异常处理部分 全部取掉了。

public XieGouSocket[] m_socket; //先定义个缓冲池

public void CreateSocketPool()

{

string ip= “127.0.0.1”;

string port= 2003;

IPAddress serverIp=IPAddress.Parse(ip);

int serverPort=Convert.ToInt32(port);

IPEndPoint iep=new IPEndPoint(serverIp,serverPort);

m_socket = new XieGouSocket[200];

for(int i =0; i < 200 ; i ++)

{

m_socket[i] = new XieGouSocket();

m_socket[i].m_index = i ;

m_socket[i].m_isFree = true;

m_socket[i].m_socket =new Socket (AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);

m_socket[i].m_socket.SetSocketOption (SocketOptionLevel.Socket,SocketOptionName.SendTimeout,1000);

m_socket[i].m_socket.Connect(iep);

}

}

虚拟机和主机socket连接无法建立(...在两个物理主机上ubuntu虚拟机,如何使用sockets()通信,)  第3张

下面的函数是获取当前空闲的socket链接:

因为是多线程,所以需要加一个原子操作,定义一个原子变量,以防止多个线程 之间抢占资源问题的发生。

private static Mutex m_mutex=new Mutex();

public static XieGouSocket GetFreeConnection()

{

m_mutex.WaitOne(); //先阻塞

for(int i =0; i < m_socket.Length ; i ++)

{

if(m_socket[i].m_isFree) //如果找到一个空闲的

{

m_socket[i].m_isFree = false;

m_mutex.ReleaseMutex();//释放资源

return m_socket[i];

}

}

//如果没有空闲的链接,要么等待,要么程序再动态创建一个链接。

m_mutex.ReleaseMutex();//释放资源

return null;

}

当数据发送完毕后,程序必须将m_isFree 设置为 False。否则只使用不释放,程序很 快就溢出了。

到此,以上就是小编对于虚拟主机建socket的问题就介绍到这了,希望介绍关于虚拟主机建socket的6点解答对大家有用。

发表评论

最新文章

取消
扫码支持 支付码