ouyixi 2018-12-29 19:45 采纳率: 66.7%
浏览 426

Linux 网络编程 实现不了服务端循环发送,客户端循环接收

客户端和服务端建立连接之后,客户端向服务端发送一个文件的路径。
服务端通过文件路径打开这个文件,每次读取文件内容发送给客户端,
实现文件的拷贝。

服务端的程序

#include<stdio.h>
#include<stdlib.h>
#include<netdb.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<dirent.h>
#include<string.h>
#define PORT 1234
#define BACKLOG 1
void send_file();
int num=0;
int listenfd,connectfd;
struct sockaddr_in server;
struct sockaddr_in client;
socklen_t addrlen;
int main(int argc,char *argv[])
{
if((listenfd=socket(PF_INET,SOCK_STREAM,0))==-1)
{
perror("socket() error");
exit(1);
}
int opt=SO_REUSEADDR;
setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));
bzero(&server,sizeof(server));
server.sin_family=PF_INET;
server.sin_port=PORT;
server.sin_addr.s_addr=htonl(INADDR_ANY);
if(bind(listenfd,(struct sockaddr *)&server,sizeof(server))==-1)
{
perror("bind error");
exit(1);
}
if(listen(listenfd,BACKLOG)==-1)
{
perror("listen error");
exit(1);
}
addrlen=sizeof(client);
if((connectfd=accept(listenfd,(struct sockaddr *)&client,&addrlen))==-1)
{
perror("accept error");
exit(1);
}
printf("client's ip is %s,port is %d\n",inet_ntoa(client.sin_addr),htons(client.sin_port));
char file_name[256];
memset(file_name,'\0',sizeof(file_name));
num=recv(connectfd,file_name,255,0);
if(num==-1){
perror("recv() errror!");
exit(1);
}
puts(file_name);
send_file(file_name);
close(listenfd);
close(connectfd);
}
void send_file(char file_name[])   //读取文件内容循环发送
{   int fd,read_num,write_num,src;
    char buf[1024];
    memset(buf,'\0',sizeof(buf));
     src=open(file_name,O_WRONLY,0644);
     if(src<0){
    perror("open failure");
          exit(0);
    }
    while((read_num=read(src,buf,50))>0)
      {
        send(connectfd,buf,sizeof(buf),0);
      }
}

客户端的程序

#include<stdio.h>
#include<stdlib.h>
#include<netdb.h>
#include<string.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<arpa/inet.h>
#include<unistd.h>
#define PORT 1234;
#define MASDATASIZE 100
int main(int argc,char *argv[])
{
int sockfd,num;
char buf[MASDATASIZE];
char file[256];
struct sockaddr_in server;
if(argc!=2){
printf("Usage:%s <IP ADDRESS>\n",argv[0]);
exit(1);
}
if((sockfd=socket(PF_INET,SOCK_STREAM,0))==-1){
perror("socket() errror!");
exit(1);
}
bzero(&server,sizeof(server));
server.sin_family=PF_INET;
server.sin_port=PORT;
inet_aton(argv[1],&(server.sin_addr));
if(connect(sockfd,(struct sockaddr *)&server,sizeof(server))==-1)
{
perror("connect () errror");
exit(1);
}
strcpy(file,"/home/june/a.txt");   //填写的路径名
send(sockfd,file,sizeof(file),0);
do{
if((num=recv(sockfd,buf,MASDATASIZE,0))==-1){
perror("recv() errror!");
exit(1);
}
printf("%d\n",num);
//puts(buf);    想通过puts看看有没有接收成功      
}while(num>0);
printf("server message len: %d :%s\n",num,buf);
close(sockfd);
return 0;
}

在同一台机器上进行测试的
现在碰到的问题是实现不了服务端循环发送文件内容,客户端循环接收文件内容,错误提示Connection reset by peer图片说明

  • 写回答

0条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥30 这是哪个作者做的宝宝起名网站
    • ¥60 版本过低apk如何修改可以兼容新的安卓系统
    • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
    • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
    • ¥50 有数据,怎么用matlab求全要素生产率
    • ¥15 TI的insta-spin例程
    • ¥15 完成下列问题完成下列问题
    • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
    • ¥15 YoloV5 第三方库的版本对照问题
    • ¥15 请完成下列相关问题!