中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档 | 网通镜像
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > C/C++
******socket 端口不能使用问题*******
作者:未知 时间:2005-09-13 19:19 出处:ChinaUnix.net 责编:chinaitpower
              摘要:******socket 端口不能使用问题*******

不知道大虾有没有在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
应该是“偶尔能连接并且能正常发送数据,偶尔却不能”;我用的是短连接

关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有