Chinaunix

标题: 一个并发socket通讯问题? [打印本页]

作者: shijunbiao    时间: 2009-07-19 17:49
标题: 一个并发socket通讯问题?
在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的错误,而且每次报错的位置都不一样,请教什么原因,如何处理,谢谢
作者: rollin7    时间: 2009-07-19 18:38
是否超过TCP连接数最大限制了?

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

或者是连接时间太长,服务端关闭了与客户端的连接。
作者: shijunbiao    时间: 2009-07-19 20:21
您的意思是不是子进程在操作逻辑的时候,父进程正好将套接字关闭导致的?
作者: zpp71    时间: 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一次     */
作者: bripengandre    时间: 2009-07-19 22:50
标题: 回复 #4 zpp71 的帖子
嗯,确实是这样,服务端误关了socket,估计客户端没检查FIN,直接给已关闭的套接口发数据,就收到对端的RST了~~
作者: ddkkd    时间: 2009-07-20 08:25
标题: 回复 #1 shijunbiao 的帖子
10054 呵呵,咋这么像windows的错呀,是linux吗。
楼主是不是服务器直接挂了,多打印些信息。看看是不是服务器还在跑
作者: shijunbiao    时间: 2009-07-20 12:56
已经解决了,查实是delphi的socket控件存在问题,服务端没有问题,谢谢各位。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2