老师布置的作业

echo4_server.c

 #include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<arpa/inet.h>
#include<sys/socket.h> #define BUF_SIZE 10 //一次最大传输大小
void error_handling(char *message); //异常 int main(int argc,char** argv)
{
int serv_sock,n;
char message[BUF_SIZE*+],message1[BUF_SIZE+];
int str_len;
socklen_t clnt_adr_sz;
struct sockaddr_in serv_adr,clnt_adr;
if(argc!=){
printf("Usage : %s <port>\n",argv[]);
exit();
}
serv_sock=socket(PF_INET,SOCK_DGRAM,);
if(serv_sock == -){
error_handling("UDP socket creattion error");
} memset(&serv_adr,,sizeof(serv_adr));
serv_adr.sin_family=AF_INET;
serv_adr.sin_addr.s_addr=htonl(INADDR_ANY);
serv_adr.sin_port=htons(atoi(argv[])); if(bind(serv_sock,(struct sockaddr*)&serv_adr,sizeof(serv_adr))==-)
error_handling("bind() error"); while(){
clnt_adr_sz=sizeof(clnt_adr);
str_len=recvfrom(serv_sock,message,BUF_SIZE+,,(struct sockaddr*)&clnt_adr,&clnt_adr_sz);
message[str_len]=;
if(message[]==){
n=message[];
message[]=message[]=message[]='';
message[]=;
for(int i=;i<n;i++){
str_len=recvfrom(serv_sock,&message1,BUF_SIZE*,,(struct sockaddr*)&clnt_adr,&clnt_adr_sz);
message1[str_len]=;
strcat(message,&message1[]);
}
}
if(strlen(&message[])-<=BUF_SIZE){
message[]=;
message[]=strlen(&message[]);
sendto(serv_sock,message,strlen(&message[])+,,(struct sockaddr*)&clnt_adr,clnt_adr_sz);
}
else{
message[]=;
message[]=strlen(&message[])/BUF_SIZE;
if(strlen(&message[])%BUF_SIZE!=)
message[]+=;
sendto(serv_sock,message,,,(struct sockaddr*)&clnt_adr,clnt_adr_sz);
for(int i=;i*BUF_SIZE<strlen(&message[]);i++){
message[i*BUF_SIZE]=;
message[i*BUF_SIZE+]=i+;
message[i*BUF_SIZE+]=BUF_SIZE;
if((i+)*BUF_SIZE>strlen(&message[]))
message[i*BUF_SIZE+]=strlen(&message[])-i*BUF_SIZE;
sendto(serv_sock,&message[i*BUF_SIZE],message[i*BUF_SIZE+]+,,(struct sockaddr*)&clnt_adr,clnt_adr_sz);
}
}
}
close(serv_sock);
return ;
} void error_handling(char *message)
{
fputs(message,stderr);
fputc('\n',stderr);
exit();
}

echo4_client.c

 #include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<arpa/inet.h>
#include<sys/socket.h> #define BUF_SIZE 10 void error_handling(char *message); int main(int argc,char** argv)
{
int sock;
char message[BUF_SIZE*+],message1[BUF_SIZE+];
int str_len,n;
socklen_t adr_sz; struct sockaddr_in serv_adr,from_adr;
if(argc!=){
printf("Usage : %s <IP> <port>\n",argv[]);
exit();
} sock=socket(PF_INET,SOCK_DGRAM,);
if(sock==-)
error_handling("sock() error");
memset(&serv_adr,,sizeof(serv_adr));
serv_adr.sin_family=AF_INET;
serv_adr.sin_addr.s_addr=inet_addr(argv[]);
serv_adr.sin_port=htons(atoi(argv[])); while(){
int m_len;
fputs("Insert message(q to quit): ",stdout);
fgets(&message[],sizeof(message)-,stdin);
if(!strcmp(&message[],"q\n")||!strcmp(&message[],"Q\n"))break;
if(strlen(&message[])-<=BUF_SIZE){
message[]=;
message[]=strlen(&message[]);
sendto(sock,message,strlen(&message[])+,,(struct sockaddr*)&serv_adr,sizeof(serv_adr));
}
else{
message[]=;
message[]=strlen(&message[])/BUF_SIZE;
if(strlen(&message[])%BUF_SIZE!=)
message[]+=;
sendto(sock,message,,,(struct sockaddr*)&serv_adr,sizeof(serv_adr));
for(int i=;i*BUF_SIZE+<strlen(&message[]);i++){
message[i*BUF_SIZE]=;
message[i*BUF_SIZE+]=i+;
message[i*BUF_SIZE+]=BUF_SIZE;
if((i+)*BUF_SIZE>=strlen(&message[]))
message[i*BUF_SIZE+]=strlen(&message[])--i*BUF_SIZE;
sendto(sock,&message[i*BUF_SIZE],message[i*BUF_SIZE+]+,,(struct sockaddr*)&serv_adr,sizeof(serv_adr));
}
} str_len=recvfrom(sock,message,BUF_SIZE+,,(struct sockaddr*)&from_adr,&adr_sz);
message[str_len]=;
if(message[]==){
n=message[];
message[]=message[]=message[]='';
message[]=;
for(int i=;i<n;i++){
str_len=recvfrom(sock,&message1,BUF_SIZE*,,(struct sockaddr*)&from_adr,&adr_sz);
message1[str_len]=;
strcat(message,&message1[]);
//printf("%d,%d,%d,%s\n",message1[0],message1[1],message1[2],&message1[3]);
}
}
printf("Message from server : %s \n",&message[]);
}
close(sock);
return ;
} void error_handling(char *message)
{
fputs(message,stderr);
fputc('\n',stderr);
exit();
}

网络编程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. MVC授权不通过之后不执行任何自定义ActionFilter

    如下一个Action [Authorize] [F1]//自定义过滤器,继承自ActionFilter public ActionResult Index() { return View(); } 如 ...

  2. Vue大概知识体系和学习参考

    Vue大概知识体系和学习参考文档 官方文档学习,参考,借鉴地址:https://cn.vuejs.org/v2/guide/installation.html 菜鸟教程:https://www.run ...

  3. UVA10140PrimeDistance题解--质数/技巧

    题目链接 https://www.luogu.org/problemnew/show/UVA10140 分析 \(L,R\)都很大,显然不能直接筛出\(L,R\)区间中的质数,这里需要一个结论 结论 ...

  4. luogu P3750 [六省联考2017]分手是祝愿

    luogu loj 可以发现在最优策略中,每种操作最多只会做一次,并且操作的先后顺序并不会影响答案,所以考虑从后往前扫,碰到一个\(1\)就对这个位置\(i\)进行操作,这样的操作一定是最优策略.记最 ...

  5. 关于微信小程序返回页面时刷新页面的实现

    在小程序开发中,我们通常会遇到这样的需求:提交某个表单成功后跳转该表单详情页面,但是返回时需要跳转回到首页(注意:我这里的首页是提交表单页的前一个页面),而不能再返回提交表单的页面,并且要在首页中刷新 ...

  6. django中app_name以及namespace理解

    在写django的时候,html中反向解析经常会用到app_name 但有时候又是namespace,具体的区别如下: 大部分情况 这两者有其一就可以了. 并且两者(可以简化理解)无区别 只要一种情况 ...

  7. 【3】Git命令

    个人推荐的Git知识学习网站:https://git-scm.com . git常用操作图 init -> add -> commit -> remote -> push 初始 ...

  8. jumpserver跳板机docker安装小小趟坑

    最近日常运维的时候发现每次登陆服务器都要打开终端目录连接对应的服务器,闲暇的时候还好,运维任务很重的时候才发现这样的玩法很傻,浪费时间且一点儿都跟不上潮流,然后打开githup开始搞起来.docker ...

  9. 2019年C题 视觉情报信息分析

    2019 年第十六届中国研究生数学建模竞赛C 题 任务1中 图三:图3 中拍照者距离地面的高度 目录: 0.试题分析: 1.构建摄像机模型 2.摄像机参数假定 3.像平面坐标计算 4.图像标定及数值测 ...

  10. 十九:mvc强类型声明

    落下了几节,自己很懒啊, 得找个时间补上... 1. 强类型 是指变量在定义时就已经明确指定了其类型.如: string  s; int x; 2.弱类型 赋值时才确定类型. var s; var x ...