① 我在使用CSocket::Send(字符,长度);发送数据的时候,怎样把握长度的设置怎么才能得到长度的最大值
可以使用多线程传送同时设置缓冲区大小
3.在send(),recv()过程中有时由于网络状况等原因,发收不能预期进行,而设置收发时限:
int nNetTimeout=1000;//1秒
//发送时限
setsockopt(socket,SOL_S0CKET,SO_SNDTIMEO,(char *)&nNetTimeout,sizeof(int));
//接收时限
setsockopt(socket,SOL_S0CKET,SO_RCVTIMEO,(char *)&nNetTimeout,sizeof(int));
4.在send()的时候,返回的是实际发送出去的字节(同步)或发送到socket缓冲区的字节
(异步);系统默认的状态发送和接收一次为8688字节(约为8.5K);在实际的过程中发送数据
和接收数据量比较大,可以设置socket缓冲区,而避免了send(),recv()不断的循环收发:
// 接收缓冲区
int nRecvBuf=32*1024;//设置为32K
setsockopt(s,SOL_SOCKET,SO_RCVBUF,(const char*)&nRecvBuf,sizeof(int));
//发送缓冲区
int nSendBuf=32*1024;//设置为32K
setsockopt(s,SOL_SOCKET,SO_SNDBUF,(const char*)&nSendBuf,sizeof(int));
5. 如果在发送数据的时,希望不经历由系统缓冲区到socket缓冲区的拷贝而影响
程序的性能:
int nZero=0;
setsockopt(socket,SOL_S0CKET,SO_SNDBUF,(char *)&nZero,sizeof(nZero));
6.同上在recv()完成上述功能(默认情况是将socket缓冲区的内容拷贝到系统缓冲区):
int nZero=0;
setsockopt(socket,SOL_S0CKET,SO_RCVBUF,(char *)&nZero,sizeof(int));
② 请问用MFC 里面的CSocket 建立长连接模式的TCP/IP通信传输数据的时候步骤是怎么样的
你看一下send函数调用的返回值,返回值会告诉你为什么没有发送成功.如果发送成功,send的返回值应该是要发送的数据的字节数
③ c#socket怎么传输大数据
constintblockLength=512*1024;
publicvoidSendFile(stringfilePath,NetworkStreamstream)//发送文件
{
//传输内容
using(FileStreamfs=File.Open(filePath,FileMode.Open))
{
intreadLength=0;
byte[]data=newbyte[blockLength];
//发送大小
byte[]length=newbyte[8];
BitConverter.GetBytes(newFileInfo(filePath).Length).CopyTo(length,0);
stream.Write(length,0,8);
//发送文件
while((readLength=fs.Read(data,0,blockLength))>0)
{
stream.Write(data,0,readLength);
}
}
}
publicboolReceiveFile(stringfileName,NetworkStreamstream)//接收文件
{
try
{
longcount=GetSize(stream);
if(count==0)
{
returnfalse;
}
longindex=0;
intcurrentBlockLength=0;
intreceivedBytesLen=1;
using(FileStreamfs=newFileStream(fileName,FileMode.OpenOrCreate))
{
while(receivedBytesLen>0&&index<count)
{
byte[]clientData=newbyte[blockLength];
receivedBytesLen=0;
if(blockLength<count-index)
{
currentBlockLength=blockLength;
}
else
{
currentBlockLength=(int)(count-index);
}
receivedBytesLen=stream.Read(clientData,0,currentBlockLength);
fs.Write(clientData,0,receivedBytesLen);
index+=receivedBytesLen;
}
}
}
catch(Exceptionex)
{
MessageBox.Show(ex.Message);
returnfalse;
}
returntrue;
}
privateintGetSize(NetworkStreamstream)//获取文件大小
{
intcount=0;
byte[]countBytes=newbyte[8];
try
{
if(stream.Read(countBytes,0,8)==8)
{
count=BitConverter.ToInt32(countBytes,0);
}
else
{
return0;
}
}
catch
{
return0;
}
returncount;
}
④ C 语言socket 的send数据太大,最大能发送多少如何分批发送
如果你SOCKET发的数据报,比如UDP协议, 那么是有最大可发送大小.
这可以用下面这样getsockopt取得最大数据报大小.
----------------------------------------
SOCKET s;
int iSize, iVal, ret;
.....
iSize = sizeof(iVal);
ret = getsockopt(s, SOL_SOCKET, SO_MAX_MSG_SIZE, (char *)&iVal, &iSize);
//-----------------------------------------
如果是TCP,则不需要这样做.
你send返回的字节数有801770个字节(是字节数吧!),和send里的规定length一样大,这可以表明你成功的将这些数据提交底层TCP协议栈去发送。
接收方要是处理成确的,是可以正确无误的收到这些数据的。
//---------------------------------------------
TCP 提供的是可靠的数据流服务 , 这意味着, 接收方,并不需要关心也不应该假定发送方调用了多少次SEND, 它只需要管的是通过若干次RECV把数据从协议栈的缓冲区读取出来。
TCP不必担心丢数据,但发送的时候,SEND要注意处理返回值,如果是阻塞方式,太多的数据会被阻塞, 如果是非阻方式,返回缓冲区满错,然后延时重发。
⑤ socket怎么分段传输大数据
算了,抄我给你举个例子吧。我猜你也一袭下子想不出什么完整的描述。
比如说你传送一个视频,比如说原来是
var cmd = new Media{ bytes= data, object_id="123133213"};
那么你现在可以传
var cmd = new MediaPart{ bytes= data, object_id="123133213", position=77844};
由于它们都有object_id,因此知道目标是什么。所不同的,后者在传送之前,你可能需要首先声明一下 123133213 号对象的完整的长度,这样服务器端每当接收到(多个) MediaPart 的时候就可以判断是否已经接收完全了,一旦接收到完整数据,才开始下一步处理。
⑥ c# socket传送大数据总是截断
8192=8*1024. 你这是8K的数据,偏小。一般不会是服务端的大小限制。既然序列化和反序列都是你自己发送、接受。跟踪一下两端的异常信息才可以进一步判断
⑦ 如何解决大数据量发送时 send 阻塞的问题
自己设置一个缓冲区,把待发的数据放在缓冲里,取出一个来发,发完后再取下一个。MFC的CSocket有源码,可以看一下它的Send 是怎么实现的。
⑧ 怎样连续获得CSocket中的数据
然后客户端连续发消息,用csocket::send函数即可 服务端接收消息,用csocket::receive 函数即可 最好是客户端和服务端都使用重载csocket类的对象 onreceive是接收函数响应消息,只要有东西传它就自动响应 最好在网上下一个例子看以下把
⑨ CSocket类的Send()函数问题:连续发送多次为什么只收到一次
楼主可能没搞清楚,当每个socket建立后会有一个发送缓冲区和一个接收缓冲区,windows系统默认是8KB,send调用成功以后数据并没有立即发出去,而只是把发送的数据复制到发送缓冲区,由操作系统底层实现发送功能,发送到接受端的接收缓冲区。为了减轻网络负担,一般的TCP链接用了nagle算法,并不是发送缓冲区有数据就会发送的。
对于接收端来说,receive(char *buf,num)只是从接收缓冲区里面取数据,返回的值就是取得的数据大小。你多次send,如果数据量不大,而num的值超过了发送的总值,那么就会一次取完接受缓冲区的数据。
不知道这样解释楼主清楚了没有。
⑩ socket发送大数据如何分包发送问题
粘包、分包、解包
参考版下面权: http://blog.csdn.net/sqldebug_fan/article/details/20465455