2008-12-29 23:02:04 problem about socket
Yi Li (CHINA)
Message: 67170
A question from customer:
"我们用ADI的BF537开发UHF Reader,用于读取UHF Gen2标签。其中的一款网络版基于uClinux操作系统,使用它的TCP/IP协议栈,并对uClinux Kernel进行了一定的裁减。在应用中上位机作为客户机,Reader作为服务器监听来自于上位机软件的协议命令。
所有基于Socket开发的程序放在linux-2.6.x/driver/char/mytest中。TCP/IP开发都是标准Linux环境下的Socket编程。流程如下:
(1)在初始化时调用socket(AF_INET,SOCK_STREAM,0)建立一个SockFd。
(2)打开端口,用ifconfig设置IP和Mac。
(3)调用
setsockopt(SockFd, SOL_SOCKET, SO_REUSEADDR,(unsigned char*)&on, sizeof(on) );
setsockopt(SockFd, IPPROTO_TCP, TCP_NODELAY,(unsigned char*)&on, sizeof(on) );
(4)调用bind(SockFd,(struct sockaddr*)&ServAddr,sizeof(struct sockaddr_in))进行端口绑定
(5)调用listen(SockFd,WAITBUF),WAITBUF设为10
(6)建立一个Acceptor线程。
(7)在Acceptor线程,当收到客户连接请求后,accept((int)fd,(struct sockaddr*)(&ClientAddr),(unsigned int*)&sin_size))返回一个NewFd。
(8)建立一个分离线程Read线程。
(9)在Read线程中用FD_SET(NewFd,&rdfdset);将NewFd加入到读描述符集中。
(10) 调用select(NewFd,&rdfdset,NULL,NULL,NULL)
(11) 如果NewFd是置位的,调用recv()
(12) 如果recv()返回0或-1,调用shutdown(NewFd, 2)和close(NewFd);,并从Read线程返回(即删除Read线程)。
现在碰到的问题是,我把Reader连接到公司的局域网中。如果上位机软件正常关闭,并再次打开上位机软件时,Reader可以正常执行(这种情况下总是运行正常的)。
如果因为网络的问题造成通信中断,此时从上位机关闭连接,Reader显示关闭了NewFd。再一次从上位机发送连接请求,Reader显示打开一个新的Socket(称为NewFd2)(以上的过程都是正常的),但是这个时候上位机发送数据到Reader,recv()总是显示返回数据长度的是0。
我们试过好几个上位机软件,都是相同的情况,所以应该排除是客户端的问题。
请问是什么原因造成上述的情况的?编程的问题还是内核裁减的问题?"
QuoteReplyEditDelete
2008-12-29 23:06:59 Re: problem about socket
Yi Li (CHINA)
Message: 67171
我的建议是用tcpdump 或者gdb debug。
-Yi