我从SVN上下载的最新版本移植到自己的开发板上,采用net/apps下的程序作为测试程序,tcpserver.c运行没有问题,但是tcpclient.c在连接Server时出现问题,连接要等很久(1分左右)Server才有反应,但是Server会报10053的错误,如果此时通过Server发数据给Client,会报10054的错误,不知道这是什么问题,该如何解决?
试了一下,UDP Client是没有问题的。也许是超时的原因吧,不知道超时设置在哪里。
信息太少了,再详细描述下吧:
如何测试?什么平台?采用了什么软件做PC上的服务端?另外,以太网的问题最好能够给一个抓包的报文文件。
驱动有问题吗?这个还在TCP 3次握手的位置,似乎像是设备不容易收到包(SYNC ACK),SYNC发了几次
是ARM7的内核,非市面上那种通用MCU,这个应该没关系,驱动应该也没问题,TCP Server和UDP都没问题的。
握手确实不太对,第三次的数据没有。
我试了用焦海波移植的那个1.2的版本也是这种情况,难道别人都没我这样的问题吗?
还是怀疑是你驱动的问题,有的时候serv比较好,那么可能是因为它只测试到一个方向。而另外一个方向有可能会断断续续的。
你的是什么ARM7,SEP4020?建议做几个驱动方面的测试。
非常感谢bernard,
“驱动方面的测试”这个要怎么做?我试过Netio,TX没问题,RX总是失败。但是UDP Client却是可以的,如果单从握手上去分析,怎么下手?
还是怀疑是你驱动的问题,有的时候serv比较好,那么可能是因为它只测试到一个方向。而另外一个方向有可能会断断续续的。
你的是什么ARM7,SEP4020?建议做几个驱动方面的测试。
非常感谢bernard,
“驱动方面的测试”这个要怎么做?我试过Netio,TX没问题,RX总是失败。但是UDP Client却是可以的,如果单从握手上去分析,怎么下手?
直接调用驱动的函数进行数据包收发发送,然后在PC上用抓包工具抓。设备上的收发都用串口打印出来,和抓包工具抓到的报文比较。
“Netio,TX没问题,RX总是失败。”这个已经很能说明问题了,驱动收发有一方是有问题的。相同的RT-Thread/LwIP代码,已经很多人验证过是不存在你这种问题的,所以完全可以排除上层的问题。
刚用RT-thread不久,请教个问题。
服务器地址:192.168.1.52
子网掩码:255.255.255.0
网关:192.168.1.1
主机监听端口号:4663
请问应该怎样调用tcpclient(const char url, int port),
主要是应该定义一个怎样的参数,传给const char url
哪位老大帮下忙,谢谢。
修复了一个例程tcpserver.c断开后连不上的bug,能实时检测到客户端断开,可以反复断开重连。
论坛传附件功能好像有bug,不好传我直接贴代码。
哪位帮忙解答下上面的问题,谢谢。
QQ:727222615
static char send_data[512] = “This is TCP Server from RT-Thread.”; / 发送用到的数据 /
void tcpserv(void parameter)
{
char recv_data; / 用于接收的指针,后面会做一次动态分配以请求可用内存 /
rt_uint32_t sin_size;
int sock, connected, bytes_received;
rt_uint16_t No_dat_count;
struct sockaddr_in server_addr, client_addr;
rt_bool_t stop = RT_FALSE; / 停止标志 /
recv_data = rt_malloc(1024); / 分配接收用的数据缓冲 /
if (recv_data == RT_NULL)
{
rt_kprintf(“No memory\n”);
return;
}
/ 一个socket在使用前,需要预先创建出来,指定SOCK_STREAM为TCP的socket /
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
/ 创建失败的错误处理 /
rt_kprintf(“Socket error\n”);
}
/ 初始化服务端地址 /
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(5000); / 服务端工作的端口 /
server_addr.sin_addr.s_addr = INADDR_ANY;
rt_memset(&(server_addr.sin_zero),8, sizeof(server_addr.sin_zero));
/ 绑定socket到服务端地址 /
if (bind(sock, (struct sockaddr )&server_addr, sizeof(struct sockaddr)) == -1)
{
/ 绑定失败 */
rt_kprintf(“Unable to bind\n”);
}
/ 在socket上进行监听 /
if (listen(sock, 5) == -1)
{
rt_kprintf(“Listen error\n”);
}
rt_kprintf(“\nTCPServer Waiting for client on port 5000…\n”);
while(stop != RT_TRUE)
{
sin_size = sizeof(struct sockaddr_in);
}
/ 退出服务 /
lwip_close(sock);
/ 释放接收缓冲 /
rt_free(recv_data);
return ;
}
/ 输出tcpserv函数到finsh shell中 /
FINSH_FUNCTION_EXPORT(tcpserv, startup tcp server);
tcpserver.c/tcpclient.c可以从svn上更新下,这个问题是因为漏掉了接收到0字节数据的判断。
另外,你的问题是板子做服务端还是设备端?tcpclient连接一个服务端,例如服务端地址是192.168.0.1,监听端口是100,则用法是: