- 论坛徽章:
- 0
|
//////////////////////////////////////////////////////////////////////////////////////
// file_client.c 文件传输客户端程序示例
//////////////////////////////////////////////////////////////////////////////////////
//本文件是客户机的代码
#include <netinet/in.h> // for sockaddr_in
#include <sys/types.h> // for socket
#include <sys/socket.h> // for socket
#include <stdio.h> // for printf
#include <stdlib.h> // for exit
#include <string.h> // for bzero
/*
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
*/
#define SERVER_PORT 6666
#define BUFFER_SIZE 1024
#define FILE_NAME_MAX_SIZE 512
int main(int argc, char **argv)
{
if (argc != 2)
{
printf("Usage: ./%s ServerIPAddress\n",argv[0]);
exit(1);
}
//设置一个socket地址结构client_addr,代表客户机internet地址, 端口
struct sockaddr_in client_addr;
bzero(&client_addr,sizeof(client_addr)); //把一段内存区的内容全部设置为0
client_addr.sin_family = AF_INET; //internet协议族
client_addr.sin_addr.s_addr = htons(INADDR_ANY);//INADDR_ANY表示自动获取本机地址
client_addr.sin_port = htons(0); //0表示让系统自动分配一个空闲端口
//创建用于internet的UDP socket,用client_socket代表客户机socket
int client_socket = socket(AF_INET,SOCK_DGRAM,0);
if( client_socket < 0)
{
printf("Create Socket Failed!\n");
exit(1);
}
//把客户机的socket和客户机的socket地址结构联系起来
if( bind(client_socket,(struct sockaddr*)&client_addr,sizeof(client_addr)))
{
printf("Client Bind Port Failed!\n");
exit(1);
}
//设置一个socket地址结构server_addr,代表服务器的internet地址, 端口
struct sockaddr_in server_addr;
bzero(&server_addr,sizeof(server_addr));
server_addr.sin_family = AF_INET;
if(inet_aton(argv[1],&server_addr.sin_addr) == 0) //服务器的IP地址来自程序的参数
{
printf("Server IP Address Error!\n");
exit(1);
}
server_addr.sin_port = htons(SERVER_PORT);
socklen_t server_addr_length = sizeof(server_addr);
/* UDP without connect
//向服务器发起连接,连接成功后client_socket代表了客户机和服务器的一个socket连接
if(connect(client_socket,(struct sockaddr*)&server_addr, server_addr_length) < 0)
{
printf("Can Not Connect To %s!\n",argv[1]);
exit(1);
}
*/
char file_name[FILE_NAME_MAX_SIZE+1];
bzero(file_name, FILE_NAME_MAX_SIZE+1);
printf("Please Input File Name On Server:\t");
scanf("%s", file_name);
char buffer[BUFFER_SIZE];
bzero(buffer,BUFFER_SIZE);
strncpy(buffer, file_name, strlen(file_name)>BUFFER_SIZE?BUFFER_SIZE:strlen(file_name));
//向服务器发送buffer中的数据
//send(client_socket,buffer,BUFFER_SIZE,0);
sendto(client_socket,buffer,BUFFER_SIZE,0,
(struct sockaddr*)&server_addr,sizeof(struct sockaddr));
// int fp = open(file_name+"_get", O_WRONLY|O_CREAT);
// if( fp < 0 )
char str_file_name[BUFFER_SIZE+4];
strcpy(str_file_name,file_name);
strcat(str_file_name,"_get");
FILE * fp = fopen(str_file_name,"w");
if(NULL == fp )
{
printf("File:\t%s Can Not Open To Write\n", file_name);
exit(1);
}
//从服务器接收数据到buffer中
bzero(buffer,BUFFER_SIZE);
int length = 0;
while( length = recvfrom(client_socket,buffer,BUFFER_SIZE,0,
(struct sockaddr*)&server_addr,(int *)sizeof(struct sockaddr)))
{
printf("server_addr.sin_addr:%s\n"
,inet_ntoa(server_addr.sin_addr.s_addr));
printf("%d\n",length);
if(length < 0)
{
printf("Recieve Data From Server %s Failed!\n", argv[1]);
break;
}
// int write_length = write(fp, buffer,length);
int write_length = fwrite(buffer,sizeof(char),length,fp);
if (write_length <length)
{
printf("File:\t%s Write Failed\n", file_name);
break;
}
bzero(buffer,BUFFER_SIZE);
}
printf("Recieve File:\t %s From Server[%s] Finished\n",file_name, argv[1]);
close(fp);
//关闭socket
close(client_socket);
return 0;
}
//////////////////////////////////////////////////////////////////////////////////////
// file_server.c 文件传输顺序服务器示例
//////////////////////////////////////////////////////////////////////////////////////
//本文件是服务器的代码
#include <netinet/in.h> // for sockaddr_in
#include <sys/types.h> // for socket
#include <sys/socket.h> // for socket
#include <stdio.h> // for printf
#include <stdlib.h> // for exit
#include <string.h> // for bzero
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#define SERVER_PORT 6666
#define LENGTH_OF_LISTEN_QUEUE 20
#define BUFFER_SIZE 1024
#define FILE_NAME_MAX_SIZE 512
int main(int argc, char **argv)
{
//设置一个socket地址结构server_addr,代表服务器internet地址, 端口
struct sockaddr_in server_addr, client_addr;
bzero(&server_addr,sizeof(server_addr)); //把一段内存区的内容全部设置为0
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htons(INADDR_ANY);
server_addr.sin_port = htons(SERVER_PORT);
//create socket
int server_socket = socket(AF_INET,SOCK_DGRAM,0);
if( server_socket < 0)
{
printf("Create Socket Failed!");
exit(1);
}
//bind local server port
if( bind(server_socket,(struct sockaddr*)&server_addr,sizeof(server_addr)))
{
printf("Server Bind Port : %d Failed!", SERVER_PORT);
exit(1);
}
printf("waiting for data on port UDP:%u\n", SERVER_PORT);
// 接收客户端发送过来的文件名,在当前目录下找
char buffer[FILE_NAME_MAX_SIZE];
bzero(buffer,FILE_NAME_MAX_SIZE);
char *msg = buffer;
int clientLen = sizeof(client_addr);
int n;
//start server
while(n = recvfrom(server_socket, msg, FILE_NAME_MAX_SIZE, 0, (struct sockaddr*)&client_addr, &clientLen))
{
if(n < 0)
{
printf("Cannot receive data!");
}
else if(n=0)
break;
printf("Get file name:%s\n",msg);
// define buffer
char wbuffer[BUFFER_SIZE];
bzero(wbuffer, BUFFER_SIZE);
int len = 0;
int fd;
fd = open(msg,O_RDONLY);
if(fd <0)
{
printf("File Not Found\n");
exit(1);
}
else
{
while((len = (int)read(fd,wbuffer,BUFFER_SIZE*sizeof(char))) > 0)
{
printf("%d\n",(long)BUFFER_SIZE*sizeof(char));
printf("%d\n",(long)len);
printf("%s\n",wbuffer);
if(sendto(server_socket,wbuffer,len,0,(struct sockaddr*)&client_addr, sizeof(client_addr)) < 0)
{
printf("error");
break;
}
bzero(wbuffer, BUFFER_SIZE);
if((long)len <(long)(BUFFER_SIZE*sizeof(char)))
{
printf("sent over\n");
break;
}
}
close(fd);
}
}
close(server_socket);
}
如题。。。高人指点 |
|