socket问题,求助高手,解决后立即给分

liuq 2005-07-07 05:52:58
这是我的代码
socket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
socket.Connect(iepServer);
socket.Send(addrGet);
while(i<10000)
{
if(socket.Connected == true)
{
if(socket.Available > 0)
{
lenReceive = socket.Receive(byteData,0,socket.Available,SocketFlags.None);
switch (byteData[1])
{
case 1://读取文件
break;
case 2://读取地址
label1.Text = "得到地址";
txtAddr.Text = Encoding.ASCII.GetString(byteData,2,byteData.Length-2);
break;
default:break;
}
lenReceive = 0;//清空缓存
}
else
{
label1.Text = "没有数据" + i.ToString();
}
}
else
{
label1.Text = "socket已关闭";
}
i++;
}
主机端程序在监听,收到消息后有返回消息,已经使用telnet测试过没有问题,但是我这个客户端代码始终接收不到返回的数据,请高手指点。解决后立即给分。
...全文
193 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
gxh2004 2005-07-07
  • 打赏
  • 举报
回复
我估计你不是没收到,是因为I很快就超过10000了.根本没接收了..你应该改成while(true).然后开一个线程调用接收函数(不知道你是不是这么做的).下面是我的代码.你可以看看.lRecive在SOCKET建立时设为TRUE.当socket有异常或程序关闭时设为false
private void SynReceiveData()
{
try
{
while(lRecive)
{
MsgHead UnBind = new MsgHead();
BindMsg Mmsg; //绑定消息结构体
MsgHead Act_Rep; //测试包应答
Act_Rep = new MsgHead();

MsgHead msgheader; //消息头结构体
UserMt2 Mt2= new UserMt2(); //MT2结构体
UserMT2_resp Mt2_rep=new UserMT2_resp();
BindMsg_Rep msg_rep=new BindMsg_Rep();

byte[] buff=new byte[1024];
int k=Soc.Receive(buff,12, SocketFlags.None);

IPEndPoint ep;
ep=(IPEndPoint)Soc.RemoteEndPoint;
string Ipadd=ep.Address.ToString(); //取得对方IP地址

msgheader=(MsgHead)BytesToStruct(buff,typeof(MsgHead)); //解消息头包

msgheader.CmdId=(uint)Int2Bytes((int)msgheader.CmdId);
msgheader.Lenght=Int2Bytes(msgheader.Lenght);
msgheader.SeqNum=Int2Bytes(msgheader.SeqNum); //转为本地字节

switch((uint)msgheader.CmdId)
{
case (uint)CMPP_COMMAND_ID.CMPP_CONNECT: //绑定包
DDB myDB=new DDB();
Soc.Receive(buff,41, SocketFlags.None);
string sss=System.Text.Encoding.ASCII.GetString(buff).Trim();

Mmsg=(BindMsg)BytesToStruct(buff,typeof(BindMsg));
int i=myDB.SelUserInfo(Mmsg.LoginName,Mmsg.PassWord,Ipadd); //检查是否有这个用户

msg_rep.header.CmdId=(uint)CMPP_COMMAND_ID.CMPP_CONNECT_RESP;
msg_rep.header.SeqNum=msgheader.SeqNum;
msg_rep.header.Lenght=Marshal.SizeOf(msg_rep);
msg_rep.Result=(byte)i;

msg_rep.header.CmdId=(uint)Int2Bytes((int)msg_rep.header.CmdId); //转换成网络字节
msg_rep.header.Lenght=Int2Bytes(msg_rep.header.Lenght);
msg_rep.header.SeqNum=Int2Bytes(msg_rep.header.SeqNum);

buff=StructToBytes(msg_rep);
Soc.Send(buff); //发送回送包
if(i==0)
{
this.UserName=Mmsg.LoginName;
this.BindFlag=true;

this.CompanyID=Convert.ToInt32(this.UserName.Substring(0,4),10);
this.ClientIp=Ipadd;

if (OnBind!=null)
OnBind(this,this.UserName,this.ClientIp);

writelog.WriteToFile("WSocket::ReceiveCallback.绑定成功");
}
else
{
writelog.WriteToFile(i.ToString()+"绑定不成功");

BindCount++;
if(this.BindCount>=3)
CloseSocket();
}
break;
case (uint)CMPP_COMMAND_ID.CMPP_SUBMIT2: //MT消息处理
// writelog.WriteToFile("WSocket::CMPP_COMMAND_ID.CMPP_SUBMIT2.MT消息");
writelog.WriteToFile("MT包");

int kk=Marshal.SizeOf(Mt2);
Soc.Receive(buff,kk, SocketFlags.None);

Mt2 = (UserMt2)BytesToStruct(buff,typeof(UserMt2));
Mt2.Mtid = Int2Bytes(Mt2.Mtid);

Mt2_rep.header.CmdId=(uint)CMPP_COMMAND_ID.CMPP_SUBMIT_RESP2;
Mt2_rep.header.Lenght=Marshal.SizeOf(Mt2_rep);
Mt2_rep.header.SeqNum=msgheader.SeqNum;
Mt2_rep.Result=0;

Mt2_rep.header.CmdId=(uint)Int2Bytes((int)Mt2_rep.header.CmdId);
Mt2_rep.header.Lenght=Int2Bytes(Mt2_rep.header.Lenght);
Mt2_rep.header.SeqNum=Int2Bytes(Mt2_rep.header.SeqNum);

buff=StructToBytes(Mt2_rep);

Soc.Send(buff);

sockArgs.Mt2=Mt2;
sockArgs.Companyname=this.UserName;
sockArgs.CompanyID=this.CompanyID;
sockArgs.ClientIp=this.ClientIp;

if (OnReadyReceive!=null)
OnReadyReceive(this,sockArgs); //转到界面处理
break;
case (uint)CMPP_COMMAND_ID.CMPP_TERMINATE: //终止包
// writelog.WriteToFile("WSocket::CMPP_COMMAND_ID.CMPP_TERMINATE.终止消息包");
UnBind.CmdId = (uint)CMPP_COMMAND_ID.CMPP_TERMINATE_RESP;
UnBind.Lenght = Marshal.SizeOf(UnBind);
UnBind.SeqNum = 0;

UnBind.CmdId =(uint)Int2Bytes((int)UnBind.CmdId);
UnBind.Lenght =Int2Bytes(UnBind.Lenght);
UnBind.SeqNum =Int2Bytes(UnBind.SeqNum);

buff = StructToBytes(UnBind);
Soc.Send(buff);
this.CloseSocket();

break;
case (uint)CMPP_COMMAND_ID.CMPP_ACTIVE_TEST_RESP: //测试返回包
writelog.WriteToFile("测试返回包");
// writelog.WriteToFile("WSocket::CMPP_COMMAND_ID.CMPP_ACTIVE_TEST_RESP.测试返回包");
this.Connet=true;
break;
case (uint)CMPP_COMMAND_ID.CMPP_DELIVER_RESP2:
Soc.Receive(buff,msgheader.Lenght-12, SocketFlags.None);
if(this.OnUpDateMo!=null)
OnUpDateMo(this,msgheader.SeqNum);
int temp=msgheader.Lenght-12;
writelog.WriteToFile(temp.ToString()+"::MO消息返回包");
break;

case (uint)CMPP_COMMAND_ID.CMPP_ACTIVE_TEST: //测试包
writelog.WriteToFile("测试包:CMPP_COMMAND_ID.CMPP_ACTIVE_TEST");

Act_Rep.CmdId=(uint)CMPP_COMMAND_ID.CMPP_ACTIVE_TEST_RESP;
Act_Rep.Lenght=Marshal.SizeOf(Act_Rep);
Act_Rep.SeqNum=0;

writelog.WriteToFile(Act_Rep.CmdId.ToString()+"::测试返回包"+Act_Rep.Lenght.ToString());

Act_Rep.CmdId=(uint)Int2Bytes((int)Act_Rep.CmdId);
Act_Rep.Lenght=Int2Bytes(Act_Rep.Lenght);
Act_Rep.SeqNum=Int2Bytes(Act_Rep.SeqNum);

buff=StructToBytes(Act_Rep);

Soc.Send(buff);
break;
default:
writelog.WriteToFile("其它包其它包其它包其它包其它包其它包其它包其它包其它包其它包");
int aaa=Int2Bytes(msgheader.Lenght);
int bbb=Int2Bytes((int)msgheader.CmdId);

writelog.WriteToFile(msgheader.Lenght.ToString()+"::其实包"+msgheader.CmdId.ToString());
writelog.WriteToFile(aaa.ToString()+"::"+bbb.ToString()+"::其实包"+msgheader.SeqNum.ToString());
if((msgheader.Lenght-12)>0 && msgheader.Lenght<500)
Soc.Receive(buff,(msgheader.Lenght-12),SocketFlags.None);
if(msgheader.Lenght>500)
Soc.Receive(buff,Soc.Available,SocketFlags.None);
break;
}
System.Threading.Thread.Sleep(10);
}
}
catch(SocketException ee){
writelog.WriteToFile("同步接收函数异常"+ee.Message);
this.CloseSocket();
}
}

public void StartRecive()
{
ReciveThread = new Thread(new ThreadStart(SynReceiveData));
ReciveThread.Start();
}
liuq 2005-07-07
  • 打赏
  • 举报
回复
socket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
socket.Connect(iepServer);
socket.Send(addrGet);
while(i<10000)
{
if(socket.Connected == true)
{
if(socket.Available > 0)
{
lenReceive = socket.Receive(byteData,0,socket.Available,SocketFlags.None);
switch (byteData[1])
{
case 1://读取文件
break;
case 2://读取地址
label1.Text = "得到地址";
txtAddr.Text = Encoding.ASCII.GetString(byteData,2,byteData.Length-2);
break;
default:break;
}
lenReceive = 0;//清空缓存
}
else
{
label1.Text = "没有数据" + i.ToString();
}
}
else
{
label1.Text = "socket已关闭";
}
i++;
}
重新写一下好了。
liuq 2005-07-07
  • 打赏
  • 举报
回复
代码拷贝出来变样了,对不住了。请拷贝到您的编辑器里看一下。

110,537

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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