1. [代码]c代码server部分跳至[1][2][3][全屏预览] ?1 2 3 4 5 6 7 8 910111213141516171819202122232425262728293031323334353637383940 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 HELLO_WORLD_SERVER_PORT 6666#define LENGTH_OF_LISTEN_QUEUE 20#define BUFFER_SIZE 1024#define FILE_NAME_MAX_SIZE 512int main(int argc, char **argv){//设置一个socket地址结构server_addr,代表服务器internet地址, 端口struct sockaddr_in server_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(HELLO_WORLD_SERVER_PORT);//创建用于internet的流协议(TCP)socket,用server_socket代表服务器socket int server_socket = socket(PF_INET,SOCK_STREAM,0);if( server_socket < 0){printf("Create Socket Failed!");exit(1);}{int opt =1;setsockopt(server_socket,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));4142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 }//把socket和socket地址结构联系起来if( bind(server_socket,(struct sockaddr*)&server_addr,sizeof(server_addr))) {printf("Server Bind Port : %d Failed!", HELLO_WORLD_SERVER_PORT);exit(1);}//server_socket用于监听if ( listen(server_socket, LENGTH_OF_LISTEN_QUEUE) ){printf("Server Listen Failed!");exit(1);}while (1) //服务器端要一直运行{//定义客户端的socket地址结构client_addrstruct sockaddr_in client_addr;socklen_t length = sizeof(client_addr);//接受一个到server_socket代表的socket的一个连接//如果没有连接请求,就等待到有连接请求--这是accept函数的特性//accept函数返回一个新的socket,这个socket(new_server_socket)用于同连接 //new_server_socket代表了服务器和客户端之间的一个通信通道//accept函数把连接到的客户端信息填写到客户端的socket地址结构client_ad int new_server_socket = accept(server_socket,(struct sockaddr*)&client_ if ( new_server_socket < 0){printf("Server Accept Failed!\n");break;}char buffer[BUFFER_SIZE];bzero(buffer, BUFFER_SIZE);length = recv(new_server_socket,buffer,BUFFER_SIZE,0);if (length < 0){printf("Server Recieve Data Failed!\n");break;}char file_name[FILE_NAME_MAX_SIZE+1];bzero(file_name, FILE_NAME_MAX_SIZE+1);strncpy(file_name, buffer,858687888990919293949596979899 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 strlen(buffer)>FILE_NAME_MAX_SIZE?FILE_NAME_MAX_SIZE:strlen(buffer));// int fp = open(file_name, O_RDONLY);// if( fp < 0 )printf("%s\n",file_name);FILE * fp = fopen(file_name,"r");if(NULL == fp ){printf("File:\t%s Not Found\n", file_name);}else{bzero(buffer, BUFFER_SIZE);int file_block_length = 0;// while( (file_block_length = read(fp,buffer,BUFFER_SIZE))>0)while( (file_block_length = fread(buffer,sizeof(char),BUFFER_SIZE,f {printf("file_block_length = %d\n",file_block_length);//发送buffer中的字符串到new_server_socket,实际是给客户端if(send(new_server_socket,buffer,file_block_length,0)<0){printf("Send File:\t%s Failed\n", file_name);break;}bzero(buffer, BUFFER_SIZE);}// close(fp);fclose(fp);printf("File:\t%s Transfer Finished\n",file_name);}//关闭与客户端的连接close(new_server_socket);}//关闭监听用的socketclose(server_socket);return 0;}2. [代码]c代码client部分?1 2 3 4 client.c#include <netinet/in.h> // for sockaddr_in #include <sys/types.h> // for socket5 6 7 8 9101112131415161718192021222324252627282930313233343536373839404142434445464748 #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);}//设置一个socket地址结构client_addr,代表客户机internet地址, 端口struct sockaddr_in client_addr;bzero(&client_addr,sizeof(client_addr)); //把一段内存区的内容全部设置为0client_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的流协议(TCP)socket,用client_socket代表客户机socketint 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地址, 端口4950515253545556575859606162636465666768697071727374757677787980818283848586878889909192 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(HELLO_WORLD_SERVER_PORT);socklen_t server_addr_length = sizeof(server_addr);//向服务器发起连接,连接成功后client_socket代表了客户机和服务器的一个socket if(connect(client_socket,(struct sockaddr*)&server_addr, server_addr_length) {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);// 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);}//从服务器接收数据到buffer中bzero(buffer,BUFFER_SIZE);int length = 0;while( length = recv(client_socket,buffer,BUFFER_SIZE,0)){93949596979899 100 101 102 103 104 105 106 107 108 109 110 111 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);//关闭socketclose(client_socket);return 0;}3. [代码]open等,fopen等说明?1 2 3 4 5 6 7 8 910111213141516171819 某些注释部分,open,read,write被 fopen,fread,fwrite替换。