找回密码
 注册
楼主: 午夜心铃

求助 急!要一份LINUX网络编程的原代码!

[复制链接]
 楼主| 发表于 2003-7-9 08:54:55 | 显示全部楼层
我的程序就是发送文件然后  看看要多少时间!很简单的一个
但是前几天一直是被如何传输文件给困住了!我把我的代码也贴出来
大家都给点指点!
回复

使用道具 举报

 楼主| 发表于 2003-7-9 08:57:11 | 显示全部楼层
#include<unistd.h>
#include&lt;fcntl.h&gt;
#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;errno.h&gt;
#include &lt;string.h&gt;
#include &lt;netdb.h&gt;
#include &lt;sys/types.h&gt;
#include &lt;sys/socket.h&gt;
#include &lt;sys/time.h&gt;
#include<unistd.h>
#include&lt;arpa/inet.h&gt;
#define servport 3333
#define maxlen 1024

int main (int argc,char  *argv[])
{
        int sockfd;
        int n;
        char buf[maxlen];
        struct sockaddr_in myaddr;
        long spendtime,sendtime,recvtime;
        struct timeval now;                                                                int fp;
        if (argc&lt;2)
        {
                printf("Please enter the server's hostname and port !");
                exit(1);
        }
        if ((sockfd=socket(AF_INET,SOCK_STREAM,0))&lt;0)
        {
                perror("socket error");
                exit(1);
        }
        memset(&amp;myaddr,0,sizeof(struct sockaddr_in));
        myaddr.sin_family=AF_INET;
        myaddr.sin_port=htons(servport);
        if(inet_pton(AF_INET,argv[1],&amp;myaddr.sin_addr)&lt;=0)
        {
                perror("IP error!");
                exit(1);
        }
        if (connect(sockfd,(struct sockaddr *)&amp;myaddr,sizeof(myaddr))&lt;0)
        {
                perror("Connect error!");
                exit(2);
        }                                                               
        gettimeofday(&amp;now,0);       
        memset(buf,0,sizeof(buf));
        if((fp=open("/mnt/linuxsource.htm",O_RDONLY))&lt;0)
        {
                printf("Can not open file!");
                exit(0);
        }
        sendtime=now.tv_sec*1000000+now.tv_usec;
        /*memset(buf,1,sizeof(buf));*/
        while((n=read(fp,buf,sizeof(buf)))&gt;0)
                write(sockfd,buf,n);
        close(sockfd);
        close(fp);
        printf("file tranfer finish!");
       /*        if ((recvbytes=recv(sockfd,buf,maxlen,0))&lt;0)                                        {
                perror("receive error!");
                exit(1);
        }*/
        gettimeofday(&amp;now,0);
        recvtime=now.tv_sec*1000000+now.tv_usec;
        spendtime=recvtime-sendtime;
        printf("\t\t\t spend time=%ld\n",spendtime);
        fflush(stdout);
        return 1;
       

}
以上部分是客户端的代码!#include&lt;fcntl.h&gt;
#include&lt;sys/types.h&gt;
#include&lt;sys/socket.h&gt;
#include&lt;stdio.h&gt;
#include&lt;stdlib.h&gt;
#include&lt;string.h&gt;
#include&lt;netinet/in.h&gt;
#include&lt;sys/wait.h&gt;
#include&lt;errno.h&gt;
#include&lt;arpa/inet.h&gt;
#include<unistd.h>
#include&lt;setjmp.h&gt;
#include&lt;netdb.h&gt;
#define servport 3333
#define maxlen 1024
int main()
{
               int sockfd,clientfd,socklen;
               int fp;
                                    /*  FILE *fp;*/
        char buf[maxlen];
        long  nread;
        struct sockaddr_in myaddr;
        struct sockaddr_in remoteaddr;
        if((sockfd=socket(AF_INET,SOCK_STREAM,0))&lt;0)
        {
                perror("socket error!");
                 exit(0);
         }
        memset(&amp;myaddr,0,sizeof(struct sockaddr_in));
        myaddr.sin_family=AF_INET;
        myaddr.sin_port=htons(servport);
        myaddr.sin_addr.s_addr=htonl(INADDR_ANY);
        if((bind(sockfd,(struct sockaddr*)&amp;myaddr,sizeof(myaddr)))&lt;0)
        {
                perror("bind error!");
                exit(0);
        }
        if(listen(sockfd,10)&lt;0)
        {
                perror("listen error!");
                exit(0);
        }
        socklen=sizeof(struct sockaddr);
        if((fp=open("/root/111.htm",O_WRONLY|O_CREAT|O_TRUNC,0644))&lt;0)
        {
                perror("file open error!");
                       exit(0);
        }
        while(1)
        {
                if((clientfd=accept(sockfd,(struct sockaddr*)&amp;remoteaddr,&amp;socklen))&lt;0)
                {
                        perror("accept error!");
                        continue;
                }
                printf("connect finish!\n");
                printf("received a conncetion from %s", inet_ntoa(remoteaddr.sin_addr));
                       printf("enter childprogress!");
                fflush(stdout);
                memset(buf,0,maxlen);
                if((fork())==0)
                       {
                        printf("enterd fork");
                        fflush(stdout);
                        nread=0;
                        while((nread=read(clientfd,buf,sizeof(buf)))&gt;0)
                                write(fp,buf,nread);
                        close(fp);
                        printf("&amp;Icirc;&amp;Auml;&amp;frac14;&amp;thorn;&amp;frac12;&amp;Oacute;&amp;Ecirc;&amp;Otilde;&amp;Iacute;ê±&amp;Iuml;");
                        fflush(stdout);
                            printf("sending data....!");
                        fflush(stdout);
                            if(send(clientfd,"Hello data is accpetted!",30,0)&lt;0)
                        {
                                perror("send error!");
                                exit(0);
                        }
                            close(clientfd);
                }
                else close(clientfd);
        }
        return 1;
}

