socket 问题 win98 与 win2000是如此的不同。

gpg 2002-01-25 04:32:38
我有一文件传输程序,基于winsock写的。9x与9x可以,2000与2000也是好的。
但2000向98传或98向2000传就不行了。怎么回事啊?
...全文
76 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
gpg 2002-03-14
  • 打赏
  • 举报
回复
快50天了,先放一放。忙别的事。
结帐,来者有分。
我不懂电脑 2002-03-13
  • 打赏
  • 举报
回复
三十年孤独之饱经沧桑自由聊天没有这样的bug
LuoGD 2002-03-12
  • 打赏
  • 举报
回复
我用API做的没问题,WINDOWS<--->UNIX也可以
常宁 2002-03-12
  • 打赏
  • 举报
回复
我做的没有问题,不知你用的Socket如何实现的,API,TcustomSocket,Tpowersocket?
gpg 2002-03-12
  • 打赏
  • 举报
回复
文件接受

DWORD WINAPI SocketService( LPVOID _Param)
{
TThreadParams* InputParam=(TThreadParams*)_Param;
SOCKET ClientSocket;
char SendBuffer[4096];
fd_set Readfds;
FILE * pFile;
int RetCode=0,HeaderSize=sizeof(TIPHeader);
TIPHeader Header;
unsigned PackageIndex=1;
bool Continue=true,Continued=true;
struct timeval TimeOut={60,0};

while(WaitForSingleObject(InputParam->StopEvent,0)!=WAIT_OBJECT_0)
{
ClientSocket=accept(InputParam->ListenSocket,NULL,NULL);
if(ClientSocket==INVALID_SOCKET)
return 1;
if((pFile=fopen("D:\\AAAA.RAR", "w+b"))==NULL)
return 1;
FD_SET(ClientSocket,&Readfds);
while(Continue)
{
while(Continued)
{
FD_SET(ClientSocket,&Readfds);
if(select(0,&Readfds,NULL,NULL,&TimeOut)<1)
{
Continue=false;
break;
}
memset(SendBuffer,'\0',4096);
RetCode=recv(ClientSocket,SendBuffer,4096,0); //服务器接受
if(RetCode<1)
{
Continue=false;
Continued=false;
}
else
Continued=false;
}
Continued=true;
memcpy(&Header,SendBuffer,HeaderSize);
if(Header.PackageSequence==PackageIndex)
{
Header.PackageSequence=PackageIndex+1;
Header.PackageType=ACK;
Continue=true;
fwrite((SendBuffer+HeaderSize),Header.DataPackageSize,1,pFile); //写文件
memcpy(SendBuffer,&Header,HeaderSize);
send(ClientSocket,SendBuffer,4096,0); //服务器发送
}
PackageIndex+=1;
}
fclose(pFile);
closesocket(ClientSocket);
MessageBox(0,"Server","Prompt",MB_OK);
}

return 0;
}

发送
void __fastcall TMainForm::SendFile(AnsiString filename)
{
SOCKET ClientSocket;
struct sockaddr_in Server;
char SendBuffer[4096],RecvBuffer[4096];
fd_set Readfds;
FILE * pFile;
bool Continue=true,Continued=true;
int RetCode=-1,HeaderSize=sizeof(TIPHeader);
unsigned PackageIndex=1;
struct timeval TimeOut={60,0};
TIPHeader Header;


try
{
if((pFile=fopen(filename, "rb"))==NULL)
return;
memset(&Server,0,sizeof(Server));
Server.sin_family=AF_INET;
Server.sin_port=htons(8000);
Server.sin_addr.S_un.S_addr= inet_addr("61.134.18.158");

ClientSocket=socket(AF_INET,SOCK_STREAM,0);
if(ClientSocket==INVALID_SOCKET)
return;
if(connect(ClientSocket,(struct sockaddr*)&Server,sizeof(Server))==SOCKET_ERROR)
return;
FD_SET(ClientSocket,&Readfds);
PackageIndex=1;
Continue=true;
while(Continue)
{ //4048
memset(SendBuffer,'\0',4096);
RetCode=fread((SendBuffer+HeaderSize), 1, 4048, pFile); //读文件

if(RetCode<1)
{
Continue=false;
Continued=false;
}
while(Continued)
{
Header.PackageSequence=PackageIndex;
Header.PackageType=DATAPACKAGE;
Header.DataPackageSize=RetCode;
memcpy(SendBuffer,&Header,HeaderSize);

send(ClientSocket,SendBuffer,4096,0); //客户端发送
FD_SET(ClientSocket,&Readfds);
select(0,&Readfds,NULL,NULL,&TimeOut);
if(recv(ClientSocket,RecvBuffer,4096,0)<1) //客户端接受
{
Continue=false;
break;
}
memcpy(&Header,RecvBuffer,HeaderSize);
if(Header.PackageSequence!=(PackageIndex+1))
Continued=true;
else
Continued=false;

}


PackageIndex+=1;
Continued=true;
}
ClientLog->Lines->Add(AnsiString(SendBuffer));
closesocket(ClientSocket);
fclose(pFile);
MessageBox(0,"Client","Prompt",MB_OK);
}catch(...)
{
fclose(pFile);
}

}
gpg 2002-03-12
  • 打赏
  • 举报
回复
文件接受
gpg 2002-01-26
  • 打赏
  • 举报
回复
up++
gpg 2002-01-25
  • 打赏
  • 举报
回复
我用的是 Berkeley Socket风格
gpg 2002-01-25
  • 打赏
  • 举报
回复
xiaoxiaohan 不是的。
另,我没有用任何组件。
xiaoxiaohan 2002-01-25
  • 打赏
  • 举报
回复
看一看是不是UNICODE的问题。
13. 如何在Unicode与ANSI之间转换字符串?
Windows函数MultiByteToWideChar用于将多字节字符串转换成宽字符串;函数WideCharToMultiByte将宽字符串转换成等价的多字节字符串。

13,873

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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