Chinaunix首页 | 论坛 | 博客
  • 博客访问: 360942
  • 博文数量: 166
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 10
  • 用 户 组: 普通用户
  • 注册时间: 2013-03-21 17:29
文章分类

全部博文(166)

文章存档

2015年(60)

2014年(99)

2013年(7)

我的朋友

分类: LINUX

2015-04-28 15:08:54

本文转自 
感谢这位大神,在我不懂但又急需用到socket编程的时候给出这样一个模板!

server端:

点击(此处)折叠或打开

  1. server.c
  2.  
  3. ====================================================================
  4.  
  5. #include <netinet/in.h> // for sockaddr_in
  6. #include <sys/types.h> // for socket
  7. #include <sys/socket.h> // for socket
  8. #include <stdio.h> // for printf
  9. #include <stdlib.h> // for exit
  10. #include <string.h> // for bzero
  11. /*
  12. #include <sys/types.h>
  13. #include <sys/stat.h>
  14. #include <fcntl.h>
  15. #include <unistd.h>
  16. */
  17. #define HELLO_WORLD_SERVER_PORT 6666
  18. #define LENGTH_OF_LISTEN_QUEUE 20
  19. #define BUFFER_SIZE 1024
  20. #define FILE_NAME_MAX_SIZE 512
  21.  
  22. int main(int argc, char **argv)
  23. {
  24.     //设置一个socket地址结构server_addr,代表服务器internet地址, 端口
  25.     struct sockaddr_in server_addr;
  26.     bzero(&server_addr,sizeof(server_addr)); //把一段内存区的内容全部设置为0
  27.     server_addr.sin_family = AF_INET;
  28.     server_addr.sin_addr.s_addr = htons(INADDR_ANY);
  29.     server_addr.sin_port = htons(HELLO_WORLD_SERVER_PORT);
  30.  
  31.     //创建用于internet的流协议(TCP)socket,用server_socket代表服务器socket
  32.     int server_socket = socket(PF_INET,SOCK_STREAM,0);
  33.     if( server_socket < 0)
  34.     {
  35.         printf("Create Socket Failed!");
  36.         exit(1);
  37.     }
  38. {
  39.    int opt =1;
  40.    setsockopt(server_socket,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));
  41. }
  42.      
  43.     //把socket和socket地址结构联系起来
  44.     if( bind(server_socket,(struct sockaddr*)&server_addr,sizeof(server_addr)))
  45.     {
  46.         printf("Server Bind Port : %d Failed!", HELLO_WORLD_SERVER_PORT);
  47.         exit(1);
  48.     }
  49.  
  50.     //server_socket用于监听
  51.     if ( listen(server_socket, LENGTH_OF_LISTEN_QUEUE) )
  52.     {
  53.         printf("Server Listen Failed!");
  54.         exit(1);
  55.     }
  56.     while (1) //服务器端要一直运行
  57.     {
  58.         //定义客户端的socket地址结构client_addr
  59.         struct sockaddr_in client_addr;
  60.         socklen_t length = sizeof(client_addr);
  61.  
  62.         //接受一个到server_socket代表的socket的一个连接
  63.         //如果没有连接请求,就等待到有连接请求--这是accept函数的特性
  64.         //accept函数返回一个新的socket,这个socket(new_server_socket)用于同连接到的客户的通信
  65.         //new_server_socket代表了服务器和客户端之间的一个通信通道
  66.         //accept函数把连接到的客户端信息填写到客户端的socket地址结构client_addr中
  67.         int new_server_socket = accept(server_socket,(struct sockaddr*)&client_addr,&length);
  68.         if ( new_server_socket < 0)
  69.         {
  70.             printf("Server Accept Failed!\n");
  71.             break;
  72.         }
  73.          
  74.         char buffer[BUFFER_SIZE];
  75.         bzero(buffer, BUFFER_SIZE);
  76.         length = recv(new_server_socket,buffer,BUFFER_SIZE,0);
  77.         if (length < 0)
  78.         {
  79.             printf("Server Recieve Data Failed!\n");
  80.             break;
  81.         }
  82.         char file_name[FILE_NAME_MAX_SIZE+1];
  83.         bzero(file_name, FILE_NAME_MAX_SIZE+1);
  84.         strncpy(file_name, buffer, strlen(buffer)>FILE_NAME_MAX_SIZE?FILE_NAME_MAX_SIZE:strlen(buffer));
  85. // int fp = open(file_name, O_RDONLY);
  86. // if( fp < 0 )
  87.         printf("%s\n",file_name);
  88.         FILE * fp = fopen(file_name,"r");
  89.         if(NULL == fp )
  90.         {
  91.             printf("File:\t%s Not Found\n", file_name);
  92.         }
  93.         else
  94.         {
  95.             bzero(buffer, BUFFER_SIZE);
  96.             int file_block_length = 0;
  97. // while( (file_block_length = read(fp,buffer,BUFFER_SIZE))>0)
  98.             while( (file_block_length = fread(buffer,sizeof(char),BUFFER_SIZE,fp))>0)
  99.             {
  100.                 printf("file_block_length = %d\n",file_block_length);
  101.                 //发送buffer中的字符串到new_server_socket,实际是给客户端
  102.                 if(send(new_server_socket,buffer,file_block_length,0)<0)
  103.                 {
  104.                     printf("Send File:\t%s Failed\n", file_name);
  105.                     break;
  106.                 }
  107.                 bzero(buffer, BUFFER_SIZE);
  108.             }
  109. // close(fp);
  110.             fclose(fp);
  111.             printf("File:\t%s Transfer Finished\n",file_name);
  112.         }
  113.         //关闭与客户端的连接
  114.         close(new_server_socket);
  115.     }
  116.     //关闭监听用的socket
  117.     close(server_socket);
  118.     return 0;
  119. }
