none
c#tcp sockets 連線問題 RRS feed

  • 問題

  • 各位前輩好:

    由於小弟在學習tcp的應用連接

    日前看到一篇文章就照著他練習,由於他ip是打127.0.0.1,所以小弟就打他改成小弟的主機ip

    一開始試得狀況是 我客戶端和server端在同一台電腦上就可以連接和傳送資料

    可是我想要實現不同連腦傳接資料,所以把客戶端搬到另一台電腦

    可是就無法連接了,會出現錯誤0x80004005,說沒有回應連接過時

    因為另一台電腦是用wifi,是這問題嗎?

    還是出了什麼問題?

    參考文章:https://social.msdn.microsoft.com/Forums/zh-TW/8507decc-1e55-4ca5-ad43-2ad9fb5c0ba9/socket?forum=233


    2016年3月22日 下午 03:50

解答

  • 防火牆有沒有開...

    強力監督SQL Injection問題!!

      • 小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
      • 雲端學堂Facebook: http://www.facebook.com/studyazure

    • 已標示為解答 MUSERRR 2016年3月30日 下午 12:38
    2016年3月22日 下午 03:54
    版主
  • 是兩台都要打開嗎?

    這要看防火牆的設定了, 但一般情形防火牆對外出的連線管制通常比較鬆, 而對連入的連線管制比較嚴. 所以通常是 Tcp Listener 那一端要在防火牆開啟對應的 Tcp Port .


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。


    2016年3月22日 下午 04:54
    版主
  • 兩台電腦的防火牆先設定關閉, 如果程式可以通, 就可以確定是防火牆封鎖的問題, 之後再開啟防火牆進行設定即可, 如果兩台電腦的防火牆都關閉之後還不通, 就是程式的問題了
    • 已標示為解答 MUSERRR 2016年3月30日 下午 12:38
    2016年3月23日 上午 01:10

