tcp三次握手后如何,传输数据

疯魔症 2009-12-29 04:27:26
情况是这样的,单片机用cp2200芯片实现tcp协议和服务器(上位机)通讯,现在服务器用tcp协议连接成功。
这里我要发一个电压值给单片机,单片机收到后返回一个OK(这里可能不是很合理)。
现在网络抓包,tcp三次握手都有,我发送数据也有,然后单片机返回一个应答,接着返回数据OK,这些抓包都有,
但是我这边没有得到返回的OK,read到的数据长是0.
下面是代码,我这里发送数据的同时,是不是也要开个监听的线程。
用的C#下tcpClient
  
static TcpClient m_tcpClient;
static Thread m_readThread = null;

/// <summary>
/// tcp 连接 发送数据
/// </summary>
/// <param name="strIp"></param>
/// <returns></returns>
public static string CommunicateTcp()
{

try
{
int Port = 80;//目标端口
string Ip = "192.168.1.50";//目标ip
IPAddress address = IPAddress.Parse(Ip);

IPAddress myIp = Dns.GetHostEntry(Dns.GetHostName()).AddressList[0]; //得到本机ip

int myPort = 6010;//本机使用端口

IPEndPoint localEndPoint = new IPEndPoint(myIp, myPort);

m_tcpClient = new TcpClient(localEndPoint);

m_tcpClient.Connect(address, Port);

if (m_readThread == null)
{
m_readThread = new Thread(ReceiveDataThread);
}
m_readThread.Start();



NetworkStream ns = m_tcpClient.GetStream();

if (true)
{
byte[] bytes = new byte[10];//建立缓冲区
bytes[0] = Convert.ToByte('L');
bytes[1] = Convert.ToByte('V');
bytes[2] = Convert.ToByte('S');
bytes[3] = Convert.ToByte('P');

bytes[4] = Convert.ToByte('=');

bytes[5] = Convert.ToByte('0');
bytes[6] = Convert.ToByte('0');
bytes[7] = Convert.ToByte('0');
bytes[8] = Convert.ToByte('0');

bytes[9] = Convert.ToByte('\0');


// 创建跟ups连接的socket
Socket ups_sok = m_tcpClient.Client;// new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

//// 接收远程UPS控制器的反馈数据
//IPEndPoint senderEP = new IPEndPoint(IPAddress.Any, 2353);
//// 按照msdn的要求binding,此时我们作为服务端收数据。
//ups_sok.Bind(senderEP);
ups_sok.ReceiveTimeout = 15000;

byte[] buffer = new Byte[256];

// 发送数据到远程UPS控制器
ns.Write(bytes, 0, bytes.Length);

ups_sok.Receive(buffer);

byte[] data = new byte[5];

int bytesRead = ns.Read(data, 0, data.Length);//读取字节流
}

ns.Close();

m_tcpClient.Close();
}
catch (System.Exception e)
{
string strError = "发送失败:" + e.Message;
return strError;
}

return "连接成功";
}

/// <summary>
/// 接收数据线程
/// </summary>
public static void ReceiveDataThread()
{
Byte [] ReciveData = new Byte[1024];

int len = 0;
if (m_readThread ==null)
{
return;
}
bool _Continue = true;
NetworkStream stream;
int count;
while (_Continue)
{
if (m_tcpClient.Connected)
stream = m_tcpClient.GetStream();
else
{
Thread.Sleep(50);
continue;
}

try
{
len = stream.Read(ReciveData, 0, ReciveData.Length);
if (len != 0)
{
_Continue = false;
}
}

catch (Exception err)
{

CloseClientSocket();
}
}
}


...全文
1271 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
maidimaidi 2010-09-01
  • 打赏
  • 举报
回复
我也在实现这方面的东西,但是我是用C的,这个过程感觉就是有点乱,理不清思路,又没人有过类似经历的呢?加Q229566124
vclongking 2010-01-03
  • 打赏
  • 举报
回复
自己去做底层TCP协议 有难度了感觉
不是估计要做相应修改了 是肯定要做相应修改咯!里面复杂 搞不懂
疯魔症 2010-01-03
  • 打赏
  • 举报
回复
单片机上校验和没通过
疯魔症 2009-12-30
  • 打赏
  • 举报
回复
程序很乱测试用的,今天调整了.
用socket调试小工具,我这里程序没问题,可以正常收发数据,问题出在单片机上.

maple_zhj 2009-12-30
  • 打赏
  • 举报
回复
自己模拟 TCP?

没做过。。。
oyljerry 2009-12-29
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 vincent_1011 的回复:]
引用 7 楼 cnzdgs 的回复:
你的代码很乱,ups_sok.Receive、ns.Read、stream.Read都是接收,不知道什么用意,如果只接收一个OK,只需要这三者中的一个就够了。另外,一个连接一般应该只用一个线程来接收,多个线程就乱了。

如果我用winpcap库手工构造3次握手后,然后另外开个socket也是这个端口的连接,这时候发送数据的话,应该不会有三次握手了吧?
[/Quote]
等于自己伪造TCP连接?需要自己试,估计还要做一些对应的修改,可以自己抓包分析
vincent_1011 2009-12-29
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 cnzdgs 的回复:]
你的代码很乱,ups_sok.Receive、ns.Read、stream.Read都是接收,不知道什么用意,如果只接收一个OK,只需要这三者中的一个就够了。另外,一个连接一般应该只用一个线程来接收,多个线程就乱了。
[/Quote]
如果我用winpcap库手工构造3次握手后,然后另外开个socket也是这个端口的连接,这时候发送数据的话,应该不会有三次握手了吧?
volezbin 2009-12-29
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 cnzdgs 的回复:]
你的代码很乱,ups_sok.Receive、ns.Read、stream.Read都是接收,不知道什么用意,如果只接收一个OK,只需要这三者中的一个就够了。另外,一个连接一般应该只用一个线程来接收,多个线程就乱了。
[/Quote]
学习
cnzdgs 2009-12-29
  • 打赏
  • 举报
回复
你的代码很乱,ups_sok.Receive、ns.Read、stream.Read都是接收,不知道什么用意,如果只接收一个OK,只需要这三者中的一个就够了。另外,一个连接一般应该只用一个线程来接收,多个线程就乱了。
疯魔症 2009-12-29
  • 打赏
  • 举报
回复
单片机上非常底层了,不想socket,都处理好了
疯魔症 2009-12-29
  • 打赏
  • 举报
回复
现在不知道是单片机发数据有问题,还是我这里socket处理时有问题
mazm_yanzhu 2009-12-29
  • 打赏
  • 举报
回复
ding
swlilike 2009-12-29
  • 打赏
  • 举报
回复
进来看热闹
oyljerry 2009-12-29
  • 打赏
  • 举报
回复
建立TCP连接后,就可以一直发送,接收数据,当需要退出时,再中断连接...
疯魔症 2009-12-29
  • 打赏
  • 举报
回复
抓包工具分析tcp通信时,三次握手后,客户端没给服务器端发一条数据,服务器都应答一条。
这里单片机给服务器返回OK时,是不是也要先建立连接然后发数据。

18,355

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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