zoukankan      html  css  js  c++  java
  • linux udp c/s

    一、UDP C/S编程的步骤如下图所示

    二、与TCP C/S通信的区别在于:
    服务端没有设置监听和等待连接的过程。客户端没有连接服务端的过程。
    基于UDP的通信时不可靠地,面向无连接的,发送的数据无法确切知道对方收到没有,就算对方根本不存在,也可以发送数据出去。
    这样的通信通常用在对可靠性、安全性要求不高的地方,比如语音通信(没听清楚可以让对方再说一遍)。

    三、server端编程

     1 #include <sys/types.h>
     2 #include <sys/socket.h>
     3 #include<pthread.h>
     4 #include <netinet/in.h>
     5 #include <stdio.h>
     6 #include <string.h>
     7 #include <unistd.h>
     8 #include <stdlib.h>
     9 
    10 int main(int argc, char **argv)
    11 {
    12     if (argc != 2)
    13     {
    14         printf("Usage: %s port
    ", argv[0]);
    15         exit(1);
    16     }
    17     printf("Welcome! This is a UDP server, I can only received message from client and reply with same message
    ");
    18     
    19     struct sockaddr_in addr;   
    20     addr.sin_family = AF_INET;
    21     addr.sin_port = htons(atoi(argv[1]));    //协商的发送端的端口号
    22     addr.sin_addr.s_addr = htonl(INADDR_ANY); //本机地址
    23 
    24     int sock;
    25     if ( (sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
    26     {
    27         perror("socket");
    28         exit(1);
    29     }
    30     if (bind(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) //绑定socket套接字到本地的监听端口
    31     {
    32         perror("bind");
    33         exit(1);
    34     }
    35     char buff[512];
    36     struct sockaddr_in clientAddr;
    37     int n;
    38     int len = sizeof(clientAddr);
    39     while (1)
    40     {
    41         n = recvfrom(sock, buff, 511, 0, (struct sockaddr*)&clientAddr, &len);//接收UDP包
    42         if (n>0)
    43         {
    44             buff[n] = 0;
    45             printf("%s %u says: %s
    ", inet_ntoa(clientAddr.sin_addr), ntohs(clientAddr.sin_port), buff);
    46             n = sendto(sock, buff, n, 0, (struct sockaddr *)&clientAddr, sizeof(clientAddr));//往发送方发送UDP回复包
    47             if (n < 0)
    48             {
    49                 perror("sendto");
    50                 break;
    51             }
    52         }
    53         else
    54         {
    55             perror("recv");
    56             break;
    57         }
    58     }
    59     return 0;
    60 }

    四、client端

     1 #include <sys/types.h>
     2 #include <sys/socket.h>
     3 #include<pthread.h>
     4 #include <netinet/in.h>
     5 #include <stdio.h>
     6 #include <string.h>
     7 #include <unistd.h>
     8 #include <stdlib.h>
     9 
    10 
    11 int main(int argc, char **argv)
    12 {
    13     if (argc != 3)
    14     {
    15         printf("Usage: %s ip port", argv[0]);
    16         exit(1);
    17     }
    18     printf("This is a UDP client
    ");
    19     struct sockaddr_in addr;
    20     int sock;
    21 
    22     if ( (sock=socket(AF_INET, SOCK_DGRAM, 0)) <0)//创建socket
    23     {
    24         perror("socket");
    25         exit(1);
    26     }
    27     addr.sin_family = AF_INET;
    28     addr.sin_port = htons(atoi(argv[2]));
    29     addr.sin_addr.s_addr = inet_addr(argv[1]);//对方的IP地址、端口号
    30     if (addr.sin_addr.s_addr == INADDR_NONE)
    31     {
    32         printf("Incorrect ip address!");
    33         close(sock);
    34         exit(1);
    35     }
    36 
    37     char buff[512];
    38     int len = sizeof(addr);
    39     while (1)
    40     {
    41         gets(buff);
    42         int n;
    43         n = sendto(sock, buff, strlen(buff), 0, (struct sockaddr *)&addr, sizeof(addr));//往对方地址发送UDP包
    44         if (n < 0)
    45         {
    46             perror("sendto");
    47             close(sock);
    48             break;
    49         }
    50         n = recvfrom(sock, buff, 512, 0, (struct sockaddr *)&addr, &len);//接收来自对方IP地址的UDP包
    51         if (n>0)
    52         {
    53             buff[n] = 0;
    54             printf("received:");
    55             puts(buff);
    56         }
    57         else if (n==0)
    58         {
    59             printf("server closed
    ");
    60             close(sock);
    61             break;
    62         }
    63         else if (n == -1)
    64         {
    65             perror("recvfrom");
    66             close(sock);
    67             break;
    68         }
    69     }
    70     
    71     return 0;
    72 }

    转自:http://www.cnblogs.com/uvsjoh/archive/2013/01/01/2841764.html

  • 相关阅读:
    【crontab】误删crontab及其恢复
    New Concept English there (7)
    New Concept English there (6)
    New Concept English there (5)
    New Concept English there (4)
    New Concept English there (3)
    New Concept English there (2)Typing speed exercise
    New Concept English there (1)Typing speed exercise
    New Concept English Two 34 game over
    New Concept English Two 33 94
  • 原文地址:https://www.cnblogs.com/meizixiong/p/3208927.html
Copyright © 2011-2022 走看看