Linux的编程网络编程UDP.docx
- 文档编号:26239742
- 上传时间:2023-06-17
- 格式:DOCX
- 页数:13
- 大小:16.48KB
Linux的编程网络编程UDP.docx
《Linux的编程网络编程UDP.docx》由会员分享,可在线阅读,更多相关《Linux的编程网络编程UDP.docx(13页珍藏版)》请在冰豆网上搜索。
Linux的编程网络编程UDP
15.Linux的编程:
网络编程:
UDP
例1:
使用UDP发送数据
使用的系统调用
socket
调用方法:
socket(AF_INET,SOCK_DGRAM,0)
第二个参数指明用数据报协议
sendto
#include
ssize_tsendto(intsockfd,constvoid*buff,size_tnbytes,intflags,conststructsockaddr*to,socklen_taddrlen);
功能:
向to结构指定的地址发送数据
sockfd:
套接口描述符
buff:
缓冲区
nbytes:
读写字节数
flags:
一般设为0
to:
指明数据将发往的目的地址
addrlen:
to结构的大小
源程序
/*sender.c*/
#include
#include
#include
#include
#include
#include
#include
intport=6789;
voidmain(){
intsocket_descriptor;
intiter=0;
charbuf[80];
structsockaddr_inaddress;
/*
InitializesocketaddressstructureforInternetProtocols
*/
//将address结构清空
bzero(&address,sizeof(address));/*emptydatastructure*/
//将目标地址信息(IP地址,端口号)设置到address结构中
address.sin_family=AF_INET;
address.sin_addr.s_addr=inet_addr("127.0.0.1");
address.sin_port=htons(port);
/*
CreateaUDPsocket
*/
socket_descriptor=socket(AF_INET,SOCK_DGRAM,0);
/*
Loop20times(aniceroundnumber)sendingdata.
*/
for(iter=0;iter<=20;iter++)
{
sprintf(buf,"datapacketwithID%d\n",iter);
//向目标地址发送信息
sendto(socket_descriptor,
buf,sizeof(buf),
0,(structsockaddr*)&address,sizeof(address));
}
/*
Sendaterminationmessage
*/
sprintf(buf,"stop\n");
//向目标地址发送信息
sendto(socket_descriptor,
buf,sizeof(buf),
0,(structsockaddr*)&address,sizeof(address));
close(socket_descriptor);
printf("MessagesSent,Terminating\n");
exit(0);
}
例2:
接收UDP数据
使用的系统调用
socket:
用法同上
bind:
用法同TCP服务器端
recvfrom
#include
ssize_trecvfrom(intsockfd,void*buff,size_tnbytes,intflags,structsockaddr*from,socklen_t*addrlen);
sockfd:
套接口描述符
buff:
缓冲区
nbytes:
读写字节数
flags:
一般设为0
from:
数据报发送者的协议地址填入此处
addrlen:
返回from结构中的字节数
源程序
/*receiver.c*/
#include
#include
#include
#include
#include
#include
#include
intport=6789;
voidmain(){
intsin_len;
charmessage[256];
intsocket_descriptor;
structsockaddr_insin;
printf("Waitingfordatafromsender\n");
/*
InitializesocketaddressstructureforInternetProtocols
*/
bzero(&sin,sizeof(sin));/*emptydatastructure*/
sin.sin_family=AF_INET;
sin.sin_addr.s_addr=htonl(INADDR_ANY);
sin.sin_port=htons(port);
sin_len=sizeof(sin);
/*
CreateaUDPsocket
andbindittotheport
*/
//创建套接口
socket_descriptor=socket(AF_INET,SOCK_DGRAM,0);
//将套接口与端口绑定
bind(socket_descriptor,(structsockaddr*)&sin,sizeof(sin));
/*
Loopforever(oruntilaterminationmessageisreceived)
Receivedatathroughthesocketandprocessit.Theprocessing
inthisprogramisreallysimple--printing.
*/
while
(1)
{
//从套接口接收信息
recvfrom(socket_descriptor,message,sizeof(message),0,
(structsockaddr*)&sin,&sin_len);
printf("Responsefromserver:
%s\n",message);
if(strncmp(message,"stop",4)==0)
{
printf("Senderhastoldmetoendtheconnection\n");
break;
}
}
close(socket_descriptor);
exit(0);
}
例3:
最少的出错检查和使用主机名
程序说明
通过使用主机名而不是IP地址时代码更通用些,其余部分与上面程序相同
structhostentgethostbyname(char*s)
功能:
将s中包含的主机名(或IP地址)转化为IP地址内部表示
源程序:
sender2.c
#include
#include
#include
#include
#include
#include
#include
#include
intport=6789;
voidmain(){
intsocket_descriptor;
intiter=0;
ssize_tsendto_rc;
intclose_rc;
charbuf[80];
structsockaddr_inaddress;
structhostent*hostbyname;
/*
TranslateahostnametoIPaddress
*/
//主机名转化为IP地址
hostbyname=gethostbyname("127.0.0.1");
if(hostbyname==NULL)
{
perror("gethostbynamefailed");
exit(errno);
}
/*
InitializesocketaddressstructureforInternetProtocols
Theaddresscomesfromthedatastructurereturnedbygethostbyname()
*/
bzero(&address,sizeof(address));/*emptydatastructure*/
address.sin_family=AF_INET;
//IP地址填入address结构
memcpy(&address.sin_addr.s_addr,hostbyname->h_addr,sizeof(address.sin_addr.s_addr));
address.sin_port=htons(port);
/*
CreateaUDPsocket
*/
socket_descriptor=socket(AF_INET,SOCK_DGRAM,0);
if(socket_descriptor==-1)
{
perror("socketcallfailed");
exit(errno);
}
/*
Loop20times(aniceroundnumber)sendingdata.
*/
for(iter=0;iter<=20;iter++)
{
sprintf(buf,"datapacketwithID%d\n",iter);
sendto_rc=sendto(socket_descriptor,
buf,sizeof(buf),
0,(structsockaddr*)&address,sizeof(address));
if(sendto_rc==-1)
{
perror("sendtocallfailed");
exit(errno);
}
}
/*
Sendaterminationmessage
*/
sprintf(buf,"stop\n");
sendto_rc=sendto(socket_descriptor,
buf,sizeof(buf),
0,(structsockaddr*)&address,sizeof(address));
if(sendto_rc==-1)
{
perror("sendtoSTOPcallfailed");
exit(errno);
}
/*
Mostpeopledon'tbothertocheckthereturncode
returnedbytheclosefunction
*/
close_rc=close(socket_descriptor);
if(close_rc==-1)
{
perror("closecallfailed");
exit(errno);
}
printf("MessagesSent,Terminating\n");
exit(0);
}
receiver2.c
#include
#include
#include
#include
#include
#include
#include
#include
intport=6789;
voidmain(){
intsin_len;
charmessage[256];
intsocket_descriptor;
structsockaddr_insin;
intbind_rc,close_rc;
ssize_trecv_rc;
printf("Waitingfordatafromsender\n");
/*
InitializesocketaddressstructureforInternetProtocols
*/
bzero(&sin,sizeof(sin));/*emptydatastructure*/
sin.sin_family=AF_INET;
sin.sin_addr.s_addr=htonl(INADDR_ANY);
sin.sin_port=htons(port);
sin_len=sizeof(sin);
/*
CreateaUDPsocket
andbindittotheport
*/
socket_descriptor=socket(AF_INET,SOCK_DGRAM,0);
if(socket_descriptor==-1)
{
perror("socketcallfailed");
exit(errno);
}
bind_rc=bind(socket_descriptor,(structsockaddr*)&sin,sizeof(sin));
if(bind_rc==-1)
{
perror("bindcallfailed");
exit(errno);
}
/*
Loopforever(oruntilaterminationmessageisreceived)
Receivedatathroughthesocketandprocessit.Theprocessing
inthisprogramisreallysimple--printing.
*/
while
(1)
{
recv_rc=recvfrom(socket_descriptor,message,sizeof(message),0,
(structsockaddr*)&sin,&sin_len);
if(recv_rc==-1)
{
perror("recvfromcallfailed");
exit(errno);
}
printf("Responsefromserver:
%s\n",message);
if(strncmp(message,"stop",4)==0)
{
printf("Senderhastoldmetoendtheconnection\n");
break;
}
}
/*
Mostpeopledon'tbothertocheckthereturncode
returnedbytheclosefunction
*/
close_rc=close(socket_descriptor);
if(close_rc==-1)
{
perror("closecallfailed");
exit(errno);
}
exit(0);
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Linux 编程 网络 UDP