所有回覆

  • 防火牆有沒有開...

    強力監督SQL Injection問題!!

      • 小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
      • 雲端學堂Facebook: http://www.facebook.com/studyazure

    • 已標示為解答 MUSERRR 2016年3月30日 下午 12:38
    2016年3月22日 下午 03:54
    版主
  • 是兩台都要打開嗎?
    2016年3月22日 下午 04:49
  • 是兩台都要打開嗎?

    這要看防火牆的設定了, 但一般情形防火牆對外出的連線管制通常比較鬆, 而對連入的連線管制比較嚴. 所以通常是 Tcp Listener 那一端要在防火牆開啟對應的 Tcp Port .


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。


    2016年3月22日 下午 04:54
    版主
  • 好的,我去研究室再試試看

    所以code沒有什麼問題囉?

    感謝!!

    2016年3月23日 上午 01:03
  • 兩台電腦的防火牆先設定關閉, 如果程式可以通, 就可以確定是防火牆封鎖的問題, 之後再開啟防火牆進行設定即可, 如果兩台電腦的防火牆都關閉之後還不通, 就是程式的問題了
    • 已標示為解答 MUSERRR 2016年3月30日 下午 12:38
    2016年3月23日 上午 01:10
  • 好的!!感謝
    2016年3月23日 上午 02:36
  • 好的,我去研究室再試試看

    所以code沒有什麼問題囉?

    感謝!!

    你又沒給 code  , 我們怎麼會知道 code 有沒有問題.


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2016年3月23日 下午 12:29
    版主
  • 沒說清楚,就跟參考文章裡的一樣
    2016年3月24日 下午 01:35
  • CLIENT:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Net;
    using System.Net.Sockets;
    using System.Diagnostics;
    using System.IO;
    
    namespace WindowsFormsApplication6
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
            Socket server;
            public AsyncCallback pfnWorkerCallBack;
            const int MAX_Buffer_Size = 1024;
            delegate void SetTextCallback(int index, String text);
            IAsyncResult Result;
            public class SocketPacket
            {
                public Socket m_currentSocket;
                public byte[] dataBuffer = new byte[MAX_Buffer_Size];
                public StringBuilder sb = new StringBuilder();
            }
            private void button1_Click(object sender, EventArgs e)
            {
                server = new Socket(AddressFamily.InterNetworkV6, SocketType.Stream, ProtocolType.Tcp);
                IPEndPoint iped = new IPEndPoint(IPAddress.Parse("fe80::18e3:8a7d:b613:87fa"), 1234);
                try
                {
                    server.Connect(iped);
                }
                catch (Exception se)
                {
                    MessageBox.Show(se.ToString());
                }
    
            }
    
            private void button2_Click(object sender, EventArgs e)
            {
                openFileDialog1.Filter = "All files (*.*)|*.*";
                if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                {
                    string fileName = openFileDialog1.SafeFileName.ToString();
                    byte[] fileNameByte = Encoding.ASCII.GetBytes(fileName);
                    byte[] fileData = File.ReadAllBytes(openFileDialog1.FileName.ToString());
                    byte[] clientData = new byte[4 + fileNameByte.Length + fileData.Length];
                    byte[] fileNameLen = BitConverter.GetBytes(fileNameByte.Length);
                    fileNameLen.CopyTo(clientData, 0);
                    fileNameByte.CopyTo(clientData, 4);
                    fileData.CopyTo(clientData, 4 + fileNameByte.Length);
                    server.BeginSend(clientData, 0, clientData.Length, SocketFlags.None, new AsyncCallback(SendCallBack), server);
                    textBox1.Text = "done";
                }
            }
            public static void SendCallBack(IAsyncResult asyncResult)
            {
                Socket server = (System.Net.Sockets.Socket)asyncResult.AsyncState;
                int bytesSend = server.EndSend(asyncResult);
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
    
            }
        }
    }

    SERVER:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Net;
    using System.Net.Sockets;
    using System.Diagnostics;
    using System.IO;
    
    namespace WindowsFormsApplication2
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            const int MAX_CLIENTS = 10;
            const int MAX_Buffer_Size = 1024 * 50000;
            private Socket[] WorkerSocket = new Socket[MAX_CLIENTS];
            private int ClientCount = 0;
            private SocketPacket theSocPkt;
            private Socket newsock;
            public AsyncCallback pfnWorkerCallBack;
            delegate void SetTextCallback(int index, String text);
    
            public class SocketPacket
            {
                public Socket m_currentSocket;
                public byte[] dataBuffer = new byte[MAX_Buffer_Size];
                public StringBuilder sb = new StringBuilder();
    
            }
    
    
            public void OnClientConnect(IAsyncResult asyn)
            {
                try
                {
                    WorkerSocket[ClientCount] = newsock.EndAccept(asyn);
                    theSocPkt = new SocketPacket();
                    WaitForData(WorkerSocket[ClientCount]);
                    ++ClientCount;
                    newsock.BeginAccept(new AsyncCallback(OnClientConnect), null);
                }
                catch (ObjectDisposedException) { Debugger.Log(0, "1", "\n OnClientConnection: Socket has been closed\n"); }
                catch (SocketException se) { MessageBox.Show(se.Message); }
                catch (Exception es) { MessageBox.Show(es.Message); }
            }
            public void WaitForData(Socket soc)
            {
             
                try
                {
    
                    Socket clientSock = soc;
                    byte[] clientData = new byte[1024 * 50000];
                    string receivedPath = "C:/Users/user/Desktop/server/123/";
                    int receivedBytesLen = clientSock.Receive(clientData);
                    int fileNameLen = BitConverter.ToInt32(clientData, 0);
                    string fileName = Encoding.ASCII.GetString(clientData, 4, fileNameLen);
                    BinaryWriter bWrite = new BinaryWriter(File.Open(receivedPath + fileName, FileMode.Append));
                    bWrite.Write(clientData, 4 + fileNameLen, receivedBytesLen - 4 - fileNameLen);
                    bWrite.Close();
                    soc.BeginReceive(theSocPkt.dataBuffer, 0,
                         theSocPkt.dataBuffer.Length,
                         SocketFlags.None,
                         pfnWorkerCallBack,
                         theSocPkt);
                }
                catch (SocketException se) { MessageBox.Show(se.Message); }
                catch (Exception es) { MessageBox.Show(es.Message); }
            }
            private void label3_Click(object sender, EventArgs e)
            {
    
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                IPAddress[] ipa = Dns.GetHostAddresses(Dns.GetHostName());
                label3.Text = Dns.GetHostName();
                IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("fe80::18e3:8a7d:b613:87fa"), 1234);
                label2.Text = ipa[0].ToString();
                newsock = new Socket(AddressFamily.InterNetworkV6, SocketType.Stream, ProtocolType.Tcp);
                newsock.Bind(ipep);
                newsock.Listen(10);
                newsock.BeginAccept(new AsyncCallback(OnClientConnect), null);
                label1.Text = "等待連線中..";
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
    
            }
        }
    }

    關防火牆還是無法連

    請各位幫我看看


    • 已編輯 MUSERRR 2016年3月30日 上午 11:33 修改
    2016年3月30日 上午 11:31
  • 已經可以了

    把ip類型改成ipv4就行了

    2016年3月30日 下午 12:38