Makefile
all: server client
server:server.c
gcc -o $@ $^
client:client.c
gcc -o $@ $^
clean:
rm -rf server client
server.c
#include <sys/socket.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
int main(int argc,const char *argv[]){
//创建一个socket文件描述符
int sockfd=socket(AF_INET,SOCK_STREAM,0);
if(sockfd<0){
perror("socket err");
exit(0);
}
//绑定套接字的地址
struct sockaddr_in myaddr;
myaddr.sin_family=AF_INET;
//端口要从本地字节序转换为网络字节序
myaddr.sin_port=htons(8888);
#if 0
myaddr.sin_addr.s_addr=inet_addr("192.168.1.3");
#else
myaddr.sin_addr.s_addr=INADDR_ANY;
#endif
socklen_t addrlen=sizeof(myaddr);
//绑定ip
int ret=bind(sockfd,(struct sockaddr *)&myaddr,addrlen);
if(ret<0){
perror("bind err");
exit(0);
}
printf("bind success,wait connect\n");
//进入监听状态
if(listen(sockfd,5)<){
perror("listen err");
exit(0);
}
//接收客户端的连接
struct sockaddr_in cli_addr;
int clifd=accept(sockfd,(struct sockaddr *)&cli_addr,&addrlen);
if(clifd<0){
perror("accept err");
exit(0);
}
printf("new connect comming\n");
printf("client ip=%s,port=%d\n"\
inet_ntoa(cli_addr.sin_addr),ntohs(cli_addr.sin_port));
//打开文件,准备接收,文件名为new.txt
//如果文件不存在则创建,如果存在则清空
int fd=open("filename.txt",O_WRONLY|O_CREAT|O_TRUNC);
if(fd<0){
perror("open err");
exit(0);
}
int nbytes;
#define N 64
char buf[N]={0};
while(1){
nbytes=recv(clifd,buf,N,0);
if(nbytes>0)//读到数据
{
write(fd,buf,nbytes);
//清除缓冲区
bzero(buf,N);//等价于memset(buf,0,N);
}else if(nbytes==0)//对端退出
{
printf("file write ok\n");
break;
}else//出错
{
perror("recv err");
exit(0);
}
}
close(fd);
close(clifd);
close(sockfd);
return 0;
}
client.c
#include <sys/socket.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
int main(int argc,char const *argv[]){
if(argc<2){
perror("please input file name");
exit(0);
}
//创建一个文件描述符
int sockfd=socket(AF_INET,SOCK_STREAM,0);
if(sockfd<0){
perror("socket err");
exit(0);
}
//指定要连接的服务器地址
struct sockaddr_in server;
server.sin_family=AF_INET;
server.sin_port=htons(8888);
server.sin_addr.s_addr=inet_addr("192.168.1.3");
//连接服务器
socklen_t addrlen=sizeof(server);
if(connect(sockfd,(struct sockaddr *)&server,addrlen)<0){
perror("connect err");
exit(0);
}
//打开文件
int fd=open(argv[1],O_RDONLY);
if(fd<0){
perror("open err");
exit(0);
}
#define N 64
char buf[N]={0};
while(1){
//读取文件内容,发送到服务器
nbytes=read(fd,buf,N);
if(nbytes>0)//把实际读到的字符发送给服务器
{
send(sockfd,buf,nbytes,0);
}else if(nbytes==0)//代表读到文尾,传输结束
{
printf("file send success\n");
break;
}else{
perror("read err");
exit(0);
}
}
close(fd);
close(sockfd);
return 0;
}