久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3075|回復: 0
打印 上一主題 下一主題
收起左側

基于GCC_TCPIP Socket—服務端文件傳輸

[復制鏈接]
跳轉到指定樓層
樓主
ID:51090 發表于 2014-9-18 12:54 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <errno.h>
#include <signal.h>


#define IPLEN 40
#define  NUM 1024
#define  RCVPORT 1990
#define  NAME 45
#define  EOF  (-1)

int my_open(int sd,char *p);
int my_rdwr(int fd,int stat_st_size,int sd);


int main(int argc,char * argv[])
{
        int fd;
           int i=1;
        int sockedfd;
        int newsockedfd;
        int stop = EOF;
        char buf[20];
        size_t  len;
        struct sockaddr_in local_addr;
        struct sockaddr_in peer_addr;
        socklen_t addr_len;
        char ipstr[IPLEN];
        pid_t fpid;
       
        sockedfd = socket(PF_INET, SOCK_STREAM, 0);
        if(sockedfd< 0){
                perror("socket()");
                exit(1);
        }
       
        setsockopt(sockedfd,SOL_SOCKET,SO_REUSEADDR,&i,sizeof(i) );
       
        local_addr.sin_family = PF_INET;//ipv4
        local_addr.sin_port = htons(RCVPORT);
        inet_pton(PF_INET, "0.0.0.0", &local_addr.sin_addr);//邦定端口
        if(bind(sockedfd, (struct sockaddr *)&local_addr, sizeof(local_addr)) < 0){
                perror("bind()");
                exit(1);
        }
        if(listen(sockedfd, 200) < 0){
                perror("listen()");
                exit(1);
        }
        while(1)
        {
                addr_len = sizeof(peer_addr);
                newsockedfd = accept(sockedfd,(void*)&peer_addr, &addr_len);
                if(newsockedfd < 0)
                {
                        perror("accept()");
                        exit(1);
                }
                i=1;       
                char n='0';
#if 1
                fpid=fork();
                if(0 ==fpid )
                {
                        close(sockedfd);//關閉父進程監聽描述符
#endif
                        while(1)
                        {
                                len = read(newsockedfd,buf,1);
                                if(0 > len )
                                {
                                        perror("read()");
                                        return -1;
                                }
                                if( 0 ==len )
                                        break;               

                                if ( '0'==n )
                                {
                                        n=buf[0];
                                        printf("n=%c, i=%d \n",n,i);
                                        if(n<'4'&&n>='1')
                                        {
                                                snprintf(buf,sizeof(buf),"music/%c.wma",n);
                                                printf("%s \n",buf);
                                                my_fopen_rdwr(newsockedfd,buf);
                                        }
                                        else
                                        {
                                                printf("ERROR()\n");
                                                len=write(newsockedfd,&stop,4);
                                                if(len<0)
                                                {
                                                        perror("write()");
                                                        printf("writr end fill");
                                                }
                                                n='0';
                                                break;
                                        }
                                }
                                else
                                {
                                        if( NAME == i )
                                        {//圖片張數
                                                len=write(newsockedfd,&stop,4);//結束寫19
                                                if(len<0)
                                                {
                                                        perror("write()");
                                                        printf("writr end fill");
                                                }
                                                break;
                                        }
                                        snprintf(buf,sizeof(buf),"jpg%c/%d.jpg",n,i++);
                                        printf("%s \n",buf);
                                        my_fopen_rdwr(newsockedfd,buf);
                                }
                        }
                        close(newsockedfd);
                        exit(0);
                       
                }
                else if (0 < fpid)
                {
                        close(newsockedfd);//父進程關閉新套接字
                        signal(SIGCLD, SIG_IGN);//通知內核回收進程,該進程不是父進程回收
                }
                else
                {
                        printf("this is fork error\n");
                }
                //printf("*******%s %s %d****pid=%d****\n",__FILE__,__FUNCTION__,__LINE__,fpid);
        }
        close(sockedfd);
        return 0;
}

int my_fopen_rdwr(int sd,char *p)
{
        struct stat stat_init;
        size_t ret;
        int pos,pos1;
        char buf[NUM];
        int j=0;
        FILE * fd;
        fd=fopen(p,"r");
        if(fd<0)
        {
                perror("fopen()");
                return -1;
        }
        if(stat(p,&stat_init)<0)
        {
                perror("stat()");
                return -1;
        }
#if 1
        ret=write(sd,&stat_init.st_size,4);
        pos1+=ret;
        if(ret<0)
        {
                perror("write()");
                return -1;
        }
#endif
        while(stat_init.st_size>0)
        {
                pos=0;
                pos1=0;
                ret=fread(buf+pos,sizeof(char),NUM,fd);
                pos+=ret;
                if(ret<0){
                        perror("fread()");
                        return -1;
                }
                ret=write(sd,buf+pos1,ret);
                pos1+=ret;
                if(ret<0){
                        perror("write()");
                        return -1;
                }
                stat_init.st_size-=ret;
        }
        printf("is over*******\n");
        fclose(fd);
        return 0;
}

本服務端代碼測試通過 ,cpu占用率低,該服務端是采用多進程方式通訊,有客戶端連接到服務端時,父進程會fork個子進程,子進程來連接客戶,父進程繼續監聽端口,子進程下載完畢后自動退出,這樣做的目的是在沒有客戶連接時,只有父進程一個處于監聽狀態,節約內存,提高性能,要是有多個客戶連接,父進程只管fork子進程,節約了時間,同時可以多個客戶端下載,本代碼出錯處理不夠完善,后期繼續跟新,如有建議和本人寫的不足之處敬請給位多多指教。

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 第四色播日韩第一页 | 伊人色综合久久天天五月婷 | 国产亚洲区 | 亚洲精品在线国产 | 日韩精品一区二区三区久久 | 九九综合九九 | 黄色日批视频 | 国产www在线 | 亚洲一区成人 | 欧美日韩亚洲在线 | 亚洲一区二区三区在线视频 | 日韩欧美在线一区 | 成人免费共享视频 | 九九九久久国产免费 | 久久久99精品免费观看 | 成人在线 | 亚洲欧美在线视频 | 国产一区不卡在线观看 | 国产99精品| 欧美一页| 国产高清久久 | 九九免费 | 久久国产亚洲 | 日韩欧美在线观看 | 欧美精品网站 | 国产精品久久 | 狠狠躁躁夜夜躁波多野结依 | 日韩一二三区视频 | 三级黄色大片网站 | 国产综合久久久久久鬼色 | 欧美色综合天天久久综合精品 | 精品欧美| 国产欧美一区二区精品忘忧草 | 日韩欧美在线免费观看 | 免费a大片 | 91在线观看| av中文字幕在线观看 | 国产大片一区 | 欧美日韩精品中文字幕 | 成人黄色电影在线播放 | 成人国产精品免费观看视频 |