免费注册 查看新帖 |

Chinaunix

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

[C++] socket通信中,传输多个文件出现bind error: Address already in use错误! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-03-27 17:36 |只看该作者 |倒序浏览
问题如标题:
1、发送端代码
void* SendThread(void*){
        cout<<"send thread is start : "<<endl;
        Send sendfile;

//        for (int i=0;i<20;i++)
        for(;
        {
                if(sendqueue.empty())
                        continue;
                if(!sendqueue.empty())
                {
                        sendJob sendjob;
                        sendjob = sendqueue.pop();
                        cout<<" send first job is equals 19 ! -----------------------  "<<sendjob.m<<endl;
                        sendfile.SendFile(sendjob)                        cout<<"one file is send"<<endl;
                }
}
}

SendFile函数代码:
int Send::SendFile(sendJob newJob)
{
           cout<<"start send thread"<<endl;
                        struct sockaddr_in client_addr;
                        struct sockaddr_in server_addr;
                        int listenSock,newfd;                        //create listen socket in

                 char Filepath[50];
                 int Filefd;
                  strcpy(Filepath,Client_FILE_PATH);
                        strcat(Filepath,newJob.PRname);

        listenSock = socket(AF_INET,SOCK_STREAM,0);

                        cout<<"create sock successful"<<endl;
                        bzero(&client_addr,sizeof(client_addr));
                        client_addr.sin_family=AF_INET;                                                        //address type
                        client_addr.sin_port=htons(DP_LISTEN_PORT);                             //local listening port
                        client_addr.sin_addr.s_addr=inet_addr("127.0.0.1";

                  if(listenSock<0)
                                {
                                        perror("get socket failed";
                                        exit(1);
                             }

                        if(bind(listenSock,(struct sockaddr*)&client_addr,sizeof(client_addr))<0)                //bind
                                {
                                        perror("bind error";
                                        close(listenSock);
                                        exit(1);
                                }
      if(listen(listenSock,5)<0)                                        //keep listening
                                {
                                        perror("sever listen";
                                        exit(4);
                                }
                          socklen_t sin_size;

  while(1)
                {
                          sin_size=sizeof(struct sockaddr_in);
           if((newfd=accept(listenSock,(struct sockaddr*)(&server_addr),&sin_size))<0)
                                {
                                perror("error when accept";
                                exit(5);
                                }

         Filefd = open(Filepath,O_RDONLY);
                          int readlen;
                          char buf[1024];
                          write(newfd,newJob.PRname,sizeof(newJob.PRname));

                  while((readlen=read(Filefd,buf,sizeof(buf)))>0)                //read File into buffer
                                {
                                write(newfd,buf,readlen);

                             }
                }
    close(listenSock);
        return 1;
}

接收端代码:
void* ReceiveThread(void*)
{

        struct sockaddr_in server_addr;
        int sockfd=socket(AF_INET,SOCK_STREAM,0);

        if(sockfd<0)
        {
                perror("socket create failed";
                exit(1);
        }
        bzero(&server_addr,sizeof(server_addr));
        server_addr.sin_family=AF_INET;
        server_addr.sin_port=htons(C_First_listen_Port);
        server_addr.sin_addr.s_addr=inet_addr("127.0.0.1";
        if(connect(sockfd,(struct sockaddr*)(&server_addr),sizeof(server_addr))==-1) {
                perror("connect error";
                exit(1);
        }

        int readline,File;
        char buf[1024];
        char FileName[50];
        char PathName[30];

        readline = read(sockfd,FileName,sizeof(FileName));

        char str[20];
        int i=0;
          sprintf(str,"%d",i);
          strcpy(PathName,Client_FILE_PATH);
          strcat(PathName,str);
         strcat(PathName,FileName);
i++;
        if((File=open(PathName,O_WRONLY|O_CREAT|O_TRUNC,0644))<0)
                {
                        perror("file can not open";
                        exit(1);
                }
        while((readline=read(sockfd,buf,sizeof(buf)))>0) {
                write(File,buf,readline);
       }
//        sleep(1);
        close(File);
        close(sockfd);
}
//                exit(0);
}

运行很多次都报错,
bind error: Address already in use

请各位帮忙解决一下唄,调这个程序我都快崩溃了!

论坛徽章:
0
2 [报告]
发表于 2009-03-27 17:53 |只看该作者
在服务端bind or listen前
unsigned int value = 0x1;
setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,(void *)&value,sizeof(value));

论坛徽章:
0
3 [报告]
发表于 2009-03-27 18:11 |只看该作者
试了上面的方法,现在不报bind error: Address already in use这个错误了,但是当传第二个文件时,在accept函数之前就停止了,不能传第二个文件。这又是什么错误阿?

论坛徽章:
0
4 [报告]
发表于 2009-03-27 18:12 |只看该作者
服务器怎么会挂掉?
要检查一下

论坛徽章:
0
5 [报告]
发表于 2009-03-27 18:22 |只看该作者
我也不知道阿,刚学socket,就遇到这种错误,已经调试了2天了,还没有出来!哪位帮忙看一下唄!

论坛徽章:
0
6 [报告]
发表于 2009-03-27 18:23 |只看该作者
用什么方法检查阿?

论坛徽章:
0
7 [报告]
发表于 2009-03-27 18:53 |只看该作者
感觉你的代码有点问题,因为你每次调用  int Send::SendFile(sendJob newJob) 方法的时候,就重新生成,绑定,监听一个服务器端的socket这样的话,出现  bind error: Address already in use 是肯定的。
你把 服务器端socket的初始化,放到外面来看看。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP