要下班了,時間急,不寫程式碼了先給你一個思路
1 實現最簡單的udp socket 模型,實現傳送一個字串。
2 實現一個簡單的開啟檔案,讀取檔案的例子,如用fgets(),類似的函式有很多,然後再把讀取的檔案內容忘另一個檔案裡寫(相關函式fopen(),write(),read())。
3 把上面兩個函式結合到一起,在客戶端實現開啟要傳送的檔案,按一定的大小讀取,讀取後呼叫sendto()傳送到伺服器端。在伺服器端建立一個檔案,然後呼叫recvfrom()接受客戶端傳送過來的資料,向來是建立的那個檔案中寫。 下面是改好的udp傳送檔案的例子。伺服器端程式的編譯gcc -o file_server file_server客戶端程式的編譯gcc -o file_client file_client.c伺服器程式和客戶端程應當分別執行在2臺計算機上.伺服器端程式的執行,在一個計算機的終端執行./file_server客戶端程式的執行,在另一個計算機的終端中執行./file_client 執行伺服器程式的計算機的IP地址根據提示輸入要傳輸的伺服器上的檔案,該檔案在伺服器的執行目錄上在實際程式設計和測試中,可以用2個終端代替2個計算機,這樣就可以在一臺計算機上測試網路程式,伺服器端程式的執行,在一個終端執行./file_server客戶端程式的執行,在另一個終端中執行./file_client 127.0.0.1說明: 任何計算機都可以透過127.0.0.1訪問自己. 也可以用計算機的實際IP地址代替127.0.0.1//////////////////////////////////////////////////////////////////////////////////////// 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 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, pcliaddr; 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的據報套接字(UDPt,用server_socket代表伺服器socket // 建立資料報套接字(UDP) int server_socket = socket(PF_INET,SOCK_DGRAM,0); if( server_socket < 0) { printf("Create Socket Failed!"); exit(1); } //把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); } while (1) //伺服器端要一直執行 { //定義客戶端的socket地址結構client_addr struct sockaddr_in client_addr; socklen_t n = sizeof(client_addr) ; int length; char buffer[BUFFER_SIZE]; bzero(buffer, BUFFER_SIZE); length = recvfrom(new_server_socket,buffer,BUFFER_SIZE,0,&pcliaddr,&n); 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, strlen(buffer)>FILE_NAME_MAX_SIZE?FILE_NAME_MAX_SIZE:strlen(buffer));// int fp = open(file_name, O_RDONLY);// if( fp < 0 ) 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,fp))>0) { 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); } }}//////////////////////////////////////////////////////////////////////////////////////// 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 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)); //把一段記憶體區的內容全部設定為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的流協議(TCP)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地址結構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(HELLO_WORLD_SERVER_PORT); socklen_t server_addr_length = sizeof(server_addr); 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中的資料 socklen_t n = sizeof(server_addr) ; sendto(client_socket,buffer,BUFFER_SIZE,0,(struct sockaddr*)&server_addr,n);// 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)) { 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]); return 0;}
要下班了,時間急,不寫程式碼了先給你一個思路
1 實現最簡單的udp socket 模型,實現傳送一個字串。
2 實現一個簡單的開啟檔案,讀取檔案的例子,如用fgets(),類似的函式有很多,然後再把讀取的檔案內容忘另一個檔案裡寫(相關函式fopen(),write(),read())。
3 把上面兩個函式結合到一起,在客戶端實現開啟要傳送的檔案,按一定的大小讀取,讀取後呼叫sendto()傳送到伺服器端。在伺服器端建立一個檔案,然後呼叫recvfrom()接受客戶端傳送過來的資料,向來是建立的那個檔案中寫。 下面是改好的udp傳送檔案的例子。伺服器端程式的編譯gcc -o file_server file_server客戶端程式的編譯gcc -o file_client file_client.c伺服器程式和客戶端程應當分別執行在2臺計算機上.伺服器端程式的執行,在一個計算機的終端執行./file_server客戶端程式的執行,在另一個計算機的終端中執行./file_client 執行伺服器程式的計算機的IP地址根據提示輸入要傳輸的伺服器上的檔案,該檔案在伺服器的執行目錄上在實際程式設計和測試中,可以用2個終端代替2個計算機,這樣就可以在一臺計算機上測試網路程式,伺服器端程式的執行,在一個終端執行./file_server客戶端程式的執行,在另一個終端中執行./file_client 127.0.0.1說明: 任何計算機都可以透過127.0.0.1訪問自己. 也可以用計算機的實際IP地址代替127.0.0.1//////////////////////////////////////////////////////////////////////////////////////// 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 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, pcliaddr; 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的據報套接字(UDPt,用server_socket代表伺服器socket // 建立資料報套接字(UDP) int server_socket = socket(PF_INET,SOCK_DGRAM,0); if( server_socket < 0) { printf("Create Socket Failed!"); exit(1); } //把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); } while (1) //伺服器端要一直執行 { //定義客戶端的socket地址結構client_addr struct sockaddr_in client_addr; socklen_t n = sizeof(client_addr) ; int length; char buffer[BUFFER_SIZE]; bzero(buffer, BUFFER_SIZE); length = recvfrom(new_server_socket,buffer,BUFFER_SIZE,0,&pcliaddr,&n); 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, strlen(buffer)>FILE_NAME_MAX_SIZE?FILE_NAME_MAX_SIZE:strlen(buffer));// int fp = open(file_name, O_RDONLY);// if( fp < 0 ) 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,fp))>0) { 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); } }}//////////////////////////////////////////////////////////////////////////////////////// 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 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)); //把一段記憶體區的內容全部設定為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的流協議(TCP)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地址結構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(HELLO_WORLD_SERVER_PORT); socklen_t server_addr_length = sizeof(server_addr); 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中的資料 socklen_t n = sizeof(server_addr) ; sendto(client_socket,buffer,BUFFER_SIZE,0,(struct sockaddr*)&server_addr,n);// 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)) { 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]); return 0;}