移动IP | client/server实现文件的传输
题目:在server程序中,将接收到的字符串保存到指定文件
/*server.c*/
#include<sys/socket.h>
#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include<memory.h>
#include<sys/mman.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<string.h>
#definePORT 1234
#defineMAX_QUE 5
#defineBUF_SIZE 1024
intmain(int argc,char *argv[])
{
structsockaddr_in local_sockaddr;
intsocketfd;//本地socket套接字描述符
intclientfd;//客户端链接描述符
intrecvbytes;//收到的字节数
FILE*fp;//文件打开描述符
size_tfsize;//写入内容的大小
charbuf[BUF_SIZE];
if(argc!=2)
{
printf("参数错误!正确格式:./serverfilename/n");
exit(1);
}
if((socketfd=socket(AF_INET,SOCK_STREAM,0))<0)//建立socket连接
{
perror("socket");
exit(1);
}
printf("Socketid = %d/n",socketfd);
local_sockaddr.sin_family= AF_INET;
local_sockaddr.sin_port = htons(PORT);
local_sockaddr.sin_addr.s_addr= htonl(INADDR_ANY);
printf("serverip =%s/n",inet_ntoa(local_sockaddr.sin_addr));//输出服务器ip地址
memset(local_sockaddr.sin_zero,0,8);
inti;
setsockopt(socketfd,SOL_SOCKET,SO_REUSEADDR,&;i,sizeof(i));//允许重复使用本地的地址与套接字进行绑定
if(bind(socketfd,(structsockaddr *)&;local_sockaddr,sizeof(structsockaddr))<0)//绑定函数bind()
{
perror("bind");
exit(1);
}
printf("Bindsuccess!/n");
if(listen(socketfd,MAX_QUE)<0)//利用listen()设置被动监听
{
perror("listen");
exit(1);
}
printf("Listening>>>>>>>>>>>>>>>>>>>>>>>>>>>>/n");
if((clientfd=accept(socketfd,(structsockaddr*)NULL,NULL))<0)//调用accept()函数,等待客户端的链接
{
perror("accept");
exit(1);
}
printf("connectclient success/n");
structsockaddr_in client;
charclient_ip[20];
socklen_tclient_len = sizeof(client);
getpeername(clientfd,(struct sockaddr *)&;client, &;client_len);
inet_ntop(AF_INET,&;client.sin_addr, client_ip, sizeof(client_ip));
printf("clientip:%s/tport:%d/n", client_ip, ntohs(client.sin_port));
memset(buf,0,sizeof(buf));//初始化缓冲区
if((recvbytes= recv(clientfd,buf,BUF_SIZE,0))<0)
{
perror("recv");
exit(1);
}
printf("Receivemessages fromip:%s/tport:%d/n%s/n",client_ip,ntohs(client.sin_port),buf);
if(strcmp(buf,"")==0)
{
printf("Receiveno message!There is no message to write to %s/n",argv[1]);
exit(1);
}
fp=fopen(argv[1],"w+");
if(fp==NULL)
{
perror("fopen");
exit(1);
}
if((fsize=fwrite(&;buf,sizeof(buf),1,fp))<0)
{
perror("fwrite");
exit(1);
}
printf("writeto %s success!/n",argv[1]);
fclose(fp);
close(clientfd);//关闭client链接
close(socketfd);//关闭socket连接
}
/*client.c*/
#include<sys/socket.h>
#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include<memory.h>
#include<sys/mman.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<string.h>
#definePORT 1234
#defineBUF_SIZE 1024
intmain(int argc,char *argv[])
{
intsocketfd;//客户端socket套接字描述符
FILE*fp;//文件打开描述符
intlen;
size_tfsize;//读到的内容大小
structsockaddr_in serv_addr;//服务器地址结构体
char serv_ip[20], clie_ip[20];
char buf[BUF_SIZE];
int sendbytes;//发送字节数
if(argc!=3)
{
printf("参数错误!正确格式:./clientserverip filename/n");
exit(1);
}
if((socketfd=socket(AF_INET,SOCK_STREAM,0))<0)//建立socket连接
{
perror("socket");
exit(1);
}
printf("Socketid = %d/n",socketfd);
memset(buf,0,sizeof(buf));
serv_addr.sin_family= AF_INET;
serv_addr.sin_port= htons(PORT);
inet_aton(argv[1],&;serv_addr.sin_addr);
memset(serv_addr.sin_zero,0,8);
if(connect(socketfd,(struct sockaddr*)&;serv_addr, sizeof(struct sockaddr))< 0)//调用connect()函数连接服务器
{
printf("cannot connect to %s, exit!/n", argv[1]);
printf("%s/n",strerror(errno));
exit(1);
}
else
printf("connectto %s success!/n",argv[1]);
fp=fopen(argv[2],"r+");
if(fp==NULL)
{
perror("fopen");
exit(1);
}
fseek(fp,0L, SEEK_END);
len= ftell(fp);
rewind(fp);
if((fsize=fread(&;buf,len,1,fp))<0)
{
perror("fread");
exit(1);
}
structsockaddr_in serv;
socklen_tserv_len = sizeof(serv);
getpeername(socketfd,(struct sockaddr*)&;serv, &;serv_len);
inet_ntop(AF_INET,&;serv.sin_addr, serv_ip, sizeof(serv_ip));
printf("serverip:%s/tport:%d/n", serv_ip, ntohs(serv.sin_port));
if((sendbytes=send(socketfd,buf,sizeof(buf),0))<0)
{
perror("send");
exit(1);
}
fclose(fp);
close(socketfd);//关闭socket连接
return0;
}
程序参考:https://www.aliyun.com/jiaocheng/194057.html
在ubuntu14.04系统下的编译
步骤一
分别建立两个文件夹
传送的是file.txt文件
文件内容是:helloliunx!
步骤二:编译
使用linux下的gcc编译工具
步骤三 查询ip
使用inet地址:127.0.0.1
本地子网IP
步骤四:运行
先运行server,等待连接、监听
在运行client,连接server,传送消息给server,
server成功连接,接收到client的文本信息。
再次打开server文件,可以看到file.txt文件,里面是”hellolinux!”一行文字。