这是服务器的!
回复

使用道具 举报

 楼主| 发表于 2003-7-9 08:58:45 | 显示全部楼层
我的代码里面  有很多printf  后面加fflush     都是为了 调试用的!可以不要!
回复

使用道具 举报

发表于 2003-7-10 23:02:32 | 显示全部楼层
hibernate:请问你的程序,在什么环境下做的?
我在Red Hat 7.2下,怎么通不过?
说gets()函数危险,
我改成fgets()后,编译通过了,似乎一切
成功了,但没有得到正确结果。原因我正在找,
你比较熟悉,请提醒!谢谢!
回复

使用道具 举报

发表于 2003-7-11 10:49:35 | 显示全部楼层
“那里有压迫,那里就反抗”
谢谢!
又长知识了

回复

使用道具 举报

发表于 2003-7-11 21:34:23 | 显示全部楼层
我是在redhat8下通过的
不知道你出的毛病是什么呢
对的,gets函数是不安全的函数
在linux的c下是有很多函数是不安全的
就比如sprintf等
但这应该是和警告吧不是报错
回复

使用道具 举报

发表于 2003-7-11 21:39:58 | 显示全部楼层
午夜心铃:你的程序只能实现指定文件传送。请问怎么在你的程序里实现
在终端输入任意的文件名,即可实现该文件传送到接收方。在接收方得到
的文件和发送方完全一样,包括文件名。谢谢!
回复

使用道具 举报

发表于 2003-7-11 21:42:50 | 显示全部楼层
这应该比较简单的吧
你可以把文件名先期传过去的吧
回复

使用道具 举报

发表于 2003-7-11 21:58:44 | 显示全部楼层
now I am under the window system,and have something to work out!
I would  reboot to the linux system sometime late!
Now you'd try by yourself!
回复

使用道具 举报

发表于 2003-7-11 23:35:15 | 显示全部楼层
hibernate:谢谢关心!
我对这部分,尤其文件类操作不太清楚。
我正努力了解具体实现,有空请多指教!
回复

使用道具 举报

发表于 2003-7-11 23:39:15 | 显示全部楼层
方便时,能否编个小程序之类,这样,我理解起来更容易些!
多谢了!
回复

使用道具 举报

发表于 2003-7-12 00:04:53 | 显示全部楼层
ahguang
你也刚刚从一颗星会员升级到二颗星
呵呵
我也是
庆祝一下

我在windows下用vc编辑论坛上说的表达式运算求值程序
有点郁闷!!
下周一我就要回家了
很少能上网(只能到网吧),也不能用linux编点小程序
恐怕你得请教别人了
回复

使用道具 举报

发表于 2003-7-12 00:10:48 | 显示全部楼层
是啊!
庆祝一下!
刚才还和别人说这事呢!但深感惭愧!都是问你们问题,
自己水平太次!
回复

使用道具 举报

发表于 2003-7-12 00:15:00 | 显示全部楼层
祝你回家一路顺风!
要是你这两天有空的话,就请多费点心;
要是忙,就算了!
回复

使用道具 举报

发表于 2003-7-12 00:27:58 | 显示全部楼层
能在论坛结识你们,
我真的很高兴!
我们素寐平生,但却得到你们热情的帮助,
真心的说声:谢谢!
回复

使用道具 举报

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

本版积分规则

GMT+8, 2025-8-11 17:21 , Processed in 0.026953 second(s), 13 queries .

© 2001-2025 Discuz! Team. Powered by Discuz! X3.5.

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