socket连接,客户端断开连接,程序直接退出

eightwhells 2012-06-01 09:38:07
又是我,今天又遇到两个问题,
用socket做的服务器端和客户端的通讯,
服务器端启动监听,客户端启动连接,
客户端连接到服务器端之后开始传输数据。
一个问题是,
客户端循环给服务器端发送字符串,
服务器端循环接收字符串,
服务器端接收到得和客户端发送的信息格式不一致,
比如(一行是发送或者接收一次):
客户端发送:
aaaaaaaaaaa
bbbbbbbbbbbbb
cccccccccccc
服务器端接收:
aaaaaaaaaaabbb
bbbbbbbbbcccccc
cccccccccccccc
大概就是这样。为什么会这样呢?
要是想让他发送和接收是一样的顺序,
该怎么办呢?
另外,
连接建立以后,
客户端断开连接
使用的是 this.sock.Close();
然后直接服务器端和客户端程序都自动关闭了,
网上说,牵扯到SIGPIPE信号,需要捕捉错误,
就在服务器端和客户端加了 try catch,其实客户端牵扯到得代码基本都有try和catch
然后客户端再断开连接的时候,
服务器端没有终止,是捕捉到了错误,但是客户端依旧直接终止。
这个情况改造怎么处理呢??
请过往的大神们给点指点啊
...全文
1588 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
eightwhells 2012-06-01
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

引用 3 楼 的回复:

引用 2 楼 的回复:
另外,关于您在1楼的回复,
我想说,
有点高深,
不懂。

比如说:1-4字节里面的数值是整个字节流的长度,5-17是信息编号,18-26放一些扩展内容或者日期什么的。
26-30放发送内容的长度x,30-30+x就是内容的长度了。还可以加一些比如汉字编码方式之类的等等。

前面三个可以作为……
[/Quote]
各位前辈,
这些确实不理解,
之前一直在做网站,
对c/s模型的软件就没接触过。
能不能直接告诉我问题的解决方法,
我现在的问题是,
服务器端的socket接到一个字符串,
显示是 end 但是因为是
Byte[] r_data = new Byte[64];
this.resock.Receive(r_data, r_data.Length, 0);//接受数据
string str = System.Text.Encoding.BigEndianUnicode.GetString(r_data);
所以和直接定义的
"end"总是对比不上,
我想做个标记,
表示一段信息的传输结束,
这两个字符串比对不上,
就无法知道是不是到了结尾,
改怎么办呢??
ooo7880000 2012-06-01
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

引用 2 楼 的回复:
另外,关于您在1楼的回复,
我想说,
有点高深,
不懂。
[/Quote]
比如说:1-4字节里面的数值是整个字节流的长度,5-17是信息编号,18-26放一些扩展内容或者日期什么的。
26-30放发送内容的长度x,30-30+x就是内容的长度了。还可以加一些比如汉字编码方式之类的等等。

前面三个可以作为是消息头。
后面的可以作为是消息体。当然这个你可以自己定,哪怕不定义消息头也可以。

另外可以用抓包工具抓下流数据


流的解析方法:
字母或者数字:显示出来的是十六进制->十进制->对应ascall码表。
汉字:对应不同的编码方式。两个字节对应一个汉字。

本人对一楼的一些理解。不知道对不对。
eightwhells 2012-06-01
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

使用的是 this.sock.Close();
然后直接服务器端和客户端程序都自动关闭了,
网上说,牵扯到SIGPIPE信号,需要捕捉错误,
就在服务器端和客户端加了 try catch,其实客户端牵扯到得代码基本都有try和catch
然后客户端再断开连接的时候,
服务器端没有终止,是捕捉到了错误,但是客户端依旧直接终止。
这个情况改造怎么处理呢??


这个是你程序自己处理……
[/Quote]
多谢楼上提醒,
程序自动退出算是解决了,
但是其实也不明白为什么好了,
只是加了价格try catch。
另外,关于您在1楼的回复,
我想说,
有点高深,
不懂。
风之影子 2012-06-01
  • 打赏
  • 举报
回复
使用的是 this.sock.Close();
然后直接服务器端和客户端程序都自动关闭了,
网上说,牵扯到SIGPIPE信号,需要捕捉错误,
就在服务器端和客户端加了 try catch,其实客户端牵扯到得代码基本都有try和catch
然后客户端再断开连接的时候,
服务器端没有终止,是捕捉到了错误,但是客户端依旧直接终止。
这个情况改造怎么处理呢??


这个是你程序自己处理,即然你都捕捉到错误了,那么程序还退出,你设置个断点吧,程序应该是还有错误没有处理,另外建议你错误统一处理,不要每处都try catch。

有时间多理解一下socket原理
风之影子 2012-06-01
  • 打赏
  • 举报
回复
客户端循环给服务器端发送字符串,
服务器端循环接收字符串,
服务器端接收到得和客户端发送的信息格式不一致,
比如(一行是发送或者接收一次):


自己定一份数据协议,发送前封装,接收后拆包提取。

ooo7880000 2012-06-01
  • 打赏
  • 举报
回复

int length = 0;
length = sokClient.Receive(msg);
string strMsg = System.Text.Encoding.UTF8.GetString(msgArr, 0, length);
屌絲來襲 2012-06-01
  • 打赏
  • 举报
回复
http://www.cnblogs.com/JimmyZhang/archive/2008/09/07/1286300.html

看看这篇文章,应该有所启发
a12321321321312321 2012-06-01
  • 打赏
  • 举报
回复
客户端关闭socket 的时候 调用 rece方法返回的应该是0
a12321321321312321 2012-06-01
  • 打赏
  • 举报
回复
客户端的Socket NoDelay 属性设置为true试下。
ycproc 2012-06-01
  • 打赏
  • 举报
回复


这个问题是因为粘包了
你在发送的时候顺便发送一个标识符。保证不会再数据库中出现必须。
在接收的时候拆分掉就行了,while循环队列接收,所以这样错出来的效果是数据不会丢,也能解析。

111,096

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