主题 : 关于linux udp 传输文件的问题 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 2403
精华: 0
发帖: 14
金钱: 100 两
威望: 38 点
综合积分: 28 分
注册时间: 2008-11-16
最后登录: 2017-09-13
楼主  发表于: 2009-10-30 09:10

 关于linux udp 传输文件的问题

各位大虾,小弟最近在做linux udp 传输图片的项目,我已经写了初步的代码,可以实现client把test.txt的内容发送到server上显示出来,以下是我写的代码:
client  部分:

/*client.c*/

#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <netdb.h>
#include <netinet/in.h>


#define PORT    8888
#define BUFFER_SIZE 1024

int main(int argc, char *argv[])
{
    int sockfd, sendbytes, recvbytes,nRead;;
    char buf[BUFFER_SIZE];
    char buf1[1024];
    struct hostent *host;
    struct sockaddr_in serv_addr;
    int addr_len;
    FILE *fp;
    
    if(argc < 3)
    {
        fprintf(stderr,"USAGE: ./client Hostname(or ip address) Text\n");
        exit(1);
    }
    
    /*地址解析函数*/
    if ((host = gethostbyname(argv[1])) == NULL)
    {
        perror("gethostbyname");
        exit(1);
    }
    
    /*创建socket*/
    if ((sockfd = socket(AF_INET,SOCK_DGRAM,0)) == -1)
    {
        perror("socket");
        exit(1);
    }
    
    /*设置sockaddr_in 结构体中相关参数*/
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons(PORT);
    serv_addr.sin_addr = *((struct in_addr *)host->h_addr);
    bzero(&(serv_addr.sin_zero), 8);
    addr_len = sizeof(serv_addr);

    fp = fopen("test.txt","r");
    memset(buf, 0, sizeof(buf));
    nRead = fread(buf,sizeof(char),100,fp);    //把文件的内容读进缓存
    sprintf(buf1, "%s", argv[2]);

    if( fp == NULL)
    {
        printf("open file fail");
    }
    else
    {
             printf("file_block_num = %d\n",nRead);    //打印包的数量
    /*发送消息给服务器端*/
        if ((sendbytes = sendto(sockfd, buf, strlen(buf), 0, (struct sockaddr*)&serv_addr, addr_len)) == -1)
        {
        perror("send");
        exit(1);
        }
    }
    printf("send success\n");

    recvbytes = recvfrom(sockfd, buf, sizeof(buf), 0, (struct sockaddr*)&serv_addr, &addr_len);
    if (recvbytes < 0)
    {
        perror("recvfrom");
    }
    buf[recvbytes] = 0;
    printf("From server: %s\n", buf);
    close(sockfd);
    exit(0);
}


server部分:

/*client.c*/

#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <netdb.h>
#include <netinet/in.h>


#define PORT    8888
#define BUFFER_SIZE 1024

int main(int argc, char *argv[])
{
    int sockfd, sendbytes, recvbytes,nRead;;
    char buf[BUFFER_SIZE];
    char buf1[1024];
    struct hostent *host;
    struct sockaddr_in serv_addr;
    int addr_len;
    FILE *fp;
    
    if(argc < 3)
    {
        fprintf(stderr,"USAGE: ./client Hostname(or ip address) Text\n");
        exit(1);
    }
    
    /*地址解析函数*/
    if ((host = gethostbyname(argv[1])) == NULL)
    {
        perror("gethostbyname");
        exit(1);
    }
    
    /*创建socket*/
    if ((sockfd = socket(AF_INET,SOCK_DGRAM,0)) == -1)
    {
        perror("socket");
        exit(1);
    }
    
    /*设置sockaddr_in 结构体中相关参数*/
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons(PORT);
    serv_addr.sin_addr = *((struct in_addr *)host->h_addr);
    bzero(&(serv_addr.sin_zero), 8);
    addr_len = sizeof(serv_addr);

    fp = fopen("test.txt","r");
    memset(buf, 0, sizeof(buf));
    nRead = fread(buf,sizeof(char),100,fp);    //把文件的内容读进缓存
    sprintf(buf1, "%s", argv[2]);

    if( fp == NULL)
    {
        printf("open file fail");
    }
    else
    {
             printf("file_block_num = %d\n",nRead);    //打印包的数量
    /*发送消息给服务器端*/
        if ((sendbytes = sendto(sockfd, buf, strlen(buf), 0, (struct sockaddr*)&serv_addr, addr_len)) == -1)
        {
        perror("send");
        exit(1);
        }
    }
    printf("send success\n");

    recvbytes = recvfrom(sockfd, buf, sizeof(buf), 0, (struct sockaddr*)&serv_addr, &addr_len);
    if (recvbytes < 0)
    {
        perror("recvfrom");
    }
    buf[recvbytes] = 0;
    printf("From server: %s\n", buf);
    close(sockfd);
    exit(0);
}


最关键的分包跟组包算法,小弟想了很久都没个结果,请大家帮帮忙。
我有个vc++环境下的udp传输文件的工程,想在上面下手,可是看了半天也不知道该如何移植到linux上去运行,求大家帮忙
描述:vc++ udp 文件传输
附件: src.rar (35 K) 下载次数:16
*無鈳取玳
级别: 论坛版主
UID: 27
精华: 12
发帖: 5398
金钱: 40120 两
威望: 17929 点
综合积分: 11036 分
注册时间: 2008-01-16
最后登录: 2014-11-22
1楼  发表于: 2009-10-30 10:01
帮你顶了,希望这方面有经验的兄弟都来帮忙
"If you have an apple and I have an apple and we exchange apples, then you and I will
still each have one apple. But if you have an idea and I have an idea and we exchange
these ideas, then each of us will have two ideas."
级别: 新手上路
UID: 2403
精华: 0
发帖: 14
金钱: 100 两
威望: 38 点
综合积分: 28 分
注册时间: 2008-11-16
最后登录: 2017-09-13
2楼  发表于: 2009-10-31 10:17
我是在虚拟机上操作的,已经实现了,但是跟其他电脑联机后就不行了,恳请高手帮忙
*無鈳取玳
级别: 论坛版主
UID: 27
精华: 12
发帖: 5398
金钱: 40120 两
威望: 17929 点
综合积分: 11036 分
注册时间: 2008-01-16
最后登录: 2014-11-22
3楼  发表于: 2009-10-31 10:31

 回 2楼(lzhp258) 的帖子

那你也得把怎么“不行”的问题说出来吧
"If you have an apple and I have an apple and we exchange apples, then you and I will
still each have one apple. But if you have an idea and I have an idea and we exchange
these ideas, then each of us will have two ideas."