============================================================
Client 端:

点击(此处)折叠或打开

  1. client.c
  2.  
  3. #include <netinet/in.h> // for sockaddr_in
  4. #include <sys/types.h> // for socket
  5. #include <sys/socket.h> // for socket
  6. #include <stdio.h> // for printf
  7. #include <stdlib.h> // for exit
  8. #include <string.h> // for bzero
  9. /*
  10. #include <sys/types.h>
  11. #include <sys/stat.h>
  12. #include <fcntl.h>
  13. #include <unistd.h>
  14. */
  15.  
  16. #define HELLO_WORLD_SERVER_PORT 6666
  17. #define BUFFER_SIZE 1024
  18. #define FILE_NAME_MAX_SIZE 512
  19.  
  20. int main(int argc, char **argv)
  21. {
  22.     if (argc != 2)
  23.     {
  24.         printf("Usage: ./%s ServerIPAddress\n",argv[0]);
  25.         exit(1);
  26.     }
  27.  
  28.     //设置一个socket地址结构client_addr,代表客户机internet地址, 端口
  29.     struct sockaddr_in client_addr;
  30.     bzero(&client_addr,sizeof(client_addr)); //把一段内存区的内容全部设置为0
  31.     client_addr.sin_family = AF_INET; //internet协议族
  32.     client_addr.sin_addr.s_addr = htons(INADDR_ANY);//INADDR_ANY表示自动获取本机地址
  33.     client_addr.sin_port = htons(0); //0表示让系统自动分配一个空闲端口
  34.     //创建用于internet的流协议(TCP)socket,用client_socket代表客户机socket
  35.     int client_socket = socket(AF_INET,SOCK_STREAM,0);
  36.     if( client_socket < 0)
  37.     {
  38.         printf("Create Socket Failed!\n");
  39.         exit(1);
  40.     }
  41.     //把客户机的socket和客户机的socket地址结构联系起来
  42.     if( bind(client_socket,(struct sockaddr*)&client_addr,sizeof(client_addr)))
  43.     {
  44.         printf("Client Bind Port Failed!\n");
  45.         exit(1);
  46.     }
  47.  
  48.     //设置一个socket地址结构server_addr,代表服务器的internet地址, 端口
  49.     struct sockaddr_in server_addr;
  50.     bzero(&server_addr,sizeof(server_addr));
  51.     server_addr.sin_family = AF_INET;
  52.     if(inet_aton(argv[1],&server_addr.sin_addr) == 0) //服务器的IP地址来自程序的参数
  53.     {
  54.         printf("Server IP Address Error!\n");
  55.         exit(1);
  56.     }
  57.     server_addr.sin_port = htons(HELLO_WORLD_SERVER_PORT);
  58.     socklen_t server_addr_length = sizeof(server_addr);
  59.     //向服务器发起连接,连接成功后client_socket代表了客户机和服务器的一个socket连接
  60.     if(connect(client_socket,(struct sockaddr*)&server_addr, server_addr_length) < 0)
  61.     {
  62.         printf("Can Not Connect To %s!\n",argv[1]);
  63.         exit(1);
  64.     }
  65.  
  66.     char file_name[FILE_NAME_MAX_SIZE+1];
  67.     bzero(file_name, FILE_NAME_MAX_SIZE+1);
  68.     printf("Please Input File Name On Server:\t");
  69.     scanf("%s", file_name);
  70.      
  71.     char buffer[BUFFER_SIZE];
  72.     bzero(buffer,BUFFER_SIZE);
  73.     strncpy(buffer, file_name, strlen(file_name)>BUFFER_SIZE?BUFFER_SIZE:strlen(file_name));
  74.     //向服务器发送buffer中的数据
  75.     send(client_socket,buffer,BUFFER_SIZE,0);
  76.  
  77. // int fp = open(file_name, O_WRONLY|O_CREAT);
  78. // if( fp < 0 )
  79.     FILE * fp = fopen(file_name,"w");
  80.     if(NULL == fp )
  81.     {
  82.         printf("File:\t%s Can Not Open To Write\n", file_name);
  83.         exit(1);
  84.     }
  85.      
  86.     //从服务器接收数据到buffer中
  87.     bzero(buffer,BUFFER_SIZE);
  88.     int length = 0;
  89.     while( length = recv(client_socket,buffer,BUFFER_SIZE,0))
  90.     {
  91.         if(length < 0)
  92.         {
  93.             printf("Recieve Data From Server %s Failed!\n", argv[1]);
  94.             break;
  95.         }
  96. // int write_length = write(fp, buffer,length);
  97.         int write_length = fwrite(buffer,sizeof(char),length,fp);
  98.         if (write_length<length)
  99.         {
  100.             printf("File:\t%s Write Failed\n", file_name);
  101.             break;
  102.         }
  103.         bzero(buffer,BUFFER_SIZE);
  104.     }
  105.     printf("Recieve File:\t %s From Server[%s] Finished\n",file_name, argv[1]);
  106.      
  107.     close(fp);
  108.     //关闭socket
  109.     close(client_socket);
  110.     return 0;
  111. }
