当前位置:首页 > 使用socket的Linux上的C语言文件传输顺序服务器和客户端示例程序
使用socket的Linux上的C语言文件传输顺序服务器和客户端示例程序 服务器端程序的编译
gcc -o file_server file_server.c 客户端程序的编译
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
#include
#define HELLO_WORLD_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;
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(\ exit(1); }
//把socket和socket地址结构联系起来
if( bind(server_socket,(struct sockaddr*)&server_addr,sizeof(server_addr))) {
printf(\ exit(1); }
//server_socket用于监听
if ( listen(server_socket, LENGTH_OF_LISTEN_QUEUE) ) {
printf(\ exit(1); }
while (1) //服务器端要一直运行 {
//定义客户端的socket地址结构client_addr struct 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_addr中 int new_server_socket = accept(server_socket,(struct sockaddr*)&client_addr,&length); if ( new_server_socket < 0) {
printf(\ break; }
char buffer[BUFFER_SIZE]; bzero(buffer, BUFFER_SIZE);
length = recv(new_server_socket,buffer,BUFFER_SIZE,0); if (length < 0) {
printf(\ 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,\ if(NULL == fp ) {
printf(\ } 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(\
//发送buffer中的字符串到new_server_socket,实际是给客户端 if(send(new_server_socket,buffer,file_block_length,0)<0) {
printf(\ break; }
bzero(buffer, BUFFER_SIZE); }
// close(fp); fclose(fp);
printf(\ }
//关闭与客户端的连接 close(new_server_socket); }
//关闭监听用的socket
close(server_socket); return 0; }
////////////////////////////////////////////////////////////////////////////////////// // file_client.c 文件传输客户端程序示例
////////////////////////////////////////////////////////////////////////////////////// //本文件是客户机的代码
#include
#include
#define HELLO_WORLD_SERVER_PORT 6666 #define BUFFER_SIZE 1024
#define FILE_NAME_MAX_SIZE 512
int main(int argc, char **argv) {
if (argc != 2) {
printf(\ 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_STREAM,0); if( client_socket < 0) {
共分享92篇相关文档