为什么邮件发送失败我做的SOCKET发送失败

2007年12月 C/C++大版内专家分月排行榜第二2006年11月 C/C++大版内专家分月排行榜第二
2007年12月 C/C++大版内专家分月排行榜第二2006年11月 C/C++大版内专家分月排行榜第二
2007年12月 C/C++大版内专家分月排行榜第二2006年11月 C/C++大版内专家分月排行榜第二
2007年7月 C/C++大版内专家分月排行榜第一2007年6月 C/C++大版内专家分月排行榜第一2007年5月 C/C++大版内专家分月排行榜第一2007年4月 C/C++大版内专家分月排行榜第一2007年3月 C/C++大版内专家分月排行榜第一2007年2月 C/C++大版内专家分月排行榜第一2007年1月 C/C++大版内专家分月排行榜第一2006年12月 C/C++大版内专家分月排行榜第一2006年11月 C/C++大版内专家分月排行榜第一2006年9月 C/C++大版内专家分月排行榜第一2006年8月 C/C++大版内专家分月排行榜第一2006年7月 C/C++大版内专家分月排行榜第一2006年6月 C/C++大版内专家分月排行榜第一2006年5月 C/C++大版内专家分月排行榜第一2006年4月 C/C++大版内专家分月排行榜第一2006年3月 C/C++大版内专家分月排行榜第一2005年8月 C/C++大版内专家分月排行榜第一
2007年8月 C/C++大版内专家分月排行榜第二2006年10月 C/C++大版内专家分月排行榜第二
2007年7月 C/C++大版内专家分月排行榜第一2007年6月 C/C++大版内专家分月排行榜第一2007年5月 C/C++大版内专家分月排行榜第一2007年4月 C/C++大版内专家分月排行榜第一2007年3月 C/C++大版内专家分月排行榜第一2007年2月 C/C++大版内专家分月排行榜第一2007年1月 C/C++大版内专家分月排行榜第一2006年12月 C/C++大版内专家分月排行榜第一2006年11月 C/C++大版内专家分月排行榜第一2006年9月 C/C++大版内专家分月排行榜第一2006年8月 C/C++大版内专家分月排行榜第一2006年7月 C/C++大版内专家分月排行榜第一2006年6月 C/C++大版内专家分月排行榜第一2006年5月 C/C++大版内专家分月排行榜第一2006年4月 C/C++大版内专家分月排行榜第一2006年3月 C/C++大版内专家分月排行榜第一2005年8月 C/C++大版内专家分月排行榜第一
2007年8月 C/C++大版内专家分月排行榜第二2006年10月 C/C++大版内专家分月排行榜第二
2007年7月 C/C++大版内专家分月排行榜第一2007年6月 C/C++大版内专家分月排行榜第一2007年5月 C/C++大版内专家分月排行榜第一2007年4月 C/C++大版内专家分月排行榜第一2007年3月 C/C++大版内专家分月排行榜第一2007年2月 C/C++大版内专家分月排行榜第一2007年1月 C/C++大版内专家分月排行榜第一2006年12月 C/C++大版内专家分月排行榜第一2006年11月 C/C++大版内专家分月排行榜第一2006年9月 C/C++大版内专家分月排行榜第一2006年8月 C/C++大版内专家分月排行榜第一2006年7月 C/C++大版内专家分月排行榜第一2006年6月 C/C++大版内专家分月排行榜第一2006年5月 C/C++大版内专家分月排行榜第一2006年4月 C/C++大版内专家分月排行榜第一2006年3月 C/C++大版内专家分月排行榜第一2005年8月 C/C++大版内专家分月排行榜第一
2007年8月 C/C++大版内专家分月排行榜第二2006年10月 C/C++大版内专家分月排行榜第二
本帖子已过去太久远了,不再提供回复功能。安全检查中...
请打开浏览器的javascript,然后刷新浏览器
< 浏览器安全检查中...
还剩 5 秒&socket发送失败(send)
&&&&当时做JRU网络通信时,就是通过判断send函数的返回值来判断服务器与客户端之间的网络连接是否正常,但是send成功时,并不意味着对方的recv函数就一定可以收到数据。
send发送成功只是说明send函数成功的把用户的数据写入到了网口芯片的发送缓存中,但是并不代表缓存中的数据已经发送成功,并且成功收到对方的确认ACK(计算机网络的相关知识)。
对于阻塞的send来说,即使网口的缓存中的空间已满,它依然不会返回错误,而会一直等待着有空余的缓存出现知道能把send中所有的数据都放进去为止。
send何时会发生错误呢?
我在网上没有找到自己想要的资料,都是说当其中网络连接出错时,在下一次send时就会返回错误。我结合我学过的计算机网络的知识说一下自己的想法,如果不准确,请多多指导下。
&&&&tcp协议send发送成功后是要求返回确认帧的(并不是每个都返回,可以在收到多个数据之后返回)。在网络中传输的数据帧是有一定的生存时间的,在IP协议中,就写了ip数据包的生存时间,也就是说,数据在网络中的传输是有时间限制的,如果socket通信的两端之间存在大量的路由器,或者网络突然出现了问题,没有从一段到另一端的路由,也许在规定的时间内数据无法正确的到达接收端,这样接收端也就无法返回一个ACK确认帧。如果发送端在一定时间内没有收到ACK确认帧,驱动程序就会告诉上层的在此调用的send函数,发送失败。
我自己也做了一下实验,当用我们自己的monitor与server相连,monitor连接了我自己写的一个数据发送程序(发数比较慢,所以不会在很短的时间内填满缓冲区),同时电脑上还挂着飞信和QQ。我电脑的网线连接到交换机A上,交换机通过一根网线连接到主交换机B上,当我断开交换机A与B之间的连接时(因为如果直接拔网线的话,电脑可以自动确定无网络连接)这三个程序都没有立即断开,都是过了一段时间才断开的,其中monitor是最先显示无法连接服务器的,因为它不断发送数据调用send函数能及时发现网络不通(网络返回错误信息后的再次调用send才会知道发送已经出现问题)的缘故。飞信与QQ都是过了一段时间才先后断开,我猜测是因为这两个软件每隔一段时间就给服务器发一条信息,以告诉服务器,自己还活着,因为他们send函数之间的时间间隔比我们monitor的send之间的时间间隔要长很多,所以才会晚断开一会。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。为什么我的socket接收大数据的时候接收不完全啊????大家帮忙啊!
- ITeye问答
这里是两个个客户端程序,我连一次服务器,服务器就要发送大概260000字节的数据。但是两个客户端分别都不能完整接收服务器传过来的数据,麻烦大家帮我看看怎么回事啊,谢谢大家。如果有好的代码,谢谢大家给出来。拜托拜托了!这个问题困惑我好几天了!!!
程序1如下(一次只能接收到1460字节):
import java.io.*;
import java.net.S
import java.net.UnknownHostE
public class MyClient {
public static String tcpTest(int port,String ipAdd){
String s="";
Socket socket = new Socket(ipAdd, port);
InputStream is = socket.getInputStream();
int bufSize = socket.getReceiveBufferSize();
byte[] receiveBuffer=new byte[(bufSize &1?1:bufSize)];
StringBuffer s1=new StringBuffer();
while (true) {
readSize=is.read(receiveBuffer);
byte[] b=new byte[readSize];
for(int i=0;i &i++){ &br=""&b[i]=receiveBuffer[i];
System.out.println(""+receiveBuffer[i]);
System.out.println("sys::"+new String(b));
s=new String(b);
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
System.out.println("错误");
} finally {
System.out.println("finally");
程序2如下(一次接收了一万多字节,但是距离二十几万的量还是很远啊):
import java.io.IOE
import java.io.InputS
import java.net.S
import java.net.UnknownHostE
public class ClientTe {
public static void main(String[] argv){
int port=15199;
String ip="127.0.0.1";
Socket socket=new Socket(ip,port);
//建立socket连接
InputStream in=socket.getInputStream();
byte[100];
//按每100字节循环
((len=in.read(buff))&-1){
//如果len==-1说明已经读到流结尾
System.out.println("re::"+len);
(len==100){
System.out.println("abc");
//已经读到数据,处理这些数据
for(int i=0;i &100;i++){
System.out.println("ii:"+buff[i]);//打印
出每一个字节
for(int i=0;i &i++){ &br=""&
System.out.println("ii:"+buff[i]);
System.out.println("aa:"+len);
//如果不足100字节就跳出循环(流末尾)
System.out.println("流读完");
in.close();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
大家帮我看看这两段程序为什么接收的数据都不完整啊?如果有更好的方法,谢谢告诉我,最好有代码。万分感激啊! 问题补充:哎,我就是不清楚服务器端的程序,我试过了,只有这种客户端写法才能接收到数据问题补充:Tcp/ip协议问题补充:是这样的,我现在不需要再考虑解包或者之类的了,因为接过来是个字节流,我现在需要的是,只把这个字节流一个字节一个字节接收完就行了,至于转换都不需要了。
还是实际试试吧. 呵呵.猜来猜去,都不行;
厉害,单字节收.不能这样写,根本不可能一次就收完的,你的缓冲区不会这么大,
第一 客户端先发一个要收的字节数大小个给服务端 就是你说的20万,服务端就一直收直到收到20万为止
引用是这样的,我现在不需要再考虑解包或者之类的了,因为接过来是个字节流,我现在需要的是,只把这个字节流一个字节一个字节接收完就行了,至于转换都不需要了。
两个程序接收的字节数不相同,说明本身Server总共要发20万的数据,但是是分开发送的,流长是不固定的。如果要分开发送,一点都不需要应用的规约,令人难以理解。
我觉得吧,可以采用移动处理话单的模式,生成话单文件,通过FTP传输,这样发生掉包的情况就很少了,你可以考虑一下改用FTP传输,然后在服务器解析
引用Tcp/ip协议
没错,大的协议是TCP/IP协议。但是服务器端和客户端的包的约定,也叫规约,还有叫规约的,譬如,数据格式,类型,包如何拆分等等。
呵呵..别猜了.
要服务端的逻辑文档;
合作和看服务端的代码吧;
要有服务端接口或者代码啊;
我说的方法,试过没? 是否有效?
做通信软件,难道没有人给你相关协议?
引用哎,我就是不清楚服务器端的程序,我试过了,只有这种客户端写法才能接收到数据
也就是说,你面对的是Black BOX?用ethereal(对了,现在叫做Wireshark)抓包工具抓包吧!
没有Server端的程序,不知咋做的,对大数据的处理是需要拆分包的,也就是说把大数据分成多次发送。
设置一下socket的超时时间试试,有时候丢包也可能是网络造成的
经过鉴定,发生了掉包的现象,这个问题很恶心,产生的原因很多,比如你的网络不稳定,导致接受的包的数据不完全,大数据量经常这样,你可以采用FTP,这个稳定一些
1.
引用Socket socket=new Socket(ip,port);& //建立socket连接
Socket socket=new Socket(ip,port);&
socket.setSoTimeout(10000); //设置超时时间,10秒
2.
引用//如果不足100字节就跳出循环(流末尾)
已解决问题
未解决问题}

我要回帖

更多关于 为什么消息发送失败 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信