socket接收文件始终只能接收8KB的数据
客户端发送代码:
//m_file是CFile类型。SENDBUFFERSIZE的大小是4096
while (m_file.Read(cFileBuff,SENDBUFFERSIZE)!=0)
{
sendto(sockClient,cFileBuff,SENDBUFFERSIZE,0,(sockaddr*)&ServerInfo,sizeof(sockaddr));
}
while (totalSize>0)
{
unsigned long count=recvfrom(FileServer,cRecvFile,SENDBUFFERSIZE,0,
(sockaddr *) &ClientInfo,&iLengthOfSockaddr);
cFile.Write(cRecvFile,count);
cFile.Flush();
totalSize-=count;
}
iResult = recvfrom(...);
if (iResult == SOCKET_ERROR) {
wprintf(L"recvfrom failed with error %d\n", WSAGetLastError());
}
int nfds;
FD_SET wfds, fds;
FD_ZERO(&fds);
nfds = sockClient + 1;
FD_SET(sockClient, &fds);
while (m_file.Read(cFileBuff,SENDBUFFERSIZE)!=0)
{
wfds = fds;
if (select(nfds, NULL, &wfds, NULL, NULL) < 0) {
perror("select");
break;
}
sendto(sockClient,cFileBuff,SENDBUFFERSIZE,0,(sockaddr*)&ServerInfo,sizeof(sockaddr));
}
UINT nRead;
while ((nRead = m_file.Read(cFileBuff,SENDBUFFERSIZE)) > 0)
{
sendto(sockClient,cFileBuff,nRead,0,(sockaddr*)&ServerInfo,sizeof(sockaddr));
}
[解决办法]
recvefrom是阻赛的,如果数据收完了再收就处理等待了,建议每次收完数据判断是否接收完毕,如果接收完毕就处理,处理了再等待接收。
[解决办法]
不要设置为异步套接字
[解决办法]
是不是发送太快,接收端来不及接收啊。
Sleep(100)难道不够?
[解决办法]
完全绝望了!
是不是多线程的问题?
[解决办法]
将0改为MSG_PEEK就可以了,这样就是预读模式,你看看网络编程里面的参数说明吧
[解决办法]
cfile的名字接受的时候多加一个后缀名.tmp,都接受完后把.tmp去掉。不知道行不行,你试试。
[解决办法]
不知道有多少前人掉在TCP Socket
send(人多)send(病少)send(财富)
recv(人多病)recv(少财富)
陷阱里面啊!
http://topic.csdn.net/u/20120210/09/51109ed0-07b9-41f2-b487-a51597f2ca01.html
void HexDump(char *buf,int len) {
int i,j,k;
char binstr[80];
for (i=0;i<len;i++) {
if (0==(i%16)) {
sprintf(binstr,"%04x -",i);
sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
} else if (15==(i%16)) {
sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
sprintf(binstr,"%s ",binstr);
for (j=i-15;j<=i;j++) {
sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');
}
printf("%s\n",binstr);
} else {
sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
}
}
if (0!=(i%16)) {
k=16-(i%16);
for (j=0;j<k;j++) {
sprintf(binstr,"%s ",binstr);
}
sprintf(binstr,"%s ",binstr);
k=16-k;
for (j=i-k;j<i;j++) {
sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');
}
printf("%s\n",binstr);
}
}
发送采用了打包发送,这个打包是由底层协议控制的。你可以单独在调试状态下连续两次发送一个字符串,接受端看看接收情况,发送是否是两次发送都一样还是把数据拆开了发。有可能是发送完了,但是把你的数据包格式拆分开了,在接收端要注意,观察接收端收到的数据是收到了你没处理好。
[解决办法]