网络编程udp入门

老师布置的作业
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入门的更多相关文章
- c/c++ 网络编程 UDP 设定MTU
网络编程 UDP 设定MTU MTU(Maximun Transmisson Unit):一次送信的最大size. 在程序里动态改变MTU.注意:程序运行需要root权限. 程序运行的方法: sudo ...
- c/c++ 网络编程 UDP up/down 网卡
网络编程 UDP up/down 网卡 在程序里动态改变网卡的状态.注意:程序运行需要root权限. 程序运行的方法: sudo ./a.out 1,关闭网卡 #include <stdio.h ...
- c/c++ 网络编程 UDP 改变网关和网卡名字
网络编程 UDP 改变网关和网卡名字 在程序里动态改变网关和网卡名字 1,改变网卡名字 #include <stdio.h> #include <string.h> #incl ...
- c/c++ 网络编程 UDP 改变网卡的硬件地址
网络编程 UDP 改变网卡的硬件地址 在程序里动态改变网卡的硬件地址 1,取得网卡的硬件地址 #include <stdio.h> #include <string.h> #i ...
- c/c++ 网络编程 UDP 改变IP地址
网络编程 UDP 改变IP地址 在程序里动态改变主机的IP地址 1,改变ipv4的地址 #include <stdio.h> #include <string.h> #incl ...
- c/c++ 网络编程 UDP 用if_nameindex和ioctl取得主机网络信息
网络编程 UDP 用if_nameindex和ioctl取得主机网络信息 getifaddrs函数取得的东西太多了,如果只想取得网卡名字和网卡编号可以用下面的2个函数. 1,if_nameindex ...
- c/c++ 网络编程 UDP 主机网络信息取得
网络编程 UDP 主机网络信息取得 1,if_nametoindex 通过网卡名字取得网卡编号 2,if_indextoname 通过网卡编号取得网卡名字 #include <stdio.h&g ...
- c/c++ 网络编程 UDP 发送端 bind 作用
网络编程 UDP 发送端 bind 作用 upd 发送端 调用bind函数的效果:把socket特定到一个指定的端口,如果不调用bind,内核会随机分配一个端口. upd 发送端 调用bind函数的目 ...
- Socket网络编程-UDP编程
Socket网络编程-UDP编程 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.UDP编程概述 1>.UDP服务端编程流程 创建socket对象.socket.SOCK_ ...
随机推荐
- Ubuntu16.04 + caffe + cuda 环境搭建
1. sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libhdf5-serial-de ...
- vue.js devtools图标不亮
第一步:打开谷歌扩展程序 第二步:设置允许访问文件地址
- Node.js学习(3)-用express改写留言本
安装 cnpm i -S express cnpm i -S express-art-template cnpm i -S art-template var express = require(' ...
- body测试onclick等鼠标事件无效果详解
DOM事件机制包括五部分: DOM事件级别 DOM事件流 DOM事件模型 事件代理 Event对象常见的方法和属性 但是有时候发现给body标签里设置onclick属性,不起作用,代码如下: 不管单击 ...
- angular-file-upload.min.js.map文件下载
https://github.com/nervgh/angular-file-upload 下载地址 在文件 菜单栏有对应文件
- 运行tomcat7w.exe提示指定的服务未安装 解决办法
一.问题重现点击bin下tomcat7w.exe出现如下提示:提示指定的服务未安装 二.原因分析tomcat7.exe和tomcat7w.exe要起作用必须先为这两个文件安装服务.其中tomcat7. ...
- phpstorm 习惯设置
phpstorm 习惯设置 1. 字体:Source Code Pro 大小:14 链接: https://pan.baidu.com/s/1HLpbduBHFvbq1a10QV4uCg 提取码: y ...
- 快速排序详解(lomuto划分快排,hoare划分快排,classic经典快排,dualpivot双轴快排源码)
目录 快速排序(lomuto划分快排,hoare划分快排,classic经典快排,dualpivot双轴快排) 一.快速排序思想 二.划分思想 三.测试用例 快速排序(lomuto划分快排,hoare ...
- Educational Codeforces Round 37-F.SUM and REPLACE (线段树,线性筛,收敛函数)
F. SUM and REPLACE time limit per test2 seconds memory limit per test256 megabytes inputstandard inp ...
- java线程基础巩固---策略模式在Thread和Runnable中的应用分析
在上篇[http://www.cnblogs.com/webor2006/p/7709647.html]中已经学习了Runnable出现的好处,其实这种设计是采用的一种策略模式,所以为了进一步理解Ru ...