socket网络编程实现文件从服务器端到客户端的传输

代码片段(1)

[代码] [C/C++]代码

001server.c
002  
003#include <sys/socket.h>
004#include <netinet/in.h>
005#include <netinet/ip.h>
006#include <unistd.h>
007#include <arpa/inet.h>
008#include <sys/types.h>
009#include <sys/wait.h>
010#include <sys/stat.h>
011#include <fcntl.h>
012#include <signal.h>
013#include <stdio.h>
014#include <stdlib.h>
015#include <string.h>
016#include <errno.h>
017void sigchid(int signum)
018{
019    waitpid(-1, NULL, 0);
020}
021  
022void exit_err(const char *s)
023{
024    perror(s);
025    exit(1);
026}
027  
028int main(void)
029{
030    signal(SIGCHLD, sigchid);
031  
032    int val, true = 1;
033    char buf1[128];
034    int open_fd, confd, read_count, write_count;
035    struct sockaddr_in sockaddr;
036    socklen_t addrlen;
037    sockaddr.sin_family = AF_INET;
038    sockaddr.sin_port = htons(10000);
039    sockaddr.sin_addr.s_addr = htonl(INADDR_ANY);
040  
041    int fd = socket(AF_INET, SOCK_STREAM, 0);
042    if (fd == -1)
043        exit_err("socket");
044  
045    int bin =
046        bind(fd, (struct sockaddr *) &sockaddr, sizeof(sockaddr));
047    if (bin == -1)
048        exit_err("bind");
049  
050    if (listen(fd, 5) == -1)
051        exit_err("listen");
052  
053  
054      while (1) {
055  
056    addrlen = sizeof(sockaddr);
057  
058    confd = accept(fd, (struct sockaddr *) &sockaddr, &addrlen);
059    if (-1 == confd) {
060        if (errno == EINTR) {
061            continue;
062        }
063        exit_err("accept");
064    }
065    pid_t pid = fork();
066    if(pid == -1)
067        exit_err("fork");
068    if(pid == 0){ /* child */
069  
070    while(1){   
071    open_fd = open("./txt", O_RDONLY);
072    while ((read_count = read(open_fd, buf1, sizeof(buf1))) > 0)
073  
074        while (read_count) {
075            write_count = write(confd, buf1, read_count);
076            if (write_count < 0) {
077                exit_err("write");
078            }
079            read_count -= write_count;
080        }
081    }
082    close(open_fd);
083    close(confd);
084    exit(0);
085    }
086    else { /* parent */
087        close(confd);
088    }
089    }
090    close(fd);
091  
092  
093client.c
094  
095#include <sys/socket.h>
096#include <netinet/in.h>
097#include <netinet/ip.h>
098#include <unistd.h>
099#include <arpa/inet.h>
100#include <sys/time.h>
101#include <sys/types.h>
102#include <sys/stat.h>
103#include <fcntl.h>
104#include <stdio.h>
105#include <stdlib.h>
106#include <string.h>
107#include <errno.h>
108  
109  
110void exit_err(const char *s)
111{
112    perror(s);
113    exit(1);
114}
115  
116int main(void)
117{
118    int i, retval, open_fd, w;
119    char buf[128], nebuf[128];
120    short port = 10000;
121    char *ipaddr = "127.0.0.1";
122    struct sockaddr_in sockaddr;
123    sockaddr.sin_family = AF_INET;
124    sockaddr.sin_port = htons(port);
125    sockaddr.sin_addr.s_addr = inet_addr(ipaddr);
126    socklen_t addrlen;
127  
128    int fd = socket(AF_INET, SOCK_STREAM, 0);
129    if (fd == -1)
130        exit_err("socket");
131  
132    addrlen = sizeof(sockaddr);
133    int sockcon = connect(fd, (struct sockaddr *) &sockaddr,
134                  sizeof(sockaddr));
135  
136    if (sockcon == -1)
137        exit_err("connect");
138  
139    while(1){
140    open_fd = open("./data", O_RDWR);
141    while ((retval = read(fd, nebuf, sizeof(nebuf))) > 0) {
142        while (retval > 0) {
143            w = write(open_fd, nebuf, retval);
144            if (-1 == retval)
145                exit_err("read");
146            retval -= w;
147        }
148    }
149    }
150    close(open_fd);
151  
152  
153    close(fd);
154}
155  
156  
157  
158    return 0;
159}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值