用API写的winsock,现在出了问题,贴出源代码,大家帮我找找问题

jsfserver jsfserver 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
这个是我在BCB中用API写的文件传输软件,用的是异步面向连接的TCP,传送文件一切都正常,就是在传送大型文件后,服务端程序关闭会出现莫名其妙的错误,现在我把所有代码贴出来,大家一起帮我研究改进,共同学习!


服务端代码
1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
hin=HINSTANCE(GetWindowLong(Form1->Handle,GWL_HINSTANCE));
lIdeaDlgProc=MakeProcInstance((FARPROC)IdeaDlgProc,hin);
hwdlg=CreateDialog(hin,"DLC",Form1->Handle,lIdeaDlgProc);
FreeProcInstance((FARPROC)lIdeaDlgProc);
sc.sin_family=AF_INET;
sc.sin_addr.s_addr=htonl(INADDR_ANY);
sc.sin_port=htons(8080);
WSAStartup(MAKEWORD(2,2),&wsaData);
s=socket(AF_INET,SOCK_STREAM,IPPROTO_IP);
bind(s,(struct sockaddr*)& sc,sizeof(sc));
WSAAsyncSelect(s,hwdlg,WM_SOCKET,FD_ACCEPT | FD_READ | FD_CLOSE);
listen(s,5);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)
{
closesocket(s);
WSACleanup();
}
//---------------------------------------------------------------------------













1.h
//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#define MAX_SIZE 1048576
#include <Classes.hpp>
#include <Winuser.h>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <windows.hpp>
#include <SysUtils.hpp>
#define WM_SOCKET (WM_USER + 1)
#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")
SOCKET s,Accept;
AnsiString Filename="1.txt";
char savebuffer[MAX_SIZE],Recvbuffer[1024],cFilesize[4];
WSADATA wsaData;
struct sockaddr_in sc;
HWND hwdlg;
HWND hInst;
HINSTANCE hin;
FARPROC lIdeaDlgProc;
int addrlen=sizeof(sc),t,SaveFlag=0,Filehandle,count=0,Recvsize;
unsigned long CopyMove=0,Filesize=0,*pFilesize,Restsize=MAX_SIZE;
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
TButton *Button1;
TButton *Button2;
void __fastcall Button1Click(TObject *Sender);
void __fastcall Button2Click(TObject *Sender);
private: // User declarations
public: // User declarations
__fastcall TForm1(TComponent* Owner);
};
BOOL CALLBACK IdeaDlgProc(HWND hdlg,UINT message,WPARAM wParam,LPARAM lParam)
{
switch(message)
{
case WM_INITDIALOG:

ShowMessage("服务器启动成功
break;
case WM_COMMAND:
switch(wParam)
{
case IDOK:
DestroyWindow(hdlg);
hwdlg=0;
break;
}
default: return false;

case WM_SOCKET:
switch(WSAGETSELECTEVENT(lParam))

{
case FD_ACCEPT:

Accept = accept(wParam,(struct sockaddr*)& sc,&addrlen);
WSAAsyncSelect(Accept,hwdlg,WM_SOCKET,FD_ACCEPT|FD_READ|FD_CLOSE);
listen(Accept,5);
break;
case FD_READ:
switch(count)
{
case 2:
if((Filesize-1024)>=0)
{
Recvsize=recv(Accept,Recvbuffer,sizeof(Recvbuffer),0);
Filesize-=Recvsize;
}
else {
Recvsize=recv(Accept,Recvbuffer,Filesize,0);
}
if((CopyMove+Recvsize)<=MAX_SIZE)
{
memcpy(savebuffer+CopyMove,Recvbuffer,Recvsize);
CopyMove+=Recvsize;SaveFlag=1;
}
else
{
FileWrite(Filehandle,savebuffer,CopyMove);
CopyMove=0;
memcpy(savebuffer+CopyMove,Recvbuffer,Recvsize);
CopyMove+=Recvsize;SaveFlag=2;
}
break;
case 1:
count=2;
recv(Accept,cFilesize,sizeof(cFilesize),0);
Filesize=*((unsigned long*)cFilesize);
break;
case 0:
count=1;
recv(Accept,Recvbuffer,sizeof(Recvbuffer),0);
strcpy(Filename.c_str(),Recvbuffer);
Filehandle=FileCreate(Filename);
break;
default: return false;
}
break;
case FD_CLOSE:
if(SaveFlag==1){FileWrite(Filehandle,savebuffer,CopyMove);}
count=0;
CopyMove=0;
ShowMessage("对方断开了");

closesocket((SOCKET)wParam);
FileClose(Filehandle);
Filehandle=0;

break;
}
break;


}
return FALSE;
}
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif

...全文
评论 17
收藏 已收藏
分享
返回顶部