【问题标题】:Socket Programming - A connection attempt failed Exception套接字编程 - 连接尝试失败异常
【发布时间】:2013-10-15 17:04:52
【问题描述】:

我是套接字编程的新手,正在创建一个聊天应用程序。就像其他应用程序一样,每当我在聊天窗口中按 Enter 键时,它应该将聊天发送给特定用户。我正在为所有用户及其 IPAddresses 维护一个数据库。所以每当我选择一个用户发送聊天时,它应该发送到相应的 IPAddress。截至目前,我正在尝试将聊天发送到我自己的机器(所以我硬编码了我机器的 IPAddress)。但是当我尝试发送时出现异常我的代码到我的 IPAddress。谁能帮帮我。

我的socket编程代码是这样的

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

namespace Ping
{
    class SocketProgramming
    {
        //Socket m_socWorker;
        public AsyncCallback pfnWorkerCallBack;
        public Socket m_socListener;
        public Socket m_socWorker;

        public void sendChat(IPAddress toMessengerIP)
        {
            try
            {
                //create a new client socket ...

                m_socWorker = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
                String szIPSelected = toMessengerIP.ToString();
                String szPort = "7777";
                int alPort = System.Convert.ToInt16(szPort, 10);

                System.Net.IPAddress remoteIPAddress = System.Net.IPAddress.Parse(szIPSelected);
                System.Net.IPEndPoint remoteEndPoint = new System.Net.IPEndPoint(remoteIPAddress, alPort);
        //        receive();
                m_socWorker.Connect(remoteEndPoint);

                //Send data
                Object objData =(object)"hi dhivi";
                byte[] byData = System.Text.Encoding.ASCII.GetBytes(objData.ToString());
                m_socWorker.Send(byData);


            }
            catch (System.Net.Sockets.SocketException se)
            {
                //MessageBox.Show(se.Message);
                Console.Out.Write(se.Message);
            }
        }

        public void receive()
        {
            try
            {
                //create the listening socket...
                m_socListener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                IPEndPoint ipLocal = new IPEndPoint(IPAddress.Any, 7777);
                //bind to local IP Address...
                m_socListener.Bind(ipLocal);
                //start listening...
                m_socListener.Listen(4);
                // create the call back for any client connections...
                m_socListener.BeginAccept(new AsyncCallback(OnClientConnect), null);
                //cmdListen.Enabled = false;

            }
            catch (SocketException se)
            {
                Console.Out.Write(se.Message);
            }
        }

        public void OnClientConnect(IAsyncResult asyn)
        {
            try
            {
                m_socWorker = m_socListener.EndAccept(asyn);

                WaitForData(m_socWorker);
            }
            catch (ObjectDisposedException)
            {
                System.Diagnostics.Debugger.Log(0, "1", "\n OnClientConnection: Socket has been closed\n");
            }
            catch (SocketException se)
            {
                Console.Out.Write(se.Message);
            }

        }

        public class CSocketPacket
        {
            public System.Net.Sockets.Socket thisSocket;
            public byte[] dataBuffer = new byte[1];
        }

        public void WaitForData(System.Net.Sockets.Socket soc)
        {
            try
            {
                //if (pfnWorkerCallBack == null)
                //{
                //    pfnWorkerCallBack = new AsyncCallback(OnDataReceived);
                //}
                CSocketPacket theSocPkt = new CSocketPacket();
                theSocPkt.thisSocket = soc;
                // now start to listen for any data...
                soc.BeginReceive(theSocPkt.dataBuffer, 0, theSocPkt.dataBuffer.Length, SocketFlags.None, pfnWorkerCallBack, theSocPkt);
            }
            catch (SocketException se)
            {
                Console.Out.Write(se.Message);
            }

        }
    }
}

当用户点击回车按钮时,它应该调用 sendChat() 方法。

private void txt_Userinput_KeyDown_1(object sender, KeyEventArgs e) {

    Window parentWindow = Window.GetWindow(this);
    TabItem tb = (TabItem)this.Parent;
    string user = tb.Header.ToString();
    if (e.Key == Key.Return)
    {
        richtxtbox_chatwindow.AppendText(Environment.NewLine + user + " : " + txt_Userinput.Text);
        DBCoding dbObject = new DBCoding();
        SocketProgramming socketObj = new SocketProgramming();                
        socketObj.sendChat(IPAddress.Parse("192.168.15.41"));              
    }
    else { return; }
}

获取用户的ip地址

public IPAddress getIP()
    {
        String direction = "";
        WebRequest request = WebRequest.Create("http://checkip.dyndns.org/");
        using (WebResponse response = request.GetResponse())
        using (StreamReader stream = new StreamReader(response.GetResponseStream()))
        {
            direction = stream.ReadToEnd();
        }

        //Search for the ip in the html
        int first = direction.IndexOf("Address: ") + 9;
        int last = direction.LastIndexOf("</body>");
        direction = direction.Substring(first, last - first);
        IPAddress ip = IPAddress.Parse(direction);
        return ip;
    }

【问题讨论】:

  • 不是一个答案,一个问题。有什么例外?拒绝?或类似的东西?发布错误代码和消息
  • 连接尝试失败,因为连接方在一段时间后没有正确响应,或者建立连接失败,因为连接的主机未能响应 192.168.15.41:7777。这是我得到的错误消息
  • @Marteen 你能帮帮我吗
  • 如果您尝试连接到 127.0.0.1 是否得到相同的结果?
  • 另外,只是为了检查一下——我假设你在某个时候打电话给receive

标签: c# sockets


【解决方案1】:

您似乎从未调用过您的 receive 方法。如果您的应用程序从未开始侦听,则没有人能够连接。如果您已经尝试过,并且遇到了异常,请发布该内容,我们将从那里开始。

【讨论】:

  • 当我调用接收方法时收到此异常“尝试以访问权限禁止的方式访问套接字”
  • 这可能是由多种原因引起的 - 另一个程序在同一端口上侦听、防火墙设置、防病毒软件。
  • 这工作正常。但是为什么我没有得到我的 IPAddress "192.168.15.41" ?
  • 您是说它适用于 127.0.0.1 但不适用于 192.168.15.41?我会说防火墙或防病毒软件。对于另一个问题,在OnClientConnect 的开头放置一个断点,看看代码是否到达那里。
  • 没有真正关注你。 127.0.0.1是环回地址,它会一直环回自己的电脑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-03
  • 1970-01-01
  • 2012-12-04
  • 1970-01-01
相关资源
最近更新 更多