2 u012293946 u012293946 于 2014.05.06 15:33 提问

socket传输文件时遇到的问题!

先给出代码。
客户端:
SOCKET sockClient = socket(AF_INET, SOCK_STREAM, 0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(4444);

HANDLE fp =CreateFile(L"E:\aTest.txt",GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

DWORD fileLen =GetFileSize(fp, &fileLen);
cout << "你选择的文件大小为:" << fileLen << endl;

connect(sockClient, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));

char * buffer = new char[fileLen];
DWORD bufferLen = 0;

ReadFile(fp, buffer, fileLen, &bufferLen, NULL);

bool isFirst = true;
int sendLen = 0;
int sentLen = 0;
char sendBuffer[200];
int leftLen = fileLen;

while (true)
{
if (isFirst)
{
sendLen = send(sockClient, "Test", 1, 0);
isFirst = false;
if (sendLen < 0)
{
cout << "第一帧发送失败,程序结束." << endl;
break;
}
Sleep(1000);
continue;
}

if ((leftLen <= 0) || (sentLen >= fileLen))
break;

if (leftLen >= 200)
{
memcpy(sendBuffer, buffer + sentLen, 200);
sendLen = send(sockClient, sendBuffer, 200, 0);
if (sendLen < 0)
{
cout << "帧发送失败,程序结束." << endl;
break;
}
}

else
{
memcpy(sendBuffer, buffer + sentLen, leftLen);
sendLen = send(sockClient, sendBuffer, leftLen, 0);
if (sendLen < 0)
{
cout << "帧发送失败,程序结束." << endl;
break;
}
Sleep(1000);
send(sockClient, "#", 1, 0);
}
sentLen += sendLen;
leftLen = fileLen - sentLen;
cout << "已经发送" << sentLen << endl;
}

if (sentLen == fileLen)

cout << "文件发送成功." << endl;
else
cout << "文件发送失败." << endl;

closesocket(sockClient);
WSACleanup();
delete[] buffer;
}
服务器端:
SOCKET socksrv = socket(AF_INET, SOCK_STREAM, 0);

SOCKADDR_IN addrsrv;
addrsrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
addrsrv.sin_family = AF_INET;
addrsrv.sin_port = htons(4444);

bind(socksrv, (sockaddr*)&addrsrv, sizeof(SOCKADDR));

listen(socksrv, 5);

SOCKADDR_IN addrclient;
int len = sizeof(SOCKADDR);

int recvLen = 0;
int recvedLen = 0;
DWORD writeLen;
int fileLen = 0;
char* buffer;
char recvBuffer[200];

while (1)
{
SOCKET sockconn = accept(socksrv, (SOCKADDR*)&addrclient, &len);

buffer = new char[1024 * 1024 * 10];
recvLen = recv(sockconn, recvBuffer, 200, 0);
if (recvBuffer[0] == 'test')
{
printf("开始接收文件\n");
memset(recvBuffer, 0, 200);
}
while (true)
{
recvLen = recv(sockconn, recvBuffer, 200, 0);
if ((recvLen == 1) && (recvBuffer[0] == '#'))
break;
memcpy(buffer + recvedLen, recvBuffer, recvLen);
recvedLen += recvLen;
printf("接收:%d\n", recvLen);
printf("已经接收%i字节数据\n", recvedLen);
}
HANDLE fp = CreateFile(L"C://Users\apple\Desktop", GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
WriteFile(fp, buffer, recvedLen, &writeLen, NULL);
printf("写入文件长度:%u\n", writeLen);

delete[] buffer;
WSACleanup();

}
}
代码有点乱,还有许多要改的地方,但是大体框架是这样。
运行的时候,客户端能够成功发送文件,服务器端也能正确显示接受的文件大小,然后写入文件却是0,然后就报错,不知道是为什么?

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
socket 网络接收数据问题(0X00问题)
在用vc++6.0中做网络通讯时,用 recv(  SOCKET s,  char* buf,  int len,  int flags); 发现接收到的数据会 把00截取掉,如服务端发送十六进制的“30 31 32 33 00 34 35”,这边接收到的数据只有“30 31 32 33 ”这个了,不知道什么原因,请教高手! ==============================
利用Socket传输文件时,接收方判断文件末尾的方法
Socket传输文件。一般采用文件流的方式。无论要传输的文件什么样的类型,它都是文件,我们都可以将它看成是文本文件。尽管用记事本打开后它有可能乱码。这一种意识很重要,因为这能有效地降低搭建程序的难度,简化问题的复杂性。 既然把文件都看成是文本文件了,那么就很容易理解要传输的文件是由一个一个的“字符”(Char)构成,因此,为了加快传输,便想起了使用缓冲式发送和接收。方法就是声明一个缓冲池,
java使用socket实现文件传输时的接收判断
java实现socket的关键参考代码主要来自以下文章 java Socket 文件传输 当java实现socket信息传输后,在进一步实现文件传输的时候经常会发生文件传了出去,但接收方收不到,即生成的文件大小为0字节。这是因为接收的时候没有做好判断导致的。 主要判断模块如下所示: while ((length = s.read(buffer, 0, buffer.length)) >
RSA加密Socket传输文件、签名
RSA加密Socket传输文件、签名 转自 CSDN /dyyaries (一) RSA加密分为公钥加密和私钥解密以及可能的数字签名。 公钥、私钥分居客户端和服务器端,分别用于加密和解密。同时,私钥还用于签名,公钥还用于验证签名。 解密加密用到JDK中java.security、javax.crypto两个包中相关的接口和类 1.生成密钥的代码 SecureRandom sr
java-Socket文件上传/进度条
客户端代码:   1、客户端运行程序: package wtb.khd; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStre
java-socket传输zip文件实例
服务器端程序: import java.io.*; import java.net.*; import java.io.BufferedInputStream;   public class SocketServer { ServerSocket ss=null; Socket s=null; DataInputStream inStream=null; DataOutputSt
JAVA SOCKET 实现多线程文件传输(Server端的多线程,Client一次只有一个)
1.最近一个项目需要实现客户端文件上传到server,但是不希望把文件上传z
linux socket 传输大文件解决方案
linux 下socket 大文件传输解决方案 附带源码 支持大文件
TCP的socket编程中常见问题及注意事项
TCP的socket编程中常见问题及注意事项
Java:Socket断点传输大文件
解决思路 Sever端负责接收指令(文件路径、第几块、每块大小),读取相应的文件中的块数据,返回给Client(顺便附上有效数据长度、MD5)。 Client端负责控制断点,通过断点向Server发送指令,接收数据后判断数据完整性(有效数据长度、MD5),再将数据写入目标文件。 由于Java流处理类实在繁多,本次实验就统一采用 In/OutputStream 和 FileIn/OutputStrea