QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 782|回复: 3

文件传输问题

[复制链接]
发表于 2005-11-11 14:02:26 | 显示全部楼层 |阅读模式
按照大伙的意见以二进制打开文件传到客户端,可是客户端得不到完整的文件,而且,服务器已经显示传输完成,可是客户端没有反应,只能得到一小部分文件的 原文.
请各位高手看看到底问题出在什么地方?
这个是接收端的代码:
do

   {

      bzero(buf,MAXDATASIZE);

            if((numbytes=recv(sockfd, buf, MAXDATASIZE, 0)) == -1)

            {

/* 如果接收数据错误,则显示错误信息并退出 */

              perror("recv");

              exit(1);

             }

// printf("\nnumbytes=%d\n",numbytes);

fwrite(buf,1,numbytes,fp);

//printf("%s",buf);

   }while(numbytes==MAXDATASIZE);

这个是发送端的代码:
while (!feof(fp))

{/*读文件*/

           fread(buf,1,MAXSIZE,fp);

           buf[MAXSIZE]='\0';

           //printf("%s",buf);

           if (send(new_fd,buf, MAXSIZE, 0) == -1)

{

/* 如果错误,则给出错误提示,然后关闭这个新连接,退出 */

                perror("send");}//end if send

}//end while feof
发表于 2005-11-11 17:13:03 | 显示全部楼层
有那么复杂么!刚好有个例子,你自己研究研究吧。

服务端:
[code:1]
#include <stdio.h>
#include <fcntl.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

#define BUF_SIZE 0x100000

main()
{
    int sock,fd,client_sockfd;
    int ret;
    struct sockaddr_in address;
    unsigned char *buf;

    buf = malloc(BUF_SIZE);
    if(!buf)
        return;
    unlink("file.recv");
    fd = open("file.recv",O_RDWR | O_CREAT | O_TRUNC,0644);
    if(!fd)
    {
        free(buf);
        return;
    }
   
    sock=socket(AF_INET,SOCK_STREAM,0);
    address.sin_family = AF_INET;
    address.sin_addr.s_addr = htonl (INADDR_ANY);
    address.sin_port = htons (1234);

    bind(sock,(struct sockaddr *) &address,sizeof(address));
    listen(sock,8);

    client_sockfd = accept(sock, NULL,NULL);
    do{
        ret = read(client_sockfd,buf,BUF_SIZE);
        write(fd,buf,ret);
    }while(ret);
    close(client_sockfd);
    close(sock);
    free(buf);
}

[/code:1]

客户端:
[code:1]
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

#define BUF_SIZE 0x100000

main(int argc,char **argv)
{
    int sock,fd;
    struct sockaddr_in address;
    unsigned char *buf;
    int ret;

    if(argc != 2)
        return;
    buf = malloc(BUF_SIZE);
    if(!buf)
        return;

    fd = open(argv[1],O_RDONLY);
    if(!fd)
    {
        free(buf);
        return;
    }
    address.sin_family = AF_INET;
    address.sin_addr.s_addr = inet_addr("127.0.0.1");
    address.sin_port = htons(1234);
    sock = socket(AF_INET,SOCK_STREAM,0);
    if(sock)
    {
        ret = connect(sock,(struct sockaddr *)&address,sizeof(address));
        if(ret >= 0)
        {
            while(ret=read(fd,buf,BUF_SIZE))
                write(sock,buf,ret);
        }
    }
    close(fd);
    close(sock);
    free(buf);
}

[/code:1]

gcc server.c -o server
gcc client.c -o client

./server
./client 要传输的文件
回复

使用道具 举报

发表于 2005-11-11 17:14:08 | 显示全部楼层
排版怎么那么乱。。。。我粘的时候好好的。
回复

使用道具 举报

 楼主| 发表于 2005-11-14 10:25:26 | 显示全部楼层
谢谢版主
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-5-20 09:49 , Processed in 0.103969 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表