UDP套接口编程
常用的UDP实现的程序:DNS域名系统,NFS网络文件系统,SNMP简单网络管理协议
ssize_t recvfrom(int sockfd,void *buff,size_t nbytes,int flags,struct sockaddr * from,socklen_t *addrlen);
ssize_t sendto(int sockfd,void *buff,size_t nbytes,int flags,struct sockaddr * to,socklen_t addrlen);

int main(int argc,char ** argv){
int sockfd;
struct sockaddr_in servaddr,cliaddr;
sockfd = Socket(AF_INET,SOCK_DGRAM,);
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(SERV_PORT);
Bind(sockfd,(SA *)&servaddr,sizeof(servaddr));
dg_echo(sockfd,(SA *)&cliaddr,sizeof(cliaddr));
}
void dg_echo(int sockfd,SA *pcliaddr,socklen_t clilen){
int n;
socklen_t len;
char mesg[MAXLINE];
for(;;){
len = clilen;
n = Recvfrom(sockfd,mesg,MAXLINE,,pcliaddr,&len); //读一个到达的数据包
Sendto(sockfd,mesg,n,,pcliaddr,len); //发送回给客户机
}
}
int main(int argc,char ** argv){
int sockfd;
struct sockaddr_t servaddr;
if(argc != )
err_quit("usage:udpcli<IPaddress>");
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(SERV_PORT);
inet_pton(AF_INET,argv[],&servaddr,sin_addr); //装填套接字
sockfd = Socket(AF_INET,SOCK_DGRAM,);
dg_cli(stdin,sockfd,(SA *)&servaddr,sizeof(servaddr));
exit();
}
void dg_cli(FILE *fp,int sockfd,const SA *pservaddr,socklen_t servlen){
int n;
char sendline[MAXLINE],recvline[MAXLINE+];
while(Fgets(sendline,MAXLINE,fp) != NULL){ //从标准输入读一行
Sendto(sockfd,sendline,strlen(sendline),,pservaddr,servlen); //使用sendto发送给服务器
n = Recvfrom(sockfd,recvline,MAXLINE,,NULL,NULL); //使用recvfrom接收服务器回射,NULL无视目标主机
recvline[n] = ;
Fputs(recvline,stdout); //fputs输出回射行到标准输出
}
}
void dg_cli(FILE *fp,int sockfd,const SA * pservaddr,socklen_t servlen){
int n;
char sendline[MAXLINE],recvline[MAXLINE+];
socklen_t len;
struct sockaddr *preply_addr;
preply_addr = Malloc(servlen);
while(Fgets(sendline,MAXLINE,fp)!= NULL ){
Sendto(sockfd,sendline,strlen(sendline),,pservaddr,servlen);
len = servlen;
n = Recvfrom(sockfd,recvline,MAXLINE,,preply_addr,&len);
if(len != servlen || memcpy(pservaddr,preply_addr,len) != ){
printf("reply from %s (ignored)\n");
Sock_ntop(preply_addr,len);
continue;
}
recvline[n] = ;
Fputs(recvline,stdout);
}
}
void dg_cli(FILE *fp,int sockfd,const SA * pservaddr,socklen_t servlen){
int n;
char sendline[MAXLINE],recvline[MAXLINE+];
Connect(sockfd,(SA *)pservaddr,servlen);
while(Fgets(sendline,MAXLINE,fp)!= NULL){
Write(sockfd,sendline,strlen(sendline));
n=Read(sockfd,recvline,MAXLINE);
recvline[n] = ;
Fputs(recvline,stdout);
}
}
static void recvfrom_int(int);
static int count;
void dg_echo(int sockfd,SA *pcliaddr,socklen_t clilen){
socklen_t len;
char mesg[MAXLINE];
Signal(SIGINT,recvfrom_int);
for(;;){
len = clilen;
Recvfrom(sockfd,mesg,MAXLINE,,pcliaddr,&len); count++;
}
}
static void recvfrom_int(int signo){
printf("\nreceived %d datagrams\n",count);
exit();
}
int main(int argc,char ** argv){
int listenfd,connfd,updfd,nready,maxfdp1;
char mesg[MAXLINE];
pid_t childpid;
fd_set rset;
ssize_t n;
socklen_t len;
const int on = ;
struct sockaddr_in cliaddr,servaddr;
void sig_child(int);
listenfd = Socket(AF_INET,SOCKSTREAM,);
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family=AF_INET;
servaddr.sin_addr.s_add=htonl(INADDR_ANY);
servaddr.sin_port=htons(SERV_PORT);
Setsockopt(listenfd,SOL_SOCKET,SO_RESSEADDR,&on,sizeof(on));
Bind(listenfd,(SA *)&servaddr,sizeof(servaddr));
Listen(listenfd,LISTENQ);
updfd=Socket(AF_INET,SOCK_DGRAM,);
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family=AF_INET;
servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
servaddr.sin_port=htons(SERV_PORT);
Bind(udpfd,(SA *)&servaddr,sizeof(servaddr));
Signal(SIGCHLD,sig_chld);
FD_ZERO(&rset);
maxfdp1=max(listenfd,udpfd)+;
for(;;){
FD_SET(listenfd,&rset);
FD_SET(udpfd,&rset);
if((nready=select(maxfdp1,&rset,NULL,NULL,NULL,NULL))<){
if(errno==EINTR)
continue;
else
err_sys("select error");
}
if(FD_ISSET(listenfd,&rset)){
len = sizeof(cliaddr);
connfd=Accept(listenfd,(SA *)&cliaddr,&len);
if((childpid=Fork())==){
Close(listenfd);
str_echo(connfd);
exit();
}
Close(connfd);
}
if(FD_ISSET(udpfd,&rset)){
len=sizeof(cliaddr);
n=Recvfrom(udpfd,mesg,MAXLINE,,(SA *)&cliaddr,&len);
Sendto(udpfd,mesg,n,,(SA *)&cliaddr,len);
}
}
}
UDP套接口编程的更多相关文章
- UNIX网络编程读书笔记:基本UDP套接口编程
概述 使用UDP编写的一些流行的应用程序有:DNS(域名系统).NFS(网络文件系统)和SNMP(简单网络管理协议). 如下图所示,给出了典型的UDP客户/服务器程序的函数调用: 客户不与服务器建立连 ...
- 值得收藏的TCP套接口编程文章
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由jackieluo发表于云+社区专栏 TCP客户端-服务器典型事件 下图是TCP客户端与服务器之间交互的一系列典型事件时间表: 首先启 ...
- UNIX网络编程读书笔记:基本SCTP套接口编程
概述 SCTP是一个较新的传输协议,于2000年在IETF得到标准化(TCP是在1981年标准化的).它最初是为满足不断增长的IP电话市场设计的:具体地说,就是穿越因特网传输电话信令. SCTP是一个 ...
- UNIX网络编程读书笔记:基本TCP套接口编程
编写一个完整的TCP客户和服务器程序所需要的基本套接口函数: 1.socket函数(客户端.服务器端都必须调用) 参数family指明协议族(family),该参数也往往被称为协议域(domain). ...
- Linux C 网络编程——3. TCP套接口编程
1. 基本流程 2. socket() int socket(int domain, int type, int protocol); socket()打开一个网络通讯端口,如果成功的话,就像open ...
- 【转】Linux C 网络编程——TCP套接口编程
地址:http://blog.csdn.net/matrix_laboratory/article/details/13669211 2. socket() <span style=" ...
- 探索UDP套接字编程
UDP和TCP处于同一层网络模型中,也就是运输层,基于二者之上的应用有很多,常见的基于TCP的有HTTP.Telnet等,基于UDP有DNS.NFS.SNMP等.UDP是无连接,不可靠的数据协议服务, ...
- 【转】 探索UDP套接字编程
UDP和TCP处于同一层网络模型中,也就是运输层,基于二者之上的应用有很多,常见的基于TCP的有HTTP.Telnet等,基于UDP有DNS.NFS.SNMP等.UDP是无连接,不可靠的数据协议服务, ...
- UNIX网络编程读书笔记:原始套接口
概述 应用程序可以绕过传输层而直接使用IPv4和IPv6,这称为原始套接口(raw socket).http://www.cnblogs.com/nufangrensheng/p/3583435.ht ...
随机推荐
- 安装sass时,gem在国内不能安装的解决
最近在安装SASS的时候,用到gem命令,但是运行出行如下错误!(先声明,安装sass前,要保证自己电脑安装了ruby:ruby -v可以测试下有没有装) 原因是ruby 的gem被和谐了,现在淘宝的 ...
- linux echo命令的-n、-e两个参数
echo -n 不换行输出 $echo -n "123" $echo "456" 最终输出 123456 而不是 123 456 echo -e 处理特殊字符 ...
- Checked Exception与Runtime Exception 的区别
Java里有个很重要的特色是Exception ,也就是说允许程序产生例外状况.而在学Java 的时候,我们也只知道Exception 的写法,却未必真能了解不同种类的Exception 的区别. 首 ...
- elasticsearch-head 的搭建
elasticsearch-head 全部是js和html5写的,elasticsearch 全部都是http的接口, 这样,只需要简单地本地配置一个虚拟站点,就可以搭建 elasticsearch ...
- selenium python (十一)alert/confirm/prompt的处理(js中的弹出框)
webdriver中处理js所生成的alert.confirm以及prompt,采用switch_to_alert()方法定位到alert/confirm/prompt.然后使用text/accept ...
- [转]linux之more命令
转自:http://www.cnblogs.com/peida/archive/2012/11/02/2750588.html more命令,功能类似 cat ,cat命令是整个文件的内容从上到下显示 ...
- dword word byte 相互转换 .xml
pre{ line-height:1; color:#800080; background-color:#d2c39b; font-size:16px;}.sysFunc{color:#627cf6; ...
- windows10UWP开发真机调试时遇到DEP6100和DEP6200解决办法
windows10UWP开发真机调试时遇到DEP6100和DEP6200(其实未连接上设备都会报这两个错误,无论真机还是虚拟机)…… 此方法适合真机调试时遇到: 弹出提示框要求输入配对码,无论如何输入 ...
- 基本的SQL Server 语句,包含 增、删、改、查 程序员必会
这是我以前学习时, 整理的一套基础SQL Server增.删.改.查 等语句 ,初学者可以从上往下学完. 也方便自己忘记时翻看! create database SQLschool go --批 go ...
- 黑马程序员——Foundation中的OC结构体
<span style="font-size:14px">------<a target="_blank" href="http:/ ...