udp_server

  1. #include <stdlib.h>
  2. #include <string.h>
  3. #include <unistd.h>
  4. #include <arpa/inet.h>
  5. #include <sys/socket.h>
  6. #include <stdio.h>
  7.  
  8. #define BUF_SIZE 30
  9.  
  10. void err_handler(char *msg);
  11.  
  12. int main(int argc, char **argv) {
  13.  
  14. int srv_sock;
  15. char msg[BUF_SIZE];
  16. int str_len;
  17. socklen_t cli_adr_sz;
  18.  
  19. struct sockaddr_in srv_addr, cli_addr;
  20. if (argc != ) {
  21. printf("Usage : %s <port>\n", argv[]);
  22. exit();
  23. }
  24. srv_sock = socket(PF_INET, SOCK_DGRAM, );
  25. if (srv_sock == -) {
  26. err_handler("UDP socket() error");
  27. }
  28. memset(&srv_addr, , sizeof(srv_addr));
  29. srv_addr.sin_family = AF_INET;
  30. srv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
  31. srv_addr.sin_port = htons(atoi(argv[]));
  32.  
  33. if (bind(srv_sock, (struct sockaddr *) &srv_addr, sizeof(srv_addr)) == -) {
  34. err_handler("bind() error");
  35. }
  36.  
  37. while () {
  38. cli_adr_sz = sizeof(cli_addr);
  39. str_len = recvfrom(srv_sock, msg, BUF_SIZE, , (struct sockaddr *) &cli_addr, &cli_adr_sz);
  40. sendto(srv_sock, msg, str_len, , (struct sockaddr *) &cli_addr, cli_adr_sz);
  41. printf("recv and send ...\n");
  42. }
  43.  
  44. close(srv_sock);
  45. return ;
  46. }
  47.  
  48. void err_handler(char *msg) {
  49. fputs(msg, stderr);
  50. fputc('\n', stderr);
  51. exit();
  52. }

udp_client

  1. #include <stdlib.h>
  2. #include <string.h>
  3. #include <unistd.h>
  4. #include <arpa/inet.h>
  5. #include <sys/socket.h>
  6. #include <stdio.h>
  7.  
  8. #define BUF_SIZE 30
  9.  
  10. void err_handler(char *msg);
  11.  
  12. int main(int argc, char **argv) {
  13.  
  14. int sock;
  15. char msg[BUF_SIZE];
  16. int str_len;
  17. socklen_t adr_sz;
  18.  
  19. struct sockaddr_in srv_addr, from_addr;
  20. if (argc != ) {
  21. printf("Usage : %s <IP> <PORT>\n", argv[]);
  22. exit();
  23. }
  24.  
  25. sock = socket(PF_INET, SOCK_DGRAM, );
  26. if (sock == -) {
  27. err_handler("socket() error");
  28. }
  29.  
  30. memset(&srv_addr, , sizeof(srv_addr));
  31. srv_addr.sin_family = AF_INET;
  32. srv_addr.sin_addr.s_addr = inet_addr(argv[]);
  33. srv_addr.sin_port = htons(atoi(argv[]));
  34.  
  35. while () {
  36. fputs("Input msg(Q to quit):", stdout);
  37. fgets(msg, BUF_SIZE, stdin);
  38. if (!strcmp(msg, "q\n") || !strcmp(msg, "Q\n")) {
  39. break;
  40. }
  41. sendto(sock, msg, strlen(msg), , (struct sockaddr *) &srv_addr, sizeof(srv_addr));
  42. adr_sz = sizeof(from_addr);
  43. str_len = recvfrom(sock, msg, BUF_SIZE, , (struct sockaddr *) &srv_addr, &adr_sz);
  44. msg[str_len] = ;
  45. printf("Msg form srv : %s", msg);
  46. }
  47. close(sock);
  48. return ;
  49. }
  50.  
  51. void err_handler(char *msg) {
  52. fputs(msg, stderr);
  53. fputc('\n', stderr);
  54. exit();
  55. }

build

gcc -o usrv udp_srv.c -g -Wall
gcc -o ucli udp_cli.c -g -Wall

linux_c_udp_example的更多相关文章

随机推荐

  1. GNS3 模拟icmp记录路由

    路由配置: icmp记录路由抓取出接口的IP地址,最多可以抓取9个.ip协议头中的options为40个字节 R1 : conf t int f0/0 no shutdown ip add 192.1 ...

  2. XV6源代码阅读-中断与系统调用

    Exercise1 源代码阅读 1.启动部分: bootasm.S bootmain.c 和xv6初始化模块:main.c bootasm.S 由16位和32位汇编混合编写成的XV6引导加载器.boo ...

  3. [Luogu][P2458] [SDOI2006]保安站岗

    题目链接 看起来似乎跟最小点覆盖有点像.但区别在于: 最小点覆盖要求所有边在其中,而本题要求所有点在其中. 即:一个点不选时,它的儿子不一定需要全选. 画图理解: 对于这样一幅图,本题中可以这样选择: ...

  4. python面试总结知识点

    1.python中is和==的区别 Python中对象包含的三个基本要素,分别是:id(身份标识) .type(数据类型)和value(值). ‘==’比较的是value值 ‘is’比较的是id 2. ...

  5. 完全卸载(删除)mac下自带的php

    /private/etc sudo rm -rf php-fpm.conf.defaultphp.ini php.ini.default /usr/bin sudo rm -rf php php-co ...

  6. JD-Store购物网站复盘——20170312

    一.商店技术架构 1.主题 2.涉及技术点: 3.核心业务功能 4.角色 5.用户故事 二.实现步骤 专案基础设施 上传图片模块 购物车 订单 支付&寄信 专案源码 三.第三方服务应用 支付 ...

  7. Percona-Toolkit 之 pt-archiver 删除历史数据

    pt-archiver是Percona-Toolkit工具集中的一个组件,是一个主要用于对MySQL表数据进行归档和清除工具.它可以将数据归档到另一张表或者是一个文件中.pt-archiver在清除表 ...

  8. 134-PHP子类重写父类方法,并调用父类方法

    <?php class father{ //定义father类 public function method(){ //定义方法 echo '<br />father method' ...

  9. apache flink源码挖坑 (未完待续)

    Apache Flink 源码解读(一) ​ By yyz940922原创 项目模块 (除去.git, .github, .idea, docs等): flink-annotations: flink ...

  10. 六、React 键盘事件 表单事件 事件对象以及React中的ref获取dom节点 、React实现类似Vue的双向数据绑定

    接:https://www.cnblogs.com/chenxi188/p/11782349.html 事件对象 .键盘事件. 表单事件 .ref获取dom节点.React实现类似vue双向数据绑定 ...