请各位看看: 用 winsock 传送接收文件,接收到的文件数据与原文件不同,不知是何原因.附详细原码.
lner 2002-05-31 10:39:56 /////////////////////////////////////////
服务端: (接收文件)
#include "stdafx.h"
BOOL g_bWorking;
CListBox* g_log = NULL;
const UINT nPacketSize = 1024*4 ;
UINT ServiceThreadProc(LPVOID pParam)
{
SOCKET clientsocket = (SOCKET) pParam;
BOOL bOk = FALSE;
char filenamelen[4]; // int
char filelength[32]; // dword
recv(clientsocket, filenamelen, 4, 0); // receive filename length
char* filename = (char*)malloc(atoi(filenamelen));
recv(clientsocket, filename, atoi(filenamelen), 0); // receive filename
recv(clientsocket, filelength, 32, 0); // receive file length
int nLen = atoi(filelength);
byte* data;
HANDLE hFile = CreateFile(filename, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_FLAG_NO_BUFFERING, NULL);
if (hFile == INVALID_HANDLE_VALUE)
bOk = FALSE;
else
bOk = TRUE;
DWORD writeSize;
if (bOk) {
while (nLen > 0) {
if (nLen >= nPacketSize) {
data = new byte[nPacketSize];
if( recv(clientsocket, (char*)data, nPacketSize, 0) == SOCKET_ERROR)
AfxMessageBox("socket error");
WriteFile(hFile, data, nPacketSize, &writeSize, NULL);
nLen -= nPacketSize;
}
else {
data = new byte[nLen];
if (recv(clientsocket, (char*)data, nLen, 0) == SOCKET_ERROR)
AfxMessageBox("socket error");
WriteFile(hFile, data, nLen, &writeSize, NULL);
nLen = 0;
}
} // End while
FlushFileBuffers(hFile);
CloseHandle(hFile);
}
else {
AfxMessageBox("open file fail");
}
AfxMessageBox("receive complete");
closesocket(clientsocket);
free(filename);
return 0;
};
UINT ServerThreadProc(LPVOID pParam)
{
//初始化TCP协议
SOCKET serversocket;
WSADATA wsaData ;
BOOL ret = WSAStartup(MAKEWORD(1,1), &wsaData);
if (ret != 0) {
AfxMessageBox("初始化套接字失败!");
return 1;
}
//创建服务器端套接字
serversocket = socket(AF_INET, SOCK_STREAM, 0); //IPPROTO_TCP
if (serversocket == INVALID_SOCKET) {
AfxMessageBox("创建套接字失败!");
closesocket(serversocket);
WSACleanup();
return 2;
}
//绑定到本地一个端口上
sockaddr_in localaddr;
localaddr.sin_family = AF_INET;
localaddr.sin_port = htons(1234);
localaddr.sin_addr.s_addr = INADDR_ANY; // OR
//localaddr.sin_addr.s_addr = inet_addr("192.168.0.1") ;
if (bind(serversocket, (const struct sockaddr*) & localaddr,
sizeof(localaddr)) == SOCKET_ERROR)
{
AfxMessageBox("绑定地址失败!");
closesocket(serversocket);
WSACleanup();
return 3;
}
listen(serversocket, 5); //设置侦听模式
g_bWorking = TRUE;
int len = sizeof(sockaddr);
sockaddr_in clientaddr;
while (g_bWorking) {
SOCKET client = accept(serversocket, (struct sockaddr*)&clientaddr, &len);
AfxBeginThread(ServiceThreadProc, (LPVOID)client, THREAD_PRIORITY_NORMAL);
}
return 0;
};
//////////////////////////////////////////////////////////////////
客户端:(发送文件)
void CTcpClientDlg::OnbuttonConnect()
{
int result ;
WSADATA wsaData ;
//初始化TCP协议
BOOL ret = WSAStartup(MAKEWORD(1,1), &wsaData);
if (ret != 0) {
MessageBox("初始化套接字失败!");
return ;
}
//创建客户端套接字
m_clientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (m_clientSocket == INVALID_SOCKET) {
MessageBox("创建套接字失败!");
closesocket(m_clientSocket);
WSACleanup();
return ;
}
struct sockaddr_in destaddr ;
destaddr.sin_family = AF_INET;
destaddr.sin_port = htons(1234);
destaddr.sin_addr.s_addr = inet_addr("192.168.0.1");
result = connect(m_clientSocket, (struct sockaddr *) & destaddr,sizeof(destaddr)) ;
if (result == SOCKET_ERROR) {
MessageBox("connect error");
return ;
}
//socket注册异步事件,注意没有Accept事件
if (WSAAsyncSelect(m_clientSocket ,m_hWnd, NETWORK_EVENT,
FD_CLOSE | FD_READ | FD_WRITE) == SOCKET_ERROR)
{
MessageBox("(client)注册异步事件失败!");
return;
}
m_IsConnected = true ;
/////////////////////////////////////
char filenamelen[4];
char filelength[8];
char* filename = "lostinspace.mov";
CFile readFile;
CString echo;
const nPacketSize = 1024*4;
_itoa(strlen(filename), filenamelen, 10);
send(m_clientSocket, filenamelen, 4, 0); // send filename length
send(m_clientSocket, filename, strlen(filename), 0); // send filename
readFile.Open("E:\\lostinspace.mov", CFile::modeRead);
DWORD filelen = readFile.GetLength() ;
readFile.Close();
HANDLE hFile = CreateFile("E:\\lostinspace.mov", GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_FLAG_NO_BUFFERING, NULL);
//if (readFile.Open("E:\\lostinspace.mov", CFile::modeRead))
if (hFile != INVALID_HANDLE_VALUE) {
_itoa(filelen, filelength, 10);
send(m_clientSocket, filelength, 32, 0); // send file length
byte* data = NULL;
DWORD dwReaded;
while (filelen > 0) {
if (filelen >= nPacketSize) {
data = new byte[nPacketSize];
ReadFile(hFile, data, nPacketSize, &dwReaded, NULL);
send(m_clientSocket, (char*)data, nPacketSize, 0);
filelen = filelen - nPacketSize;
}
else {
data = new byte[filelen];
ReadFile(hFile, data, filelen, &dwReaded, NULL);
send(m_clientSocket, (char*)data, filelen, 0);
filelen = 0;
}
}
CloseHandle(hFile);
MessageBox("send complete.");
}
else {
MessageBox("Open file fail");
}
}
/////////////////////////////////////////////////