帮我把下边代码转成BCB

虎滴小猪猪 2010-01-22 04:54:55
DWORD WINAPI CSendFileServer::ThreadListen(LPVOID lpParam)
{
CSendFileServer* pServer = (CSendFileServer*)lpParam;
SOCKET sockListen = socket(AF_INET, SOCK_STREAM, 0);
SOCKADDR_IN sin;
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = inet_addr(pServer->m_sClientIP);
sin.sin_port = htons(pServer->m_iListenPort);

if(bind(sockListen, (SOCKADDR*)&sin, sizeof(sin)) == SOCKET_ERROR)
{
closesocket(sockListen);
pServer->m_pWnd->SendMessage(WM_BINDERROR);
return 1;
}

if(listen(sockListen, 5) == SOCKET_ERROR)
{
closesocket(sockListen);
pServer->m_pWnd->SendMessage(WM_LISTENERROR);
return 1;
}

pServer->m_pWnd->SendMessage(WM_STARTLISTEN);

fd_set fdListen;
timeval seltime;
seltime.tv_sec = 0;
seltime.tv_usec = 10000;

while(!pServer->m_bEndListenThread)
{
FD_ZERO(&fdListen);
FD_SET(sockListen, &fdListen);

if(select(0, &fdListen, NULL, NULL, &seltime) <= 0 || !FD_ISSET(sockListen, &fdListen) )
continue;

int len = sizeof(sin);
SOCKET sock = accept(sockListen, (SOCKADDR*)&sin, &len);

PARAMRECV* pParamRecv = new PARAMRECV;
pParamRecv->sock = sock;
pParamRecv->ptr = pServer;

DWORD id;
HANDLE h = CreateThread(NULL, 0, ThreadRecv, pParamRecv, 0, &id);
CloseHandle(h);
}
closesocket(sockListen);
return 0;
}


//功能:接收线程
//参数:LPVOID lpParam
//返回:无意义
DWORD WINAPI CSendFileServer::ThreadRecv(LPVOID lpParam)
{
PARAMRECV* pParam = (PARAMRECV*)lpParam;
CSendFileServer* pServer = (CSendFileServer*)pParam->ptr;

fd_set fdRecv;
timeval seltime;
seltime.tv_sec = 0;
seltime.tv_usec = 10000;

while(1)
{
FD_ZERO(&fdRecv);
FD_SET(pParam->sock, &fdRecv);

if(select(0, &fdRecv, NULL, NULL, &seltime) <= 0 || !FD_ISSET(pParam->sock, &fdRecv) )
continue;

MSGREQUEST msgRequest;
int iRecvCnt = recv(pParam->sock, (char*)&msgRequest, sizeof(msgRequest), 0);
if(iRecvCnt <= 0)
break;

//如果是请求文件列表
if(msgRequest.iCommand == FILELIST)
{
pServer->m_pWnd->SendMessage(WM_SENDFILELIST, (WPARAM)&pParam->sock, 0);
}

//如果是请求文件数据
else if(msgRequest.iCommand == FILEDATA)
{
long lFileOffset = msgRequest.lFileOffset;

CFile file;
BOOL bResult = file.Open(pServer->m_sFilePath, CFile::modeRead|CFile::shareDenyNone, NULL);
if(!bResult)
{
break; //如果文件打开失败就终止线程
}

char sSendBuf[SENDSIZE];
while(lFileOffset < msgRequest.lFileLength)
{
int iSeek = file.Seek(lFileOffset, CFile::begin);
int iReadCnt = file.Read(sSendBuf, SENDSIZE);
if(iReadCnt ==0)
break;

int iSendCnt = send(pParam->sock, sSendBuf, iReadCnt, 0);

//如果发送失败就终止线程
if(iSendCnt == -1)
break;
else
{
pServer->m_pWnd->SendMessage(WM_SENDFILESTATUS, (WPARAM)&msgFileStatus, 0);
lFileOffset += iSendCnt;
}
}//end of while(lFileOffset < lFileLength)

file.Close();
}//end of else if(msgRequest.iCommand == FILEDATA)

break;
}//end of while(1)
closesocket(pParam->sock);
delete pParam;
return 0;
}
...全文
142 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
虎滴小猪猪 2010-01-26
  • 打赏
  • 举报
回复
学习当然要学习了,但先要解决手里的问题哈哈。
谢谢南国梨
hemiya 2010-01-25
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 ljfwyh 的回复:]
这个问题解决了。谢谢楼上几位。
继续问问题:

我定义了一个CSendFileServer类,然后在这个类的某个函数里,我想用SendMessage函数,给某一个窗体,或者程序发消息,让窗体执行消息操作,怎么定义这个窗口句柄
C的代码是在类里定义了
//窗口指针
CWnd* m_pWnd;

我应该怎么改,改成:TForm* m_pWnd,但执行后,不响应消息函数
[/Quote]

CWnd* m_pWnd;
SendMsg(HANDLE hwnd)
{

}

SendMsg(m_pWnd->Handle);


楼主的思路还是vc的思路,还不是bcb,vcl的思路.
如果这个窗口是你程序本身的窗口,vcl的习惯做法是很少SendMessage的.
vc里面类的前缀是C,bcb是T,这个只是个人习惯,知道一下就行了.
如果楼主想深入点使用bcb最好看一些组件的知识,自己写点组件.要是只是临时用用,不必学.
虎滴小猪猪 2010-01-25
  • 打赏
  • 举报
回复
这个问题解决了。谢谢楼上几位。
继续问问题:

我定义了一个CSendFileServer类,然后在这个类的某个函数里,我想用SendMessage函数,给某一个窗体,或者程序发消息,让窗体执行消息操作,怎么定义这个窗口句柄
C的代码是在类里定义了
//窗口指针
CWnd* m_pWnd;

我应该怎么改,改成:TForm* m_pWnd,但执行后,不响应消息函数
stayor 2010-01-25
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 delphiguy 的回复:]
CB也能编译MFC。
[/Quote]

对,直接编译。
  • 打赏
  • 举报
回复
CB也能编译MFC。
ccrun.com 2010-01-22
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 hemiya 的回复:]
vc的?
要是这里面有vc专有的类,基本上是重写.还不如vc编成dll,cb动调.
[/Quote]

楼主发的这些代码中,除了用CFile读取文件的这部分代码以外,其他的都是API和socket应用,在C++Builder中可以直接编译.
hemiya 2010-01-22
  • 打赏
  • 举报
回复
vc的?
要是这里面有vc专有的类,基本上是重写.还不如vc编成dll,cb动调.
ccrun.com 2010-01-22
  • 打赏
  • 举报
回复
大概看了看,除了CFile这个类是MFC的,其他代码在C++Builder中都可以编译.只需把CFile的操作换成C里的FILE或API的CreateFile一族或者VCL中的FileOpen一族就可以了.

1,317

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