天道酬勤,学无止境

设置套接字的本地端点(Setting a socket's local endpoint)

问题

我需要创建一个连接到服务器进程的套接字,但必须限制为使用指定的本地适配器。 默认行为是使用它可以使用的任何东西,但我需要确保给定的套接字仅尝试(例如)LAN 连接,如果 wifi 和 LAN 都可用。

我正在使用 C# 和 .NET 2.0。

干杯

回答1

Socket.Bind(EndPoint localEP)方法是您的朋友。 有关详细信息,请查看 MSDN。

要获取所有本地适配器及其类型,请查看 System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces()

回答2

作为其他人的参考,我在使用 Bind 时遇到了问题,因为我正在使用 UdpClient 类并访问其内部 Socket(通过 UdpClient.Client),无论我如何尝试绑定,都会抛出 SocketException。 我的解决方法依赖于首先创建和绑定 Socket,然后将其分配给 UdpClient 实例:

using (var socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp))
{
    var endPoint = new IPEndPoint(ip, port);
    socket.Bind(endPoint);
    using (var client = new UdpClient() {Client = socket})
    {
        var destinationIP = IPAddress.Broadcast;
        client.Connect(destinationIP, port);
        client.Send(bytes, bytes.Length);
    }
}
回答3

您可以尝试使用 bind() 函数吗? 也许这可以解决问题。

在 msdn 上我发现:

(http://msdn.microsoft.com/en-us/library/ms737550(VS.85).aspx)

评论

在随后调用侦听函数之前,未连接的套接字上需要绑定函数。 它通常用于绑定到面向连接(流)或无连接(数据报)套接字。 bind 函数还可用于绑定到原始套接字(套接字是通过调用套接字函数并将类型参数设置为 SOCK_RAW 来创建的)。 在发送操作之前对 connect 、 ConnectEx、WSAConnect、WSAConnectByList 或 WSAConnectByName 函数的后续调用之前,也可以在未连接的套接字上使用 bind 函数

当通过调用套接字函数创建套接字时,它存在于命名空间(地址族)中,但没有为其分配名称。 使用绑定函数通过为未命名套接字分配本地名称来建立套接字的本地关联。

使用 Internet 地址族时,名称由三部分组成: 地址族。 一个主机地址。 标识应用程序的端口号。

标签

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 如何从 udp 端点获取 *my* ip(How to get *my* ip from udp endpoint)
    问题 Boost.Asio 的udp::endpoint有一个成员是远程地址。 因为我正在监听多个接口(像这样): udp_socket(io_service, udp::endpoint(udp::v4(), port)) 在我的处理程序中,我不知道哪个网络接口收到了数据包。 如果不遍历网络接口并在每个接口上寻找端点地址和我的 IP 之间的相似性,我是否可以获得我收到消息的接口的 IP? 回答1 不可以。Boost.Asio 没有公开识别数据报目的地址的能力。 socket::aync_receive_from() 和 socket::receive_from() 操作在 boost::asio::detail::socket_ops::recvfrom() 中执行本地套接字操作。 在 Windows 上,WSARecvFrom() 无法从协议栈中提取低层信息。 在 Linux 上,IP_PKTINFO 套接字选项可以提供给面向数据报的套接字,使 recvfrom() 能够使用辅助信息填充msghdr.msg_control缓冲区,例如接收数据包的接口索引和数据包标头中的目标地址。 但是,Boost.Asio 实现不使用msg_control字段: msghdr msg = msghdr(); init_msghdr_msg_name(msg.msg_name, addr)
  • 获取远程套接字端点的IP地址(Getting the IP Address of a Remote Socket Endpoint)
    问题 如何确定已连接套接字的远程IP地址? 我有一个我可以访问的RemoteEndPoint对象,以及它的AddressFamily成员。 如何利用这些来查找IP地址? 谢谢! 目前正在尝试 IPAddress.Parse( testSocket.Address.Address.ToString() ).ToString(); 并为本地主机端点获取1.0.0.127而不是127.0.0.1。 这正常吗? 回答1 http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.remoteendpoint.aspx 然后,您可以调用IPEndPoint .. ::。Address方法来检索远程IPAddress,并调用IPEndPoint .. ::。Port方法来检索远程端口号。 来自链接的更多信息(修复了很多): Socket s; IPEndPoint remoteIpEndPoint = s.RemoteEndPoint as IPEndPoint; IPEndPoint localIpEndPoint = s.LocalEndPoint as IPEndPoint; if (remoteIpEndPoint != null) { // Using the RemoteEndPoint property
  • 设置套接字操作超时(Setting a timeout for socket operations)
    问题 创建套接字时: Socket socket = new Socket(ipAddress, port); 因为IP地址不可用,它会引发一个异常,这是可以的。 (测试变量,其中String ipAddress = "192.168.0.3"和int port = 300 ) 问题是:如何为该套接字将其设置为超时? 创建套接字时,如何减少获得UnknownHostException并使套接字超时的时间? 回答1 使用Socket()构造函数,并改用connect(SocketAddress端点,int超时)方法。 在您的情况下,它看起来像: Socket socket = new Socket(); socket.connect(new InetSocketAddress(ipAddress, port), 1000); 引用文档 connect public void connect(SocketAddress endpoint, int timeout) throws IOException 使用指定的超时值将此套接字连接到服务器。 零超时被解释为无限超时。 然后,连接将被阻塞,直到建立或发生错误。 参数: endpoint -SocketAddress timeout要使用的超时值(以毫秒为单位)。 抛出: IOException如果在连接过程中发生错误
  • Boost 的 UDP 异步客户端接收自己的数据报(Boost's UDP asynchronous client receiving its own datagram)
    问题 我正在尝试使用 Boost::asio 进行简单的 UDP 客户端/服务器测试。 我已经阅读了文档和官方教程,但我仍然无法正确理解。 我的问题特别是在客户端。 这是我希望客户端执行的操作:它必须向在localhost:12345运行的服务器发送一个简单的数据报,然后侦听服务器发送的响应数据报。 不过,这不是我得到的。 看起来客户端正在发送数据报,但是在它收到自己的数据报之后! 在有人问之前,不,服务器没有运行:-) 函数send_datagram()似乎正确发送了数据报,但是async_receive_from()似乎是由发送的数据报触发的。 这是客户端的完整源代码: #include <boost/array.hpp> #include <boost/asio/error.hpp> #include <boost/asio.hpp> #include <boost/bind.hpp> #include <boost/format.hpp> #include <iostream> using boost::asio::ip::udp; const char *SERVER_ADDRESS = "localhost"; const char *SERVER_PORT = "12345"; boost::asio::io_service io_service; udp
  • 在Web应用程序中设置WCF TCP服务(Setting up WCF TCP service in a web application)
    问题 我已经为此奋斗了几天,从字面上看了数百篇文章,其中给出了有关如何在Web应用程序中设置基于WCF TCP的服务的部分指导。 如果有人可以帮助我,我将把这个问题变成一个完整的准则。 当前状态 net.tcp连接可在我的开发计算机上使用。 部署到Windows Server 2008 R2后,它也可以在本地工作。 但是,即使可以远程远程登录到服务器上的端口808,它也无法远程工作。 滚动到问题的底部以获取详细信息。 如果可以的话请帮忙。 我将为此详细信息创建一个新问题,并在得到结果后用答案更新该问题。 代码 我创建ServerHubService.svc具有以下内容的ServerHubService.svc : namespace Manage.SignalR { [ServiceContract] public class ServerHubService { [OperationContract] public void UpdateServerStatus(string serverStatus) { // Do something } } } 托管服务的应用程序的配置 在完成在线教程之后,我在Web.config中添加了以下内容(我尝试了许多不同的变体)。 这是Web应用程序的Web.config,承载了我以后要使用TCP连接的服务。 <configuration>
  • 在类头文件中声明 boost asio 套接字、接受器和端点(Declaring a boost asio socket, acceptor and endpoint in a class headerfile)
    问题 我有一个用 boost asio 制作的 TCP/IP 服务器,它封装在一个类中。 现在我想在类头文件中声明套接字、eindpoint 和接受器,以便我可以创建使用套接字的成员函数。 服务器现在在类构造函数中运行。 我尝试使用如下的初始化列表: CommunicationModuleTCPIP::CommunicationModuleTCPIP(bool Server, string IPAdress, int PortNumber) : Sock(new boost::asio::ip::tcp::socket(IOService)); { // Constructor code 但这会导致编译器错误。 Sock 在标头中声明如下: SmartSocket Sock; SmartSocket 是一个共享指针,定义如下。 typedef boost::shared_ptr<boost::asio::ip::tcp::socket> SmartSocket; 谁能告诉我是否可以在头文件中声明套接字、接受器和端点并初始化这些对象? 欢迎任何建议! 更新 下面是类头文件代码和构造函数代码: 带有端点、套接字和接受器声明的头文件: public: // Constructor and destructor CommunicationModuleTCPIP(bool Server
  • 为应用程序选择众多Internet连接之一(Choose one of many Internet connections for an application)
    问题 我有一台可以连接几个互联网的计算机。 LAN,WLAN,WiFi或3G。 所有这些都处于活动状态,并且机器可以使用其中任何一个。 现在,我想告诉我的应用程序使用可用的连接之一。 例如,我想告诉我的应用程序仅使用WiFi,而其他软件可能使用其他东西。 在我的C#应用​​程序中,我使用HttpWebRequest和HttpWebResponse类的类。 这有可能吗? 回答1 这是HttpWebRequest,WebRequest,WebClient等抽象出来的某种高级功能。 但是,您可以使用TcpClient (使用带本地端点的构造函数)或使用套接字并调用Socket.Bind来执行此操作。 如果需要使用特定的本地终结点,请使用Bind方法。 必须先调用Bind,然后才能调用Listen方法。 除非需要使用特定的本地终结点,否则在使用Connect方法之前不需要调用Bind。 绑定到要使用的接口的本地端点。 如果您的本地计算机的IP地址的IP地址为192.168.0.10,则使用本地端点将强制套接字使用该接口。 默认值是未绑定的(实际上是0.0.0.0),它告诉网络堆栈自动解析您要绕过的接口。 这是一些基于安德鲁评论的示例代码。 请注意,将0指定为本地端点端口意味着它是动态的。 using System.Net; using System.Net.Sockets; public
  • 获取本地IP地址(Get local IP address)
    问题 在互联网上,有几个地方向您展示如何获取IP地址。 其中很多看起来像这个例子: String strHostName = string.Empty; // Getting Ip address of local machine... // First get the host name of local machine. strHostName = Dns.GetHostName(); Console.WriteLine("Local Machine's Host Name: " + strHostName); // Then using host name, get the IP address list.. IPHostEntry ipEntry = Dns.GetHostEntry(strHostName); IPAddress[] addr = ipEntry.AddressList; for (int i = 0; i < addr.Length; i++) { Console.WriteLine("IP Address {0}: {1} ", i, addr[i].ToString()); } Console.ReadLine(); 在此示例中,我获得了多个IP地址,但我只想获得路由器分配给运行该程序的计算机的IP地
  • 错误:“传输端点已连接”(Error : "Transport endpoint is already connected")
    问题 我正在尝试用 C 开发一个小型聊天服务器。 对于一个简单的聊天服务器, (传输端点)===(套接字)? 我是否必须为每个客户端使用一个套接字,还是可以为多个客户端重复使用一个套接字? 如果是这样,如何? 有没有标准的方法来做到这一点? 有什么好的参考资料吗? 我能看到一些示例实现吗? 我必须使用 gcc 编译器和 c 语言来完成这项任务。 回答1 您需要一个套接字/客户端,不,您不能重用套接字。 如果您必须处理多个客户,您可以: 为每个客户端创建一个线程并使用阻塞 I/O(最好带有超时)。 创建单线程程序并通过 select/poll/epoll/kqueue 使用多路分解并使用非阻塞 I/O。 使用异步 I/O。 对于 C 套接字通信示例 Unix 网络编程这本书可能是最好的来源。 它有大量的示例程序和解释。 回答2 (传输端点)===(套接字)? 不。 “端点”是指带有端口号的 IP 地址。 Socket呈现一个“会话”,会话由两个端点组成,本地端点(IP,端口)和远程端点(IP,端口)。 我是否必须为每个客户端使用一个套接字,还是可以为多个客户端重复使用一个套接字? 如果是这样,如何? 每个会话一个套接字。 这意味着服务器需要为每个远程端点(客户端)创建一个新的套接字。 不再使用时,您可以重用套接字。 寻找 SO_REUSEADDR 套接字选项。
  • 在C#中,如何检查TCP端口是否可用?(In C#, how to check if a TCP port is available?)
    问题 在C#中使用TcpClient或通常连接到套接字,如何首先检查计算机上某个端口是否空闲? 更多信息:这是我使用的代码: TcpClient c; //I want to check here if port is free. c = new TcpClient(ip, port); 回答1 由于您使用的是TcpClient ,这意味着您正在检查打开的TCP端口。 System.Net.NetworkInformation命名空间中有很多可用的好对象。 使用IPGlobalProperties对象获取到的数组TcpConnectionInformation对象,然后你就可以诘约端点IP和端口。 int port = 456; //<--- This is your value bool isAvailable = true; // Evaluate current system tcp connections. This is the same information provided // by the netstat command line application, just in .Net strongly-typed object // form. We will look through the list, and if our port we would like
  • 套接字程序给出“传输端点已连接”错误(Socket program gives "Transport endpoint is already connected" error)
    问题 我正在尝试创建一个非常简单的客户端 - 服务器聊天程序,其中两个程序可以相互通信。 但是,接受函数给了我错误“无效参数”。 我在这里粘贴代码: #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <string.h> #include <fcntl.h> #include <stdlib.h> #include <errno.h> int main() { struct sockaddr_in myaddr; struct sockaddr_in otheraddr; int sockid; int bindid; int recvsockid; int clientlen; int connectid; char send_msg[100] = "Program 1", recv_msg[100]; int recvid, sendid; int myport_id = 4550; int otherport_id = 4560; sockid = socket(AF_INET, SOCK_STREAM, 0); //fcntl(sockid, F_SETFL, O_NONBLOCK); if (sockid < 0) {
  • 哪个更好:Java EE7 中的多个 Web 套接字端点或单个 Web 套接字端点(Which is better: multiple web socket endpoints or single web socket endpoint in Java EE7)
    问题 Java EE 7 允许您通过注释非常轻松地创建新端点。 但是,我想知道使用多个端点来处理每种消息类型是一个好主意,还是我应该只为所有内容使用一个端点外观? 我倾向于根据每个端点创建一个到客户端的新套接字连接的理论来拥有一个单一的端点外观。 然而,这一理论可能是不正确的,并且 Web Socket 可能会被实现,以便它只使用一个 TCP/IP 套接字连接,而不管连接了多少个 Web 套接字端点,只要它们连接到相同的主机:端口即可。 我特别要求 Java EE 7,因为可能有其他 Web 套接字服务器实现可能会做不同的事情。 回答1 这里唯一有效的答案是后一个选项 - 具有多个端点。 请参阅 WebSocket 规范第 2.1.3 章: API 将每个会话的 MessageHandler 注册限制为每个原生 websocket 消息类型一个 MessageHandler。 [WSC 2.1.3-1] 换句话说,开发者最多只能注册一个用于传入文本消息的 MessageHandler,一个用于传入二进制消息的 MessageHandler,以及一个用于传入 pong 消息的 MessageHandler。 如果违反此限制,websocket 实现必须生成错误 [WSC 2.1.3-2]。 至于使用或不使用多个 TCP 连接 - AFAIK 目前每个客户端都会有新的连接
  • ZeroMQ中获取TCP地址信息(Get TCP address information in ZeroMQ)
    问题 我想使用 ZeroMQ(java 绑定,jzmq)将客户端连接到服务器,但我非常需要 TCP 信息,例如客户端请求的 TCP/IP 地址! 问题是,为了能够在网络中宣布服务,我需要获取请求的 TCP 地址才能将客户端重定向到该服务。 在这种情况下,代理是一个中央“服务注册中心”。 但是,双方都有 ZeroMQ 服务,我看不到检索该信息的选项。 我现在要做的是使用标准套接字与代理建立虚拟连接,建立连接后,我获取用于此连接的 IP 地址并再次关闭连接。 已检索到的 IP 地址现在用于在随机端口上使用 ZeroMQ 套接字进行绑定。 我认为这个解决方案是有史以来最丑陋的解决方案,所以:这个问题的更好解决方案是什么? 问候。 回答1 出于多种原因,0MQ 不提供对等点的地址。 它也没有那么有用,因为您真正想要的是接收连接的端点,而不是建立连接的地址。 我通常做的,而且它足够优雅,是将服务绑定到一个临时端口,获得一个完整的连接端点(“tcp://ipaddress:port”)并以某种方式发送该字符串,要么广播给对等点,要么中央注册表等以及我的服务名称。 然后,想要重新连接的对等点可以获取服务名称,查找我的端点,然后重新连接到我。 回答2 在 ZMQ 4.x 中,您可能会获得字符串属性“Peer-Address”或“Identity”属性。 http://api.zeromq.org
  • 设置套接字本地端口抛出异常(Setting socket local port throws exception)
    问题 鉴于这种: . . . ServerSocket serverSocket = new ServerSocket(1111); while (helperSockets.size() < Common.NUM_HELPERS) { Socket helperSocket = serverSocket.accept(); . . . 这会引发异常: new Socket("localhost", 1111, InetAddress.getLocalHost(), localPort); 例外: java.net.ConnectException: connect: Address is invalid on local machine, or port is not valid on remote machine 我正在尝试使用此构造函数来设置本地端口,那么我做错了什么? 来源如下。 构造函数创建一个线程,通过 ServerSockets 侦听客户端,同时尝试连接到其他客户端。 此客户端尝试与自身连接以进行测试。 在 for 循环的第一次迭代时遇到问题。 public class DisSemHelper extends Thread { private int id; private int semaphore; private Clock clock; private
  • C# UDP 套接字:获取接收方地址(C# UDP Socket: Get receiver address)
    问题 我有一个异步 UDP 服务器类,其套接字绑定在 IPAddress.Any 上,我想知道接收到的数据包发送到(...或接收到)哪个 IPAddress。 似乎我不能只使用 Socket.LocalEndPoint 属性,因为它总是返回 0.0.0.0 (这是有道理的,因为它绑定到......)。 以下是我目前使用的代码中有趣的部分: private Socket udpSock; private byte[] buffer; public void Starter(){ //Setup the socket and message buffer udpSock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); udpSock.Bind(new IPEndPoint(IPAddress.Any, 12345)); buffer = new byte[1024]; //Start listening for a new message. EndPoint newClientEP = new IPEndPoint(IPAddress.Any, 0); udpSock.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags
  • 端点和套接字有什么区别?(What's the difference between endpoint and socket?)
    问题 我见过的几乎所有套接字定义都与术语端点密切相关: 维基百科: 网络套接字是用于在计算机网络中的单个节点上发送或接收数据的内部端点。 具体来说,它是这个端点在网络软件中的表示 这个答案: 套接字是(双向)通信中的端点 甲骨文的定义: 套接字是网络上运行的两个程序之间双向通信链路的一个端点 甚至 stackoverflow 对标签 'sockets' 的定义是: 双向进程间通信流的端点 这个另一个答案更进一步: TCP 套接字是一个端点实例 虽然我不明白在这种情况下“实例”是什么意思。 如果一个端点根据这个答案是一个 URL,我看不出它是如何实例化的。 回答1 “端点”是一个通用术语,包括管道、接口、节点等,而“套接字”是网络中的特定术语。 回答2 恕我直言-逻辑上(强调)“套接字”和“端点”是相同的,因为它们都是 Internet 地址与 TCP 端口的连接。 严格来说,在核心网络中,没有什么像“端点”这样的东西,只有“套接字”。 继续,在下面阅读更多... 正如@Zac67 所强调的那样,“套接字”是网络中一个非常具体的术语——如果您阅读 TCP RFC (https://www.rfc-editor.org/rfc/rfc793),那么您甚至找不到“端点”,它只谈论“套接字”。 但是当您离开 RFC 世界时,您会听到很多关于“端点”的信息。 现在,他们都在谈论 IP 地址和
  • 在 Boost ASIO 中,如何设置源 IP 地址来模拟另一台服务器的 IP 地址?(In Boost ASIO how can I set the source IP address to impersonate another server's IP address?)
    问题 我有一个基于 Boost ASIO 的 C++ 服务器程序,我希望能够将 TCP 使用的源 IP 地址设置为另一台服务器的源 IP 地址。 我知道可以读取源 IP 地址和目标 IP 地址,但大概也可以设置它们? 大概如果我在 C++ 代码中设置了“错误”的源 IP 地址,就会与网络堆栈发生一些交互。 即使C++代码是对的,网络堆栈不会在出路时重新设置源IP地址吗? 正确的方法是编写 C++ ASIO 代码来选择特定的虚拟网络接口吗? 一个配置了“错误”静态 IP 地址的地址? 我之前已经看到这是一种控制源 IP 地址的方法。 那是我需要做的吗? 我想知道这样做的后果是什么。 如果两台机器配置了相同的静态 IP 地址,可能会导致“正常”服务器完全停止工作,这很糟糕。 我有我的服务器的 Windows 和 Linux 端口,我可以使用,以防提议的代码适用于一个操作系统而不是另一个操作系统。 我目前倾向于 Kali Linux,因为我可以“arpspoof”主服务器并有效地将其关闭一段时间。 回答1 通过手动构建网络和传输层标头,然后将标头和所需的有效负载发送到原始套接字,可以将源 IP 设置为出站数据上的任意地址。 原始套接字的使用可能需要提升权限,或者可能被内核禁用或限制,例如在某些 Microsoft 平台上。 此外,由于 TCP 的三向握手和不可预测的序列号,在潜在的
  • 升级到.NET 4.5后获取AddressAlreadyInUseException(Getting AddressAlreadyInUseException after upgrading to .NET 4.5)
    问题 我最近在服务器上安装了新的.NET Framework 4.5(以前安装了4.0),并且在启动公开WCF端点的Windows Service时遇到了System.ServiceModel.AddressAlreadyInUseException 。 System.ServiceModel.AddressAlreadyInUseException:IP端点0.0.0.0:56543上已经存在一个侦听器。 如果已经有另一个应用程序在该端点上进行侦听,或者如果您的服务主机中有多个服务端点具有相同的IP端点但绑定配置不兼容,则可能会发生这种情况。 ---> System.Net.Sockets.SocketException:通常,System的System.Net.Sockets.Socket.DoBind(EndPoint endPointSnapshot,SocketAddress socketAddress)仅允许使用每种套接字地址(协议/网络地址/端口)。 Net.Sockets.Socket.Bind(EndPoint localEP)在System.ServiceModel.Channels.SocketConnectionListener.Listen()-内部异常堆栈跟踪的结尾-在System.ServiceModel.Channels
  • 为Ruby on Rails应用设置mysql数据库时,出现“无法通过套接字'/var/run/mysqld/mysqld.sock'连接到本地MySQL服务器”错误(Getting “Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock'” error when setting up mysql database for Ruby on Rails app)
    问题 我整天都在努力,需要一些帮助。 我正在尝试为我正在从github处理的RoR项目设置mysql数据库。 当我尝试在终端中设置数据库时,出现以下错误: Eric-MacBook:~ eric$ cd ~/review_rocket Eric-MacBook:review_rocket eric$ rake db:setup Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' 我已经查看了20个关于SO的问题,但没有一个能够帮助我解决问题。 数据库已启动并且正在运行,并且database.yml也已设置。 我现在有点生气...请...帮助...在为时已晚之前。 更新:我只是看了我安装的gem,由于某种原因,它显示了mysql2 (请参见下文) Eric-Reas-MacBook:~ ericrea$ gem list *** LOCAL GEMS *** multi_json (1.8.2) mysql2 (0.3.13) net-sftp (2.1.2) 我觉得这有点奇怪... 更新:这是我的database.yml的样子: common: &common adapter: mysql2 encoding: utf8 reconnect: false pool: 5
  • OSError: [Errno 107] 传输端点未连接(OSError: [Errno 107] Transport endpoint is not connected)
    问题 我正在尝试学习如何在 python 中使用套接字在两台计算机之间进行通信。 不幸的是,当一切似乎都正确时,我收到此错误: OSError: [Errno 107] 传输端点未连接 谷歌搜索后,我发现这是因为连接可能已断开。 但是我在同一台机器上同时运行程序的客户端和服务器端。 我尝试从客户端再次连接,我得到了这个: OSError: [Errno 106] 传输端点已连接 表明之前的连接仍然完好无损。 我对正在发生的事情以及如何使其发挥作用感到非常困惑。 这是一个屏幕截图,显示了我正在尝试做的事情和问题: 回答1 我在 python 3.5.0 上做了一点改动测试了你的代码,它有效:我认为诀窍在于sock.accept()方法,它返回一个元组: socket.accept()接受一个连接。 套接字必须绑定到一个地址并侦听连接。 返回值是一对(conn, address),其中 conn 是可用于在连接上发送和接收数据的新套接字对象,address 是绑定到连接另一端的套接字的地址。 服务器 #server >>> import socket >>> sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) >>> sock.bind(("localhost", 8081)) >>> sock.listen(2) >>>