|
|
不知道大虾有没有在hpux 11.i下面遇到这样的情况:
下面的程序段刚开始服务端在accept处要阻塞直到客户端发connect 请求过来。但在该端口运行一段时间后,服务端没有客户端的连接请求,但能够
accept成功(这是真的,我用gdb跟过,并且此时产生的socket 描述符都是固定的),重新指定一个端口就没有这样的问题,运行1天左右新的端口又出现上面的情况。
是不是socket缓冲队列需要清空?已经问了很多人,都没有搞定,请大虾指教,谢谢!
另外,现在的系统要作为客户端和nt客户端通信,会不会和此有关?
代码段:
server:
[code:1:5adb67b960]
struct sockaddr_in sad;//server
struct sockaddr_in cad;//client
int sd;//监听socket id;
int sd2;//连接socket id;
int alen;
int chipid;//child process pid
memset((char*)&sad,0,sizeof(sad));
sad.sin_family=AF_INET;
sad.sin_addr.s_addr=htonl(INADDR_ANY);
sad.sin_port=htonl(PORT);
sd=socket(AF_INET,SOCK_STREAM,0);
if(sd<0)
{
fprintf(stderr,"Socket creation failed!\n");
exit(1);
}
int opt=SO_REUSEADDR;
setsockopt(sd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));
if(bind(sd,(struct sockaddr*)&sad,sizeof(sad))<0)
{
fprintf(stderr,"Bind failed!\n");
exit(1);
}
if(listen(sd,QLEN)<0)
{
fprintf(stderr,"Listen failed!\n");
exit(1);
}
while(1)
{
alen=sizeof(cad);
if((sd2=accept(sd,(struct sockaddr*)&cad,&alen))<0)
{
fprintf(stderr,"Accept failed!\n");
exit(1);
}
if((chipid=fork())==0)
{
close(sd);
processpid(sd2);
close(sd2);
exit(0);
}
close(sd2);
}//end while
[/code:1:5adb67b960]
client:
[code:1:5adb67b960]
memset((char*)&sad,0,sizeof(sad));
sad.sin_family=AF_INET;
sad.sin_addr.s_addr=INADDR_ANY;
sad.sin_port=PORT;
sd=socket(AF_INET,SOCK_STREAM,0);
if(sd<0)
{
fprintf(stderr,"Socket creation failed!\n");
exit(1);
}
if(connect(sd,(struct sockaddr_in*)&sad,sizeof(sad))<0)
{
fprintf(stderr,"Connect failed!\n");
exit(1);
}
[/code:1:5adb67b960]
| superhoo 回复于:2003-03-27 09:34:21
| 你在客户端:
sad.sin_family=AF_INET;
sad.sin_addr.s_addr=INADDR_ANY; 这里改成client的IP地址
sad.sin_port=PORT;
如果,还有错的话,可以试试在服务器端,绑定client的地址,只接受一个client的请求试试.
| | 无双 回复于:2003-03-27 12:50:20
| 同意楼上的
sad.sin_addr.s_addr=INADDR_ANY;
这句有错
| | 蓝色键盘 回复于:2003-03-27 16:59:30
| 这个问题问的好,这关系到很多网络编程方面的东西。
就楼主问题而言,需要搞清楚以下几点:
1、如果client端不指定server地址,而用INADDR_ANY,则connect将bind一个由系统分配的local address来填充地址结构。
2、在流socket中,如果connect调用bind一个已经被其他流bind的地址,connect将返回错误EADDRINUSE,除非应用setsockopt选项SO_REUSEADDR(在楼主的系统中,改选项只能适用于AF_INET协议)。
3、一般的,流socket只能成功的connect一次,除非close或shutdown后重新连接。
4、如果server端连接请求队列已满,那么connect将超时返回,服务器端不做处理。
5、通常如果请求队列没有未决连接,accept将阻塞,除非应用使用ioctl或fcntl指定accept为非阻塞。
6、如果client端没有发送connect请求,accept可能会发生阻塞返回的情况,导致accept返回的原因很多,至少10多种,需要仔细察看具体原因(可能楼主所说属于这其中的一种)。
7、一般的,TCP建立连接的过程需要完成三路握手协议。终止和异常情况下,client与server之间也需要做TCP分节会话,非正常TCP分节得出现可以通过应用程序来控制。
另外建议楼主最你的程序做一些修改,如果上面的代码用在网络通讯中是不完整的,也是不安全的。
| | hudong 回复于:2003-03-29 01:29:24
| "同意楼上的
sad.sin_addr.s_addr=INADDR_ANY;
这句有错"
是这样的,上面的程序是我在同一台机器上进行的测试,只起一个进程也不行,实在是搞不懂了,问了n个人都没有搞定,系统要联调了,哎,
| | hudong 回复于:2003-03-29 01:36:06
| 蓝色键盘 ,还请多指教,hudong@std.uestc.edu.cn,donghu@sina.com
| | 蓝色键盘 回复于:2003-03-29 16:45:27
| [quote:45907d5f12="hudong"]蓝色键盘 ,还请多指教,hudong@std.uestc.edu.cn,donghu@sina.com[/quote:45907d5f12]如果client端不指定server地址,而用INADDR_ANY,则connect将bind一个由系统分配的local address来填充地址结构。
如果你不是在一台机器上面,你怎么能让server收到了呢?
你的问题是什么?连接不少,还是server接受到了不期望的东西???还是,偶尔能连接并且能正常发送数据,偶尔却不能?另外,你用的是长连接还是短连接的方式呢?
| | hudong 回复于:2003-03-30 02:10:52
| 应该是“偶尔能连接并且能正常发送数据,偶尔却不能”;我用的是短连接
| |
|