简单实现了个文件传输的程序
通过创建socket连接两台计算机,通过调用read,write系统调用来传递文件
客户机
#include <stdio.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <fcntl.h>
#include <netinet/in.h>
#include <stdlib.h> //standard library
int main(int argc,char * argv[])
{
//define
int socketfd,filefd;
int len,i=0;
char wbuff[20],rbuff[20];
char ip[20];
struct sockaddr_in address;
printf("Host ip:");
do
{
ip[i++]=getchar();
}while(ip[i-1]!='\n' && i<=20);
//create socket
socketfd = socket(AF_INET,SOCK_STREAM,0);
//name socket(tell client the server address)
address.sin_family = AF_INET;
if(ip[0]=='\n')
{
address.sin_addr.s_addr = inet_addr("192.168.1.115");
}
else
{
address.sin_addr.s_addr = inet_addr(ip);
}
address.sin_port = htons(9999);
len = sizeof(address);
//connect the server socket
if(connect(socketfd,(struct sockaddr *)&address,len)!=0)
{
perror("error");
exit(1);
}
//read or write
if(argc == 2)
{
printf("Transfer is starting!\n");
filefd = open(argv[1],O_RDONLY);
while(read(filefd,rbuff,50) == 50)
{
write(socketfd,rbuff,50);
}
printf("Transfer is complete\n");
close(filefd);
}
else
{
printf("Path error");
exit(1);
}
close(socketfd);
exit(0);
}
会将接收到的文件统一命名为a1
#include <unistd.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <fcntl.h>
//Need log model
int main(int argc ,char * argv[])
{
int server_len,client_len;
int serverfd, clientfd,filefd;
char rbuff[50];
struct sockaddr_in server_addr,client_addr;
serverfd = socket(AF_INET,SOCK_STREAM,0);
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(9999);
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
server_len = sizeof(server_addr);
if(bind(serverfd,(struct sockaddr *)&server_addr,server_len)==-1)
{
perror("Bind error");
exit(1);
}
if(listen(serverfd,5)==-1)
{
perror("Listen error");
exit(1);
}
while(1)
{
client_len = sizeof(client_addr);
//until the client connect
clientfd = accept(serverfd,(struct sockaddr *)&client_addr,&client_len);
filefd = open("a1",O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR);
//read return the byte of one read
//read return 0 means the end
while(read(clientfd,rbuff,50)==50)
{
write(filefd,rbuff,50);
}
close(filefd);
close(clientfd);
}
}