=============================================================

open等,fopen等说明:

点击(此处)折叠或打开

  1. 某些注释部分,open,read,write被 fopen,fread,fwrite替换。
  2.  
  3. 说明一下:
  4. fopen, fclose, fread, fwrite, fgetc, fgets, fputc, fputs, freopen, fseek, ftell, rewind等
  5. 缓冲文件系统
  6. 缓冲文件系统的特点是:在内存开辟一个“缓冲区”,为程序中的每一个文件使用,当执行读文件的操作时,
  7. 从磁盘文件将数据先读入内存“缓冲区”, 装满后再从内存“缓冲区”依此读入接收的变量。执行写文件的
  8. 操作时,先将数据写入内存“缓冲区”,待内存“缓冲区”装满后再写入文件。由此可以看出,内存
  9. “缓冲区”的大小,影响着实际操作外存的次数,内存“缓冲区”越大,则操作外存的次数就少,
  10. 执行速度就快、效率高。一般来说,文件“缓冲区”的大小随机器 而定。
  11.  
  12. open, close, read, write, getc, getchar, putc, putchar 等
  13. 非缓冲文件系统
  14. 非缓冲文件系统是借助文件结构体指针来对文件进行管理,通过文件指针来对文件进行访问,既可以读写字符、
  15. 字符串、格式化数据,也可以读写二进制数 据。非缓冲文件系统依赖于操作系统,通过操作系统的功能对
  16. 文件进行读写,是系统级的输入输出,它不设文件结构体指针,只能读写二进制文件,但效率高、速度快,
  17. 由于ANSI标准不再包括非缓冲文件系统,因此建议大家最好不要选择它。
  18.  
  19. open等属于低级IO,
  20. fopen等是高级IO。
  21.  
  22. open等返回一个文件描述符(用户程序区的)
  23. fopen等返回一个文件指针。
  24.  
  25. open等无缓冲,fopen等有缓冲。
  26.  
  27. fopen等是在open等的基础上扩充而来的,在大多数情况下,用fopen等。
  28.  
  29. open 是系统调用 返回的是文件句柄,文件的句柄是文件在文件描述符表里的索引,
  30. fopen是C的库函数,返回的是一个指向文件结构的指针。

阅读(919) | 评论(0) | 转发(0) |
0

上一篇:HTTPMU/UDP

下一篇:MT7620A openWRT 配置WAN口

给主人留下些什么吧!~~