Chinaunix首页 | 论坛 | 博客
  • 博客访问: 389162
  • 博文数量: 80
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 560
  • 用 户 组: 普通用户
  • 注册时间: 2015-03-10 08:38
文章分类
文章存档

2016年(32)

2015年(48)

我的朋友

分类: LINUX

2015-08-20 16:12:31

这篇文章主要介绍了Linux网络编程之UDP Socket程序示例,有助于读者在实践中掌握UDP协议的原理及应用方法,需要的朋友可以参考下
        
        在网络传输协议中,TCP协议提供的是一种可靠的,复杂的,面向连接的数据流(SOCK_STREAM)传输服务,它通过三段式握手过程建立连接。TCP有一种“重传确认”机制,即接收端收到数据后要发出一个肯定确认的信号,发送端如果收到接收端肯定确认的信号,就会继续发送其他的数据,如果没有,它就会重新发送。
        
相对而言,UDP协议则是一种无连接的,不可靠的数据报(SOCK_DGRAM)传输服务。使用UDP套接口不用建立连接,服务端在调用socket()生成一个套接字并调用bind()绑定端口后就可以进行通信(recvfrom函数和sendto函数)了;客户端在用socket()生成一个套接字后就可以向服务端地址发送和接收数据了。
        
此处需要特别注意:TCP使用的是流套接字(SOCK_STREAM),UDP使用的是数据报套接字(SOCK_DGRAM)
        
UDP套接字编程范例:
        
server端代码如下:
        
  1. /*************************************************************************
  2.  > File Name: server.c
  3.  > Author: SongLee
  4.  ************************************************************************/
  5. #include<sys/types.h>
  6. #include<sys/socket.h>
  7. #include<unistd.h>
  8. #include<netinet/in.h>
  9. #include<arpa/inet.h>
  10. #include<stdio.h>
  11. #include<stdlib.h>
  12. #include<errno.h>
  13. #include<netdb.h>
  14. #include<stdarg.h>
  15. #include<string.h>
  16.   
  17. #define SERVER_PORT 8000
  18. #define BUFFER_SIZE 1024
  19. #define FILE_NAME_MAX_SIZE 512
  20.   
  21. int main()
  22. {
  23.  /* 创建UDP套接口 */
  24.  struct sockaddr_in server_addr;
  25.  bzero(&server_addr, sizeof(server_addr));
  26.  server_addr.sin_family = AF_INET;
  27.  server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
  28.  server_addr.sin_port = htons(SERVER_PORT);
  29.   
  30.  /* 创建socket */
  31.  int server_socket_fd = socket(AF_INET, SOCK_DGRAM, 0);
  32.  if(server_socket_fd == -1)
  33.  {
  34.   perror("Create Socket Failed:");
  35.   exit(1);
  36.  }
  37.   
  38.  /* 绑定套接口 */
  39.  if(-1 == (bind(server_socket_fd,(struct sockaddr*)&server_addr,sizeof(server_addr))))
  40.  {
  41.   perror("Server Bind Failed:");
  42.   exit(1);
  43.  }
  44.   
  45.  /* 数据传输 */
  46.  while(1)
  47.  {
  48.   /* 定义一个地址,用于捕获客户端地址 */
  49.   struct sockaddr_in client_addr;
  50.   socklen_t client_addr_length = sizeof(client_addr);
  51.   
  52.   /* 接收数据 */
  53.   char buffer[BUFFER_SIZE];
  54.   bzero(buffer, BUFFER_SIZE);
  55.   if(recvfrom(server_socket_fd, buffer, BUFFER_SIZE,0,(struct sockaddr*)&client_addr, &client_addr_length) == -1)
  56.   {
  57.    perror("Receive Data Failed:");
  58.    exit(1);
  59.   }
  60.   
  61.   /* 从buffer中拷贝出file_name */
  62.   char file_name[FILE_NAME_MAX_SIZE+1];
  63.   bzero(file_name,FILE_NAME_MAX_SIZE+1);
  64.   strncpy(file_name, buffer, strlen(buffer)>FILE_NAME_MAX_SIZE?FILE_NAME_MAX_SIZE:strlen(buffer));
  65.   printf("%s\n", file_name);
  66.  }
  67.  close(server_socket_fd);
  68.  return 0;
  69. }

    client端代码如下:

  1. /*************************************************************************
  2.  > File Name: client.c
  3.  > Author: SongLee
  4.  ************************************************************************/
  5. #include<sys/types.h>
  6. #include<sys/socket.h>
  7. #include<unistd.h>
  8. #include<netinet/in.h>
  9. #include<arpa/inet.h>
  10. #include<stdio.h>
  11. #include<stdlib.h>
  12. #include<errno.h>
  13. #include<netdb.h>
  14. #include<stdarg.h>
  15. #include<string.h>
  16.   
  17. #define SERVER_PORT 8000
  18. #define BUFFER_SIZE 1024
  19. #define FILE_NAME_MAX_SIZE 512
  20.   
  21. int main()
  22. {
  23.  /* 服务端地址 */
  24.  struct sockaddr_in server_addr;
  25.  bzero(&server_addr, sizeof(server_addr));
  26.  server_addr.sin_family = AF_INET;
  27.  server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
  28.  server_addr.sin_port = htons(SERVER_PORT);
  29.   
  30.  /* 创建socket */
  31.  int client_socket_fd = socket(AF_INET, SOCK_DGRAM, 0);
  32.  if(client_socket_fd < 0)
  33.  {
  34.   perror("Create Socket Failed:");
  35.   exit(1);
  36.  }
  37.   
  38.  /* 输入文件名到缓冲区 */
  39.  char file_name[FILE_NAME_MAX_SIZE+1];
  40.  bzero(file_name, FILE_NAME_MAX_SIZE+1);
  41.  printf("Please Input File Name On Server:\t");
  42.  scanf("%s", file_name);
  43.   
  44.  char buffer[BUFFER_SIZE];
  45.  bzero(buffer, BUFFER_SIZE);
  46.  strncpy(buffer, file_name, strlen(file_name)>BUFFER_SIZE?BUFFER_SIZE:strlen(file_name));
  47.   
  48.  /* 发送文件名 */
  49.  if(sendto(client_socket_fd, buffer, BUFFER_SIZE,0,(struct sockaddr*)&server_addr,sizeof(server_addr)) < 0)
  50.  {
  51.   perror("Send File Name Failed:");
  52.   exit(1);
  53.  }
  54.   
  55.  close(client_socket_fd);
  56.  return 0;
  57. }




阅读(1414) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~