免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2609 | 回复: 15

请版主帮忙!!! [复制链接]

论坛徽章:
0
发表于 2003-01-22 09:57 |显示全部楼层
我写了个小程序为实现与sco主机的文件传输,但不用ftp,
程序在找到文件打开传输后,客户端却不能显示(乱码),不是客户端程序的问题,请版主帮忙分析下程序找到错误原因,不胜感谢!!!
×××××××××××××××××××××××××××××××××××××××
#include <stdio.h>;
#include <strings.h>;
#include <unistd.h>;
#include <sys/types.h>;
#include <sys/socket.h>;
#include <netinet/in.h>;
#include <arpa/inet.h>;
#include <signal.h>;
#include <wait.h>;

#define PORT        1234
#define        BACKLOG        2
#define        MAXDATASIZE        1000

void process_cli(int connectfd,struct sockaddr_in client);
void sig_handler(int s);
main()
{
        int        listenfd,connectfd;
        pid_t        pid;
        struct        sockaddr_in        server;
        struct        sockaddr_in        client;
        int        sin_size;
        struct        sigaction        act,oact;
        int         opt;
        act.sa_handler=sig_handler;
        sigemptyset(&amp;act.sa_mask);
        act.sa_flags=0;
        if (sigaction(SIGCHLD,&amp;act,&amp;oact)<0) {
                perror("sigaction failed!";
                exit (1);
        }
        if ((listenfd=socket(AF_INET,SOCK_STREAM,0))==-1) {
                perror("creating socket failed.";
                exit (1);
        }
        opt=SO_REUSEADDR;
        setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,&amp;opt,sizeof(opt));
        bzero(&amp;server,sizeof(server));
        server.sin_family=AF_INET;
        server.sin_port=htons(PORT);
        server.sin_addr.s_addr=htonl(INADDR_ANY);
        if (bind(listenfd,(struct sockaddr *)&amp;server,
                sizeof(struct sockaddr))==-1) {
                perror("bind error";
                exit (1);
        }
        if (listen(listenfd,BACKLOG)==-1) {
                perror("listen() error.\n";
                exit (1);
        }
        sin_size=sizeof(struct sockaddr_in);
        while (1)
        {
                if ((connectfd=accept(listenfd,(struct sockaddr *)&amp;client,
                        &amp;sin_size))==-1) {
                        perror("accept() error\n";
                        exit (1);
                }
                if ((pid=fork())>;0) {
                        close(connectfd);
                        continue;
                }
                else if(pid==0) {
                        close(listenfd);
                        process_cli(connectfd,client);
                        exit (0);
                        }
                else {
                        printf("fork error\n";
                        exit (0);
                        }
        }
        close(listenfd);
}
void process_cli(int connectfd,struct sockaddr_in client)
{
        FILE         *fp;
        char         ch[1000];
        int        num;
        int        i;
        char        recvbuf[MAXDATASIZE],sendbuf[MAXDATASIZE],
                cli_name[MAXDATASIZE];
        printf("you got a connection from %s.",inet_ntoa(client.sin_addr));
        num=recv(connectfd,cli_name,MAXDATASIZE,0);
        if (num==0) {
                close(connectfd);
                printf("client disconnected.\n";
                return;
        }
        cli_name[num-1]='\0';
        printf("client's name is %s.\n",cli_name);
       
        while (num=recv(connectfd,recvbuf,MAXDATASIZE,0)) {
                printf("received client(%s) message:%s",cli_name,recvbuf);
                if ((fp=fopen(recvbuf,"r")==NULL){
                        strcpy(sendbuf,"not exit";
                        send(connectfd,sendbuf,strlen(sendbuf),0);
                        exit (1);
                }
                if (fgets(ch,1000,fp)==EOF)
                        perror("fgets error";
                while (*ch!=EOF) {
                        memcpy(sendbuf,&amp;ch,sizeof(ch));
                        send(connectfd,sendbuf,strlen(sendbuf),0);
                        fgets(ch,1000,fp);
                }
                close(fp);       
        }
        close(connectfd);
}
void sig_handler(int s)
{
        pid_t        pid;
        int        stat;
        while (( pid=waitpid(-1,&amp;stat,WNOHANG))>;0)
                printf("child %d terminated\n",pid);
                return;
}       


论坛徽章:
0
发表于 2003-01-22 10:19 |显示全部楼层

请版主帮忙!!!

我对这方面也不是很熟悉,你的C和S是一个平台吗?是不是因为网络的字节顺序再不同的操作平台上面不同造成的呀?请高手们赐教,谢谢

论坛徽章:
0
发表于 2003-01-22 10:25 |显示全部楼层

请版主帮忙!!!

发送文件的函数修改如下

[quote=]

void process_cli(int connectfd,struct sockaddr_in client)
{
        FILE *fp;
        char ch[1000];
        int num;
        int i;
        char recvbuf[MAXDATASIZE],sendbuf[MAXDATASIZE], cli_name[MAXDATASIZE];
       
        printf("you got a connection from %s.",inet_ntoa(client.sin_addr));
        num=recv(connectfd,cli_name,MAXDATASIZE,0);
        if (num==0) {
                close(connectfd);
                printf("client disconnected.\n";
                return;
        }
       
        cli_name[num-1]='\0';
        printf("client's name is %s.\n",cli_name);

        while (num=recv(connectfd,recvbuf,MAXDATASIZE,0)) {
                printf("received client(%s) message:%s",cli_name,recvbuf);
                if ((fp=fopen(recvbuf,"r")==NULL){
                        strcpy(sendbuf,"not exit";
                        send(connectfd,sendbuf,MAXDATASIZE,0);
                        exit (1);
                }
       
                if (fgets(ch,1000,fp)==EOF) perror("fgets error";
               
                while (*ch!=EOF) {
                        bzero(sendbuf,MAXDATASIZE);
                        memcpy(sendbuf,&amp;ch,strlen(ch));
                        send(connectfd,sendbuf,MAXDATASIZE,0);
                        fgets(ch,1000,fp);
                }
                close(fp);
        }
       
        clos(connectfd);
}


[/quote]

论坛徽章:
0
发表于 2003-01-22 10:41 |显示全部楼层

请版主帮忙!!!

代码用
[CODE]
开发

论坛徽章:
0
发表于 2003-01-22 10:42 |显示全部楼层

请版主帮忙!!!

错了
上面是始
然后用[/CODE]
结束

论坛徽章:
0
发表于 2003-01-22 10:44 |显示全部楼层

请版主帮忙!!!

recv返回的串
不会在后面自动加\0

论坛徽章:
0
发表于 2003-01-22 15:58 |显示全部楼层

请版主帮忙!!!

版主我得循环读取文件内容并发送可能有问题
原码如下:
        while ((fgets(ch,1000,fp))!=EOF) {

                bzero(sendbuf,MAXDATASIZE);       
                memcpy(sendbuf,&amp;ch,sizeof(ch));
                send(connectfd,sendbuf,sizeof(sendbuf),0);
        }

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2003-01-22 16:15 |显示全部楼层

请版主帮忙!!!

你这个程序问题多多!
1。recv 的返回值没有考虑到负数(出错)的情况。
2。recv 的返回值不一定是预期的值。
3。send 的发送长度不能用 MAX, 必须是实际长度。
4。打开文件不要用 fopen( ..., "r" ) 要用 fopen( ..., "rb" )
5。读取文件不要用 fgets() 要用 fread();
。。。。。。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2003-01-22 16:16 |显示全部楼层

请版主帮忙!!!

6。还要考虑文件长度不是 1000 的整数倍的情形。
。。。。。。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2003-01-22 16:20 |显示全部楼层

请版主帮忙!!!

7。还有,对一段内存求 strlen() 是无意义的同时也是错误的。
。。。。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP