2008-12-29 23:02:04     problem about socket

Document created by Aaronwu Employee on Aug 9, 2013
Version 1Show Document
  • View in full screen mode

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

Attachments

    Outcomes