?? cli.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 HELLO_WORLD_SERVER_PORT 6666#define BUFFER_SIZE 1024#define FILE_NAME_MAX_SIZE 512int main(int argc, char **argv){ if (argc != 2) { printf("Usage: ./%s ServerIPAddress\n",argv[0]); exit(1); } //設(shè)置一個socket地址結(jié)構(gòu)client_addr,代表客戶機(jī)internet地址, 端口 struct sockaddr_in client_addr; bzero(&client_addr,sizeof(client_addr)); //把一段內(nèi)存區(qū)的內(nèi)容全部設(shè)置為0 client_addr.sin_family = AF_INET; //internet協(xié)議族 client_addr.sin_addr.s_addr = htons(INADDR_ANY);//INADDR_ANY表示自動獲取本機(jī)地址 client_addr.sin_port = htons(0); //0表示讓系統(tǒng)自動分配一個空閑端口 //創(chuàng)建用于internet的流協(xié)議(TCP)socket,用client_socket代表客戶機(jī)socket int client_socket = socket(AF_INET,SOCK_STREAM,0); if( client_socket < 0) { printf("Create Socket Failed!\n"); exit(1); } //把客戶機(jī)的socket和客戶機(jī)的socket地址結(jié)構(gòu)聯(lián)系起來 if( bind(client_socket,(struct sockaddr*)&client_addr,sizeof(client_addr))) { printf("Client Bind Port Failed!\n"); exit(1); } //設(shè)置一個socket地址結(jié)構(gòu)server_addr,代表服務(wù)器的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) //服務(wù)器的IP地址來自程序的參數(shù) { printf("Server IP Address Error!\n"); exit(1); } server_addr.sin_port = htons(HELLO_WORLD_SERVER_PORT); socklen_t server_addr_length = sizeof(server_addr); //向服務(wù)器發(fā)起連接,連接成功后client_socket代表了客戶機(jī)和服務(wù)器的一個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)); //向服務(wù)器發(fā)送buffer中的數(shù)據(jù) send(client_socket,buffer,BUFFER_SIZE,0);// int fp = open(file_name, O_WRONLY|O_CREAT);// if( fp < 0 ) FILE * fp = fopen(file_name,"w"); if(NULL == fp ) { printf("File:\t%s Can Not Open To Write\n", file_name); exit(1); } //從服務(wù)器接收數(shù)據(jù)到buffer中 bzero(buffer,BUFFER_SIZE); int length = 0; while( length = recv(client_socket,buffer,BUFFER_SIZE,0)) { 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); //關(guān)閉socket close(client_socket); return 0;}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -