📄 client.c
字号:
#include<stdlib.h>
#include<stdio.h>
#include<errno.h>
#include<string.h>
#include<netdb.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#define SERVER_PORT 6667
#define BUFFER_SIZE 1024
#define FILE_NAME_MAX_SIZE 512
//void ClienToServer(int ,char**);
void SendRequest(char**argv)
{
//设置一个socket地址结构client_addr,代表客户机internet地址, 端口
struct sockaddr_in client_addr;
//把一段内存区的内容全部设置为0
bzero(&client_addr,sizeof(client_addr));
//internet协议族
client_addr.sin_family = AF_INET;
//INADDR_ANY表示自动获取本机地址
client_addr.sin_addr.s_addr = htons(INADDR_ANY);
//0表示让系统自动分配一个空闲端口
client_addr.sin_port = htons(0);
//创建用于internet的流协议(TCP)socket,用client_socket代表客户机socket
int client_socket = socket(AF_INET,SOCK_STREAM,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;
//服务器的IP地址来自程序的参数
if(inet_aton(argv[1],&server_addr.sin_addr)==0)
{
printf("Server IP address error!\n");
exit(1);
}
server_addr.sin_port = htons(SERVER_PORT);
socklen_t server_addr_length = sizeof(server_addr);
//向服务器发起连接,连接成功后client_socket代表了客户机和服务器的一个socket连接
if(connect(client_socket,(struct sockaddr*)&server_addr,server_addr_length)<0)
{
printf("Connect %s failed!\n",argv[1]);
exit(1);
}
char file_name[FILE_NAME_MAX_SIZE+1];
bzero(file_name,FILE_NAME_MAX_SIZE+1);
printf("Please enter the file name you want to open:\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);
FILE * fp = fopen(file_name,"w");
//从服务器接收数据到buffer中
bzero(buffer,BUFFER_SIZE);
int length = 0;
int write_length=0;
while(length=recv(client_socket,buffer,BUFFER_SIZE,0))
{
if(length<0)
{
printf("Receive data from %s failed!\n",argv[1]);
break;
}
write_length = fwrite(buffer,sizeof(char),length,fp);
if(write_length<length)
{
printf("File %s write failed!\n",file_name);
break;
}
bzero(buffer,BUFFER_SIZE);
}
if(write_length<=0)
{
printf("File %s dosen't exist!\n",file_name);
exit(1);
}
else{
printf("Receive file %s from Server[%s] finished ! The content lists as follows: \n",file_name,argv[1]);
fclose(fp);
FILE * fo = fopen(file_name,"r");
char ch=fgetc(fo);
while(ch!=EOF)
{
printf("%c",ch);
ch=fgetc(fo);
}
fclose(fo);
}
//关闭socket
close(client_socket);
//return 0;
}
int main(int argc,char**argv)
{
if(argc !=2)
{
//printf("请使用类似这样的命令: %s ServerIPAddress\n",argv[0]);
printf("Please enter command like this: %s ServerIPAddress\n",argv[0]);
exit(1);
}
int i=0;
for(i;i<1000;i++)
SendRequest(argv);
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -