老师布置的作业

echo4_server.c

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4. #include<unistd.h>
  5. #include<arpa/inet.h>
  6. #include<sys/socket.h>
  7.  
  8. #define BUF_SIZE 10 //一次最大传输大小
  9. void error_handling(char *message); //异常
  10.  
  11. int main(int argc,char** argv)
  12. {
  13. int serv_sock,n;
  14. char message[BUF_SIZE*+],message1[BUF_SIZE+];
  15. int str_len;
  16. socklen_t clnt_adr_sz;
  17. struct sockaddr_in serv_adr,clnt_adr;
  18. if(argc!=){
  19. printf("Usage : %s <port>\n",argv[]);
  20. exit();
  21. }
  22. serv_sock=socket(PF_INET,SOCK_DGRAM,);
  23. if(serv_sock == -){
  24. error_handling("UDP socket creattion error");
  25. }
  26.  
  27. memset(&serv_adr,,sizeof(serv_adr));
  28. serv_adr.sin_family=AF_INET;
  29. serv_adr.sin_addr.s_addr=htonl(INADDR_ANY);
  30. serv_adr.sin_port=htons(atoi(argv[]));
  31.  
  32. if(bind(serv_sock,(struct sockaddr*)&serv_adr,sizeof(serv_adr))==-)
  33. error_handling("bind() error");
  34.  
  35. while(){
  36. clnt_adr_sz=sizeof(clnt_adr);
  37. str_len=recvfrom(serv_sock,message,BUF_SIZE+,,(struct sockaddr*)&clnt_adr,&clnt_adr_sz);
  38. message[str_len]=;
  39. if(message[]==){
  40. n=message[];
  41. message[]=message[]=message[]='';
  42. message[]=;
  43. for(int i=;i<n;i++){
  44. str_len=recvfrom(serv_sock,&message1,BUF_SIZE*,,(struct sockaddr*)&clnt_adr,&clnt_adr_sz);
  45. message1[str_len]=;
  46. strcat(message,&message1[]);
  47. }
  48. }
  49. if(strlen(&message[])-<=BUF_SIZE){
  50. message[]=;
  51. message[]=strlen(&message[]);
  52. sendto(serv_sock,message,strlen(&message[])+,,(struct sockaddr*)&clnt_adr,clnt_adr_sz);
  53. }
  54. else{
  55. message[]=;
  56. message[]=strlen(&message[])/BUF_SIZE;
  57. if(strlen(&message[])%BUF_SIZE!=)
  58. message[]+=;
  59. sendto(serv_sock,message,,,(struct sockaddr*)&clnt_adr,clnt_adr_sz);
  60. for(int i=;i*BUF_SIZE<strlen(&message[]);i++){
  61. message[i*BUF_SIZE]=;
  62. message[i*BUF_SIZE+]=i+;
  63. message[i*BUF_SIZE+]=BUF_SIZE;
  64. if((i+)*BUF_SIZE>strlen(&message[]))
  65. message[i*BUF_SIZE+]=strlen(&message[])-i*BUF_SIZE;
  66. sendto(serv_sock,&message[i*BUF_SIZE],message[i*BUF_SIZE+]+,,(struct sockaddr*)&clnt_adr,clnt_adr_sz);
  67. }
  68. }
  69. }
  70. close(serv_sock);
  71. return ;
  72. }
  73.  
  74. void error_handling(char *message)
  75. {
  76. fputs(message,stderr);
  77. fputc('\n',stderr);
  78. exit();
  79. }

echo4_client.c

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4. #include<unistd.h>
  5. #include<arpa/inet.h>
  6. #include<sys/socket.h>
  7.  
  8. #define BUF_SIZE 10
  9.  
  10. void error_handling(char *message);
  11.  
  12. int main(int argc,char** argv)
  13. {
  14. int sock;
  15. char message[BUF_SIZE*+],message1[BUF_SIZE+];
  16. int str_len,n;
  17. socklen_t adr_sz;
  18.  
  19. struct sockaddr_in serv_adr,from_adr;
  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. error_handling("sock() error");
  28. memset(&serv_adr,,sizeof(serv_adr));
  29. serv_adr.sin_family=AF_INET;
  30. serv_adr.sin_addr.s_addr=inet_addr(argv[]);
  31. serv_adr.sin_port=htons(atoi(argv[]));
  32.  
  33. while(){
  34. int m_len;
  35. fputs("Insert message(q to quit): ",stdout);
  36. fgets(&message[],sizeof(message)-,stdin);
  37. if(!strcmp(&message[],"q\n")||!strcmp(&message[],"Q\n"))break;
  38. if(strlen(&message[])-<=BUF_SIZE){
  39. message[]=;
  40. message[]=strlen(&message[]);
  41. sendto(sock,message,strlen(&message[])+,,(struct sockaddr*)&serv_adr,sizeof(serv_adr));
  42. }
  43. else{
  44. message[]=;
  45. message[]=strlen(&message[])/BUF_SIZE;
  46. if(strlen(&message[])%BUF_SIZE!=)
  47. message[]+=;
  48. sendto(sock,message,,,(struct sockaddr*)&serv_adr,sizeof(serv_adr));
  49. for(int i=;i*BUF_SIZE+<strlen(&message[]);i++){
  50. message[i*BUF_SIZE]=;
  51. message[i*BUF_SIZE+]=i+;
  52. message[i*BUF_SIZE+]=BUF_SIZE;
  53. if((i+)*BUF_SIZE>=strlen(&message[]))
  54. message[i*BUF_SIZE+]=strlen(&message[])--i*BUF_SIZE;
  55. sendto(sock,&message[i*BUF_SIZE],message[i*BUF_SIZE+]+,,(struct sockaddr*)&serv_adr,sizeof(serv_adr));
  56. }
  57. }
  58.  
  59. str_len=recvfrom(sock,message,BUF_SIZE+,,(struct sockaddr*)&from_adr,&adr_sz);
  60. message[str_len]=;
  61. if(message[]==){
  62. n=message[];
  63. message[]=message[]=message[]='';
  64. message[]=;
  65. for(int i=;i<n;i++){
  66. str_len=recvfrom(sock,&message1,BUF_SIZE*,,(struct sockaddr*)&from_adr,&adr_sz);
  67. message1[str_len]=;
  68. strcat(message,&message1[]);
  69. //printf("%d,%d,%d,%s\n",message1[0],message1[1],message1[2],&message1[3]);
  70. }
  71. }
  72. printf("Message from server : %s \n",&message[]);
  73. }
  74. close(sock);
  75. return ;
  76. }
  77.  
  78. void error_handling(char *message)
  79. {
  80. fputs(message,stderr);
  81. fputc('\n',stderr);
  82. exit();
  83. }

网络编程udp入门的更多相关文章

  1. c/c++ 网络编程 UDP 设定MTU

    网络编程 UDP 设定MTU MTU(Maximun Transmisson Unit):一次送信的最大size. 在程序里动态改变MTU.注意:程序运行需要root权限. 程序运行的方法: sudo ...

  2. c/c++ 网络编程 UDP up/down 网卡

    网络编程 UDP up/down 网卡 在程序里动态改变网卡的状态.注意:程序运行需要root权限. 程序运行的方法: sudo ./a.out 1,关闭网卡 #include <stdio.h ...

  3. c/c++ 网络编程 UDP 改变网关和网卡名字

    网络编程 UDP 改变网关和网卡名字 在程序里动态改变网关和网卡名字 1,改变网卡名字 #include <stdio.h> #include <string.h> #incl ...

  4. c/c++ 网络编程 UDP 改变网卡的硬件地址

    网络编程 UDP 改变网卡的硬件地址 在程序里动态改变网卡的硬件地址 1,取得网卡的硬件地址 #include <stdio.h> #include <string.h> #i ...

  5. c/c++ 网络编程 UDP 改变IP地址

    网络编程 UDP 改变IP地址 在程序里动态改变主机的IP地址 1,改变ipv4的地址 #include <stdio.h> #include <string.h> #incl ...

  6. c/c++ 网络编程 UDP 用if_nameindex和ioctl取得主机网络信息

    网络编程 UDP 用if_nameindex和ioctl取得主机网络信息 getifaddrs函数取得的东西太多了,如果只想取得网卡名字和网卡编号可以用下面的2个函数. 1,if_nameindex ...

  7. c/c++ 网络编程 UDP 主机网络信息取得

    网络编程 UDP 主机网络信息取得 1,if_nametoindex 通过网卡名字取得网卡编号 2,if_indextoname 通过网卡编号取得网卡名字 #include <stdio.h&g ...

  8. c/c++ 网络编程 UDP 发送端 bind 作用

    网络编程 UDP 发送端 bind 作用 upd 发送端 调用bind函数的效果:把socket特定到一个指定的端口,如果不调用bind,内核会随机分配一个端口. upd 发送端 调用bind函数的目 ...

  9. Socket网络编程-UDP编程

    Socket网络编程-UDP编程 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.UDP编程概述 1>.UDP服务端编程流程 创建socket对象.socket.SOCK_ ...

随机推荐

  1. ‘mysql’不是内部或外部命令,也不是可运行的程序--解决方法

    一.场景 在cmd命令窗口下操作mysql时,提示mysql不是内部或外部命令,也不是可运行的程序. 二.原因 有3种原因: 1.没有装mysql 2.没有配置mysql环境变量 3.cmd命令窗口没 ...

  2. 09 redis中布隆过滤器的使用

    我们在使用新闻客户端看新闻时,它会给我们不停地推荐新的内容,它每次推荐时要去重,去掉那些已经看过的内容.问题来了,新闻客户端推荐系统如何实现推送去重的? 会想到服务器记录了用户看过的所有历史记录,当推 ...

  3. Mac下安装Redis及Redis Desktop Manager

    1.简介 Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库.缓存和消息中间件. 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表 ...

  4. Flutter——Image组件(图片组件)

    Image组件有很多构造函数,这里只说两个. Image.asset  本地图片 1.在根目录新建文件夹 /images 2.在 images 文件夹下建立两个文件夹 /images/2.0x  /i ...

  5. Django的ORM获取单表数据的三种方法

    前言主题是从数据库取数据,把数据展现到前端客户端 一共有三种方法如下: 1,以对象的方法: 2,以字典的方法: 3,以元组的方法: 以对象的方法 说明:获取的是QuerySet类型,输出的是每个元素都 ...

  6. anaconda环境---ubuntu下重装

    anaconda环境---ubuntu下重装 @wp20190312 为何重装? 配置一个环境,意外发现conda命令不好用了,提示“找不到conda模块”,整个conda虚拟环境中的工程项目无法使用 ...

  7. css网页使用自定义字体方法

    @font-face可以加载服务器端的字体到浏览器端,这样设计师就可以不受客户端字体库的限制. 一般来说有四种格式的字体文件即可覆盖所有浏览器.这四种格式为: .EOT:适用于Internet Exp ...

  8. Python3学习笔记37-LeetCode刷题

    LeetCode中国官网一个用来刷编程题的网站,收录了很多面试题.感觉还是学习到很多.记录一下思路.代码还是要多敲. 建议编写完后直接在LeetCode上运行和提交.提交时会有不同的测试用例来测试代码 ...

  9. vue--directive自定义指令(不常用)

    除了核心功能默认内置的指令 (v-model 和 v-show),Vue 也允许注册自定义指令.注意,在 Vue2.0 中,代码复用和抽象的主要形式是组件.然而,有的情况下,你仍然需要对普通 DOM ...

  10. MySQL主从同步、读写分离配置步骤、问题解决笔记

    MySQL主从同步.读写分离配置步骤.问题解决笔记 根据要求配置MySQL主从备份.读写分离,结合网上的文档,对搭建的步骤和出现的问题以及解决的过程做了如下笔记:       现在使用的两台服务器已经 ...