当前位置:编程学习 > C#/ASP.NET >>

socket关闭时出错


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.Threading;

namespace MyServer
{
    public partial class ServerForm : Form
    {
        private IPEndPoint ipep;
        private Socket socket;
        private Thread thread;

        private delegate void MyThread(Socket socket);
        private delegate void SetListBoxItem(string text);

        private void setText(string text)
        {
            lbMessage.Items.Add(text);
        }

        public ServerForm()
        {
            InitializeComponent();

            btnStar.Enabled = true;
            btnEnd.Enabled = false;
        }

        private void btnStar_Click(object sender, EventArgs e)
        {
            try
            {
                this.ipep = new IPEndPoint(IPAddress.Any, 6001);
                this.socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

                this.socket.Bind(ipep);
                this.socket.Listen(5);

                this.thread = new Thread(new ThreadStart(starListen));
                this.thread.IsBackground = true;
                this.thread.Start();

                lbMessage.Items.Add("服务器开启成功");

                btnStar.Enabled = false;
                btnEnd.Enabled = true;
            }
            catch (Exception)
            {
                lbMessage.Items.Add("服务器开启失败");
            }
        }

        private void btnEnd_Click(object sender, EventArgs e)
        {
            try
            {
                this.thread.Abort();

                this.socket.Shutdown(SocketShutdown.Both);
                this.socket.Close();

                this.ipep = null;
                this.socket = null;

                lbMessage.Items.Add("服务器关闭成功");

                btnStar.Enabled = true;
                btnEnd.Enabled = false;
            }
            catch (Exception)
            {
                lbMessage.Items.Add("服务器关闭失败");
            }
        }

        private void starListen()
        {
            do
            {
                try
                {
                    MyThread myThread = new MyThread(getLink);
                    myThread.BeginInvoke(this.socket.Accept(), null, null);
                }
                catch (Exception)
                {
                    continue;
                }
            } while (true);
        }

        private void getLink(Socket socket)
        {
            Thread thread = Thread.CurrentThread;
            thread.IsBackground = true;

            int length;
            byte[] data;
            bool temp = true;
            SetListBoxItem setListBoxItem = new SetListBoxItem(setText);
            IPEndPoint ipep = (IPEndPoint)socket.RemoteEndPoint;

            string ipAndPort = ipep.Address + ":" + ipep.Port;
            if (lbMessage.InvokeRequired)
                lbMessage.Invoke(setListBoxItem, new object[] { ipAndPort + " 已连接" });
            else
                lbMessage.Items.Add(ipAndPort + " 已连接");

            do
            {
                try
                {
                    data = new byte[1024];
                    length = socket.Available;
                    socket.Receive(data, 0, length, SocketFlags.None);

                    if (length == 0)
                        continue;

                    if (lbMessage.InvokeRequired)
                        lbMessage.Invoke(setListBoxItem, new object[] { Encoding.Default.GetString(data) });
                    else
                        lbMessage.Items.Add(Encoding.Default.GetString(data));

                    socket.Send(Encoding.Default.GetBytes("发送成功"), 8, SocketFlags.None);
                }
                catch (Exception)
                {
                    temp = false;
                }
            } while (temp);

            if (lbMessage.InvokeRequired)
                lbMessage.Invoke(setListBoxItem, new object[] { ipAndPort + " 已断开" });
            else
                lbMessage.Items.Add(ipAndPort + " 已断开");

            socket.Close();
            thread.Abort();
        }
    }
}



不管有或者无客户端连接情况下
this.socket.Shutdown(SocketShutdown.Both);
都会报错 错误是 由于套接字没有连接并且(当使用一个 sendto 调用发送数据报套接字时)没有提供地址,发送或接收数据的请求没有被接受。
求解答 --------------------编程问答-------------------- 怀疑是防火墙的问题,试试,将程序加入到防火墙的信任列表里面。 --------------------编程问答-------------------- 没人来解答吗? --------------------编程问答--------------------
引用 1 楼 kongdelu2008 的回复:
怀疑是防火墙的问题,试试,将程序加入到防火墙的信任列表里面。

防火墙是关闭着的 --------------------编程问答-------------------- --------------------编程问答-------------------- 看了一下你的代码,this.socket.Listen(5);最多只能接受5个客户端的连接
但是,这句并没有起到作用,因为你的设计模式中,只能接受一个客户端的连接
而且,你在发送和接受数据后,就把连接关闭了

socket.Close();
thread.Abort();

把这两句代码注释掉试试先。
还有在关闭连接按钮事件里,不要一下就关闭,要先判断一下socket是否为空,如:

         if(socket != null)  
         { 
            try
            {
                this.thread.Abort();

                this.socket.Shutdown(SocketShutdown.Both);
                this.socket.Close();

                this.ipep = null;
                this.socket = null;

                lbMessage.Items.Add("服务器关闭成功");

                btnStar.Enabled = true;
                btnEnd.Enabled = false;
            }
            catch (Exception)
            {
                lbMessage.Items.Add("服务器关闭失败");
            }
         }


再者,在接受客户端连接的时候,不要直接就去getLink(Socket socket)
先判断一下

Socket socketServer = this.socket.Accept();
if(socketServer.Connected)
{
     //再调用getLink(Socket socket)
}



希望对你有帮助 --------------------编程问答-------------------- 持续关注 --------------------编程问答--------------------
引用 5 楼 happyday1799 的回复:
看了一下你的代码,this.socket.Listen(5);最多只能接受5个客户端的连接
但是,这句并没有起到作用,因为你的设计模式中,只能接受一个客户端的连接
而且,你在发送和接受数据后,就把连接关闭了

C# code

socket.Close();
thread.Abort();


把这两句代码注释掉试试先。
还有在关闭连接按钮事件里,不要一下就关闭,要先判断一下……

好的 我去看下
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,