用API写的winsock,现在出了问题,贴出源代码,大家帮我找找问题
这个是我在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
服务端代码
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
...全文
相关推荐
用win api 写的winsock
用Win API 写的Winsock,不需要第三个ocx文件,直接可以编译到一个exe文件中运行.
异步非阻塞WINSOCK_API经典源代码
vc异步非阻塞WINSOCK_API经典源代码
Winsock API VB 教程
非常详细的Winsock API 英文版教程(过四级的朋友都能看懂!!!),VB5/6的 降价大促销哈。。。原来的5分资源分现在不要钱了。。。
VB的API方法编写的WINSOCK控件
此代码是VB使用API方法编写的WINSOCK控件,生成的执行文件比较小,功能很强大
winsock api
支持多实例创建客户、服务器示例(Winsock API)


网络及通讯开发
