免费注册 查看新帖 |

Chinaunix

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

socket 文件传送问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-07-07 19:39 |只看该作者 |倒序浏览
求教:为什么下面的程序不能实现???

客户端:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<netdb.h>
#include<netinet/in.h>
#include<unistd.h>
#include<time.h>

#define SERVERPORT 5555

int main(int argc,char *argv[])
{
        int sockfd,connectfd,recvfd,sendfd ;
        struct sockaddr_in serv_addr;
        struct hostent *host;
        FILE *fp;
        char ch[256];

        if(argc!=3)
        {
                printf("format: %s IP file_name\n",argv[0]);
                return 0;
        }

        if((host=(gethostbyname(argv[1])))==NULL)
        {
                printf("error in gethostby name. \n";
                return 0;
        }
        if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
        {
                printf("error in socket create.\n";
                return 0;
        }

        serv_addr.sin_family=AF_INET;
        serv_addr.sin_port =htons(SERVERPORT);
        serv_addr.sin_addr=*((struct in_addr*)host->h_addr);
        bzero(&(serv_addr.sin_zero),;

        if((connectfd=connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(struct sockaddr )))==-1)
        {
                printf("error in connect.\n";
                return 0;
        }

        fp=fopen(*(argv+2),"rb";
        while(sendfd=fread(ch,sizeof(char),256,fp)>0)
        {
                send(sockfd,ch,sendfd,0);
        }
        fclose(fp);
        close(sockfd);       
        return 0;
}
服务端:
#include<stdio.h>
#include<string.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<time.h>
#include<stdlib.h>
#include<netinet/in.h>
#include<netdb.h>
#include<unistd.h>
#define SERVERPORT 5555
#define BACKLOG 10

int main(int agrc,char *agrv[])
{
        int sockfd,bindfd,listenfd,acceptfd,recvfd;
        struct sockaddr_in myaddr;
        struct sockaddr_in myclient;
        char ch[256];

        FILE * fp;
        if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
        {
                printf("error! in socket create!\n";
                return 0;
        }
        myaddr.sin_family=AF_INET;
        myaddr.sin_port=htons(SERVERPORT);
        myaddr.sin_addr.s_addr=htonl(INADDR_ANY);
        bzero(&(myaddr.sin_zero),;
       
        int opt=SO_REUSEADDR;
        setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));

        if((bindfd=bind(sockfd,(struct sockaddr *)&myaddr,sizeof(myaddr)))==-1)
        //if((bindfd=bind(sockfd,(struct sockaddr *)&myaddr,sizeof(myaddr)))==-1)
                {
                        printf("errer in bind\n";
                        //close(sockfd);
                        return 0;
                }

        if((listenfd=listen(sockfd,BACKLOG))==-1)
        {
                printf("error! the queue_listen is full!\n";
                return 0;
        }
       
        int len_addr=sizeof(struct sockaddr_in);
        if((acceptfd=accept(sockfd,(struct sockaddr *)&myclient,&len_addr ))==-1)
        {
                printf("error in accept.\n";
                return 0;
        }

        fp=fopen("copy_file.txt","a";
        do{
                if((recvfd=recv(acceptfd,ch,256,0))==-1)
                {
                        printf("error in recv.\n";
                        break;
                }

                fwrite(ch,1,sizeof(ch),fp);
               
        }while(recvfd > 0);

        fclose(fp);
        close(sockfd);       
        return 0;
}

论坛徽章:
0
2 [报告]
发表于 2011-07-08 10:27 |只看该作者
怎么不用sendfile()?

论坛徽章:
0
3 [报告]
发表于 2011-07-08 20:57 |只看该作者
不能实现?有什么现象么?

论坛徽章:
0
4 [报告]
发表于 2011-07-08 23:18 |只看该作者
回复 3# snowboy9859


    现象就是:copy.txt里边没有内容!奇怪,求解释,我试了,不知道为什么?

论坛徽章:
0
5 [报告]
发表于 2011-07-09 12:47 |只看该作者
顶一个

论坛徽章:
0
6 [报告]
发表于 2011-07-15 17:29 |只看该作者
编译过了,我这个里面是乱码

论坛徽章:
0
7 [报告]
发表于 2011-07-17 12:09 |只看该作者
回复 4# hanzhiwei111


    加打印继续跟踪,看是哪里出了错,把读到的数据打印到终端

论坛徽章:
0
8 [报告]
发表于 2011-07-18 18:15 |只看该作者
send(sockfd,ch,sendfd,0);
这句话中sendfd大小为3,发送的时候就只发送3位,改成sizeof(ch)行不行

论坛徽章:
0
9 [报告]
发表于 2011-08-06 13:25 |只看该作者
改了一下,可以了

  1. 客户端程序:
  2. #include<stdio.h>
  3. #include<stdlib.h>
  4. #include<string.h>
  5. #include<sys/socket.h>
  6. #include<sys/types.h>
  7. #include<netdb.h>
  8. #include<netinet/in.h>
  9. #include<unistd.h>
  10. #include<time.h>

  11. #define SERVERPORT 5555

  12. int main(int argc,char *argv[])
  13. {
  14.         int sockfd,connectfd,sendfd = 0 ;
  15.         struct sockaddr_in serv_addr;
  16.         struct hostent *host;
  17.         FILE *fp = NULL;
  18.         char ch[256] = {0};
  19.         if(argc!=3)
  20.         {
  21.                 printf("format: %s IP file_name\n",argv[0]);
  22.                 return 0;
  23.         }


  24.         if((host=(gethostbyname(argv[1])))==NULL)
  25.         {
  26.                 printf("error in gethostby name. \n");
  27.                 return 0;
  28.         }

  29.         if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
  30.         {
  31.                 printf("error in socket create.\n");
  32.                 return 0;
  33.         }

  34.         serv_addr.sin_family=AF_INET;
  35.         serv_addr.sin_port =htons(SERVERPORT);
  36.         serv_addr.sin_addr=*((struct in_addr*)host->h_addr);
  37.         bzero(&(serv_addr.sin_zero), sizeof(serv_addr.sin_zero));

  38.         if((connectfd=connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(struct sockaddr)))==-1)
  39.         {
  40.                 printf("error in connect.\n");
  41.                 return 0;
  42.         }

  43.         fp=fopen(*(argv+2), "rb");
  44.         while(!feof(fp))
  45.         {
  46.                 memset(ch, 0x0, 256);
  47.                 sendfd=fread(ch, 1, 256, fp);
  48.                 //printf("[debug], read %d bytes,send buf:%s\n", sendfd, ch);
  49.                 //printf("\n");
  50.                
  51.                 int sendBytes = 0;
  52.                 sendBytes = send(sockfd,ch,sendfd,0);
  53.                 //printf("[debug]: send %d bytes\n", sendBytes);

  54.                 sendfd = 0;
  55.         }
  56.         fclose(fp);
  57.         close(sockfd);        
  58.         return 0;
  59. }

  60. 服务器端:
  61. #include<stdio.h>
  62. #include<string.h>
  63. #include<sys/socket.h>
  64. #include<sys/types.h>
  65. #include<time.h>
  66. #include<stdlib.h>
  67. #include<netinet/in.h>
  68. #include<netdb.h>
  69. #include<unistd.h>
  70. #define SERVERPORT 5555
  71. #define BACKLOG 10

  72. int main(int agrc,char *agrv[])
  73. {
  74.         int sockfd,bindfd,listenfd,acceptfd,recvfd;
  75.         struct sockaddr_in myaddr;
  76.         struct sockaddr_in myclient;
  77.         char ch[256] = {0x0};

  78.         FILE * fp;
  79.         if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
  80.         {
  81.                 printf("error! in socket create!\n");
  82.                 return 0;
  83.         }
  84.         myaddr.sin_family=AF_INET;
  85.         myaddr.sin_port=htons(SERVERPORT);
  86.         myaddr.sin_addr.s_addr=htonl(INADDR_ANY);
  87.         bzero(&(myaddr.sin_zero), sizeof(myaddr.sin_zero));
  88.         
  89.         int opt=SO_REUSEADDR;
  90.         setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));

  91.         if((bindfd=bind(sockfd,(struct sockaddr *)&myaddr,sizeof(myaddr)))==-1)
  92.         //if((bindfd=bind(sockfd,(struct sockaddr *)&myaddr,sizeof(myaddr)))==-1)
  93.                 {
  94.                         printf("errer in bind\n");
  95.                         //close(sockfd);
  96.                         return 0;
  97.                 }

  98.         if((listenfd=listen(sockfd,BACKLOG))==-1)
  99.         {
  100.                 printf("error! the queue_listen is full!\n");
  101.                 return 0;
  102.         }
  103.         
  104.         int len_addr=sizeof(struct sockaddr_in);
  105.         if((acceptfd=accept(sockfd,(struct sockaddr *)&myclient,&len_addr ))==-1)
  106.         {
  107.                 printf("error in accept.\n");
  108.                 return 0;
  109.         }

  110.         fp=fopen("copy_file.txt","wb");
  111.         recvfd = 0;
  112.         do{
  113.             memset(ch, 0x0, 256);
  114.             if((recvfd=recv(acceptfd,ch,256,0))==-1)
  115.             {
  116.                     printf("error in recv.\n");
  117.                     break;
  118.             }
  119.             
  120.             //printf("[debug],recv %d bytes, content: %s\n", recvfd, ch);
  121.             fwrite(ch, 1, recvfd, fp);
  122.             fflush(fp);
  123.         }while(recvfd > 0);

  124.         fclose(fp);
  125.         close(sockfd);        
  126.         return 0;
  127. }

复制代码

论坛徽章:
0
10 [报告]
发表于 2011-08-06 13:26 |只看该作者
{:3_188:}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP