免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2256 | 回复: 6
打印 上一主题 下一主题

[C] 一个并发socket通讯问题? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-07-19 17:49 |只看该作者 |倒序浏览
在AS4上的一个socket通讯程序,主要源代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <netinet/in.h>
#include <netdb.h>
#include <signal.h>  
#define MY_PORT         8888

int main(int argc ,char **argv)
{
int listen_fd,accept_fd;
struct sockaddr_in     client_addr;
int n;
  
if((listen_fd=socket(AF_INET,SOCK_STREAM,0))<0)
  {
        printf("Socket Error:%s\n\a",strerror(errno));
        exit(1);
  }
  
bzero(&client_addr,sizeof(struct sockaddr_in));
client_addr.sin_family=AF_INET;
client_addr.sin_port=htons(MY_PORT);
client_addr.sin_addr.s_addr=htonl(INADDR_ANY);


setsockopt(listen_fd,SOL_SOCKET,SO_REUSEADDR,&n,sizeof(int));
if(bind(listen_fd,(struct sockaddr *)&client_addr,sizeof(client_addr))<0)
  {
        printf("Bind Error:%s\n\a",strerror(errno));
        exit(1);
  }
  listen(listen_fd,5);
  while(1)
  {
   accept_fd=accept(listen_fd,NULL,NULL);
   if((accept_fd<0)&&(errno==EINTR))
          continue;
   else if(accept_fd<0)
    {
        printf("Accept Error:%s\n\a",strerror(errno));
        continue;
    }
  if((n=fork())==0)
   {
        .....
        close(accept_fd);
        exit(0);
   }
   else if(n<0)
        printf("Fork Error:%s\n\a",strerror(errno));
   close(accept_fd);
  }
}

现在碰到一个问题,我客户端是用delphi实现的,连续调用该服务(2000次)时,客户端就会突然报出Socket Error # 10054Connection reset by peer的错误,而且每次报错的位置都不一样,请教什么原因,如何处理,谢谢

论坛徽章:
0
2 [报告]
发表于 2009-07-19 18:38 |只看该作者
是否超过TCP连接数最大限制了?

用它试试if((listen_fd=socket(AF_INET,SOCK_STREAM, IPPROTO_TCP))<0)

或者是连接时间太长,服务端关闭了与客户端的连接。

论坛徽章:
0
3 [报告]
发表于 2009-07-19 20:21 |只看该作者
您的意思是不是子进程在操作逻辑的时候,父进程正好将套接字关闭导致的?

论坛徽章:
0
4 [报告]
发表于 2009-07-19 21:34 |只看该作者
......

if((n=fork())==0)
   {
        .....
        close(accept_fd);                                                   /*  子进程close一次     */        
        exit(0);
   }
   else if(n<0)
        printf("Fork Error:%s\n\a",strerror(errno));
   close(accept_fd);                                                        /*  父进程又close一次     */

论坛徽章:
0
5 [报告]
发表于 2009-07-19 22:50 |只看该作者

回复 #4 zpp71 的帖子

嗯,确实是这样,服务端误关了socket,估计客户端没检查FIN,直接给已关闭的套接口发数据,就收到对端的RST了~~

论坛徽章:
0
6 [报告]
发表于 2009-07-20 08:25 |只看该作者

回复 #1 shijunbiao 的帖子

10054 呵呵,咋这么像windows的错呀,是linux吗。
楼主是不是服务器直接挂了,多打印些信息。看看是不是服务器还在跑

论坛徽章:
0
7 [报告]
发表于 2009-07-20 12:56 |只看该作者
已经解决了,查实是delphi的socket控件存在问题,服务端没有问题,谢谢各位。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP