C#Socket运行老是死掉——高分求助

电脑CPU是双核,1G内存代码如下:usingSystem.Net;usingSystem.Net.Sockets;usingSystem.Threading;names... 电脑CPU是双核,1G内存
代码如下:
using System.Net;
using System.Net.Sockets;
using System.Threading;
namespace Base_Server
{
public partial class Form1 : Form
{
private IPAddress _ip = IPAddress.Parse("192.168.1.33");
private IPEndPoint _myServer;
private Socket _socket;
private Socket acceSocket;
private bool check = true;
public Form1()
{ InitializeComponent(); }
private void button1_Click(object sender, EventArgs e)
{
try
{
if (this.textBox1.Text != null)
{
_ip = IPAddress.Parse(this.textBox1.Text.ToString());
}
}
catch{MessageBox.Show("你输入的格式不正确!");}
try
{ Listener(); }
catch (Exception ex)
{ this.textBox3.AppendText(ex.Message); }
}
private void Listener()
{
int port = Convert.ToInt32(this.textBox2.Text.Trim().ToString());
_myServer = new IPEndPoint(_ip,port);
_socket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
_socket.Bind(_myServer);
_socket.Listen(3);
this.textBox3.AppendText("主机"+_ip+" 端口"+port+"开始监听...");
while (true)
{
acceSocket = _socket.Accept();
if (acceSocket.Connected)
{ Thread myThread = new Thread(new ThreadStart(roand));
myThread.Start(); }
}
}
private void roand()
{
while (true)
{
while (check)
{
Byte[] res = new Byte[64];
NetworkStream nws = new NetworkStream(acceSocket);
nws.Read(res, res.Length, 0);
string message = System.Text.Encoding.UTF8.GetString(res);
this.richTextBox1.AppendText(res + "\r\n");
}
}
}
private void button2_Click(object sender, EventArgs e)
{
if (acceSocket != null)
{
try
{
string message = this.textBox2.Text.ToString() + "\r\n";
byte[] res = new byte[64];
NetworkStream nws = new NetworkStream(acceSocket);
res = System.Text.Encoding.UTF8.GetBytes(message.ToCharArray());
nws.Write(res, res.Length, 0);
}
catch
{
this.textBox3.AppendText("连接尚未建立,无法发送!!!" + "\r\n");
}
}
}
}
}
回1楼:Accept放到while(true)外还是一样
回3楼:把while所有while去掉还是死
展开
 我来答
C__生活
2010-08-22 · 超过17用户采纳过TA的回答
知道答主
回答量:59
采纳率:50%
帮助的人:18万
展开全部
socket侦听的过程是阻塞模式的,虽然你把侦听过来的套接字都放在一个独立的进程中,但是有一点没有注意到:你也应该把侦听套接字的while 函数放在一个独立于主线程的子线程当中。
不然的话主线程一直没有走出while函数,在套接字阻塞式下等待下一个套接字的连接, 窗口就会出现假死的现象。
还有一点就是你在线程体函数roand()里有修改主线程口里某个控件的值的行为,违反了线程安全,这属于夸线程访问哦,在这里我不多说了你可以到百度上搜一下多得是!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
威孚半导体技术
2024-08-19 广告
威孚(苏州)半导体技术有限公司是一家专注生产、研发、销售晶圆传输设备整机模块(EFEM/SORTER)及核心零部件的高科技半导体公司。公司核心团队均拥有多年半导体行业从业经验,其中技术团队成员博士、硕士学历占比80%以上,依托丰富的软件底层... 点击进入详情页
本回答由威孚半导体技术提供
叢林守護者
2010-08-30 · TA获得超过190个赞
知道小有建树答主
回答量:133
采纳率:0%
帮助的人:0
展开全部
你真牛!!
别说1G内存了,就算是4核+4G也得死!

Listener中不可使用while(true),也没必要开辟线程来实现异步。
另外线程内别在while(true)了。
1个cpu时间会执行多少次这个while(true)吗?
计算int.MaxValue的累加也用不了一个CPU时间。
CPU迅速达到99%,内存也很快达到2/3。

_socket.Accept()返回的socket保存到list或dictionary中,这样服务端可以控制客户端的连接(T人,指定某人回复);

至于异步,别使用线程,因为你这里没有使用线程池,如果使用socket自带的异步方法(或自定义委托)这样会更好。

private void button1_Click(object sender, EventArgs e)
{
Socket server = new TcpClient().Client;
server.BeginAccept(new AsyncCallback(this.callback),server);
}

private void callback(IAsyncResult result)
{
if (result.IsCompleted)
{
Socket server = result.AsyncState as Socket;
var client = server.EndAccept(result);
}
}
就是大量使用begin** 和end**
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
iceser
2010-08-22 · TA获得超过2708个赞
知道大有可为答主
回答量:695
采纳率:100%
帮助的人:436万
展开全部
1、你在窗口主线程里,执行while(true)循环Accept,窗口会死掉。

2、你在非窗口主线程里,直接对窗口控件进行修改,这个也会死掉。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
奔跑2024
2010-08-22 · TA获得超过218个赞
知道小有建树答主
回答量:405
采纳率:0%
帮助的人:201万
展开全部
最好 把 死循环 写入线程中去, 这样就避免了窗口死掉的情况
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式