网络编程——UDP的双向通信
一、特点
特点:UDP之间的通信不需要实现连接,直接发送数据,不稳定,容易丢包。
二、操作步骤
①创建socket套接字;
②使用bind函数绑定自己的IP地址和端口号;
③写入对方的IP地址和端口号;
④创建线程,实行发送或接收操作;
三、相关API
-
-
-
-
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
-
const struct sockaddr *dest_addr, socklen_t addrlen); //UDP的发送数据
-
//参数说明
-
//sockfd:文件描述符;
-
//buf:需要发送的数据;
-
//len:长度;
-
//flags:一般写0,表示可阻塞;
-
//dest_addr:发送给谁;
-
//addrlen:addr的长度;
-
-
-
-
-
-
-
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
-
struct sockaddr *src_addr, socklen_t *addrlen); //UDP的接收数据
-
//参数说明
-
//sockfd:文件描述符;
-
//buf:需要发送的数据;
-
//len:长度;
-
//flags:一般写0,表示可阻塞;
-
//src_addr:数据的来源;
-
//addrlen:addr的长度;
四、测试代码
客户端1
-
-
-
-
-
-
-
-
-
-
-
struct sockaddr_in other;
-
void *readMsg(void *arg);
-
-
int main(int argc,char *argv[])
-
{
-
if(argc!=3)
-
{
-
printf("User:%s<name>\n",argv[0]);
-
exit(-1);
-
}
-
-
//创建socket套接字
-
int sockfd=socket(AF_INET,SOCK_DGRAM,0);
-
if(sockfd<0)
-
{
-
perror("socket error");
-
exit(-1);
-
}
-
-
//bind绑定自己的IP地址和端口号
-
struct sockaddr_in myself;
-
myself.sin_family=AF_INET;
-
myself.sin_port=htons(12345);
-
myself.sin_addr.s_addr=INADDR_ANY;
-
if(bind(sockfd,(struct sockaddr*)&myself,sizeof(myself)))
-
{
-
perror("bind error");
-
exit(-1);
-
}
-
-
//对方的IP地址和端口号
-
other.sin_family=AF_INET;
-
other.sin_port=htons(atoi(argv[2]));
-
other.sin_addr.s_addr=inet_addr(argv[1]);
-
-
//创建线程
-
pthread_t pthread;
-
if(pthread_create(&pthread,NULL,readMsg,&sockfd))
-
{
-
perror("pthread_create error");
-
exit(-1);
-
}
-
-
char buf[50];
-
int ret;
-
while(1)
-
{
-
bzero(buf,sizeof(buf));
-
scanf("%s",buf);
-
ret=sendto(sockfd,buf,sizeof(buf),0,(struct sockaddr*)&other,sizeof(other)); //发送数据
-
if(ret<0)
-
{
-
perror("sendto error");
-
exit(-1);
-
}
-
}
-
return 0;
-
}
-
-
-
//线程的操作
-
void *readMsg(void *arg)
-
{
-
int sockfd=*(int *)arg; //将传进来的参数转换
-
char buf[50];
-
int len=sizeof(other);
-
while(1)
-
{
-
bzero(buf,sizeof(buf));
-
int ret=recvfrom(sockfd,buf,sizeof(buf),0,(struct sockaddr*)&other,&len); //接收数据
-
if(ret<0)
-
{
-
perror("recvfrom error");
-
exit(-1);
-
}
-
printf("%s\n",buf);
-
}
-
}
客户端2
-
-
-
-
-
-
-
-
-
-
-
-
struct sockaddr_in other;
-
void *writeMsg(void *arg);
-
-
int main(int argc,char *argv[])
-
{
-
if(argc!=3)
-
{
-
printf("Useer:%s<name>\n",argv[0]);
-
exit(-1);
-
}
-
-
//创建socket套接字
-
int sockfd=socket(AF_INET,SOCK_DGRAM,0);
-
if(sockfd<0)
-
{
-
perror("socket error");
-
exit(-1);
-
}
-
-
//用bind函数绑定自己的IP地址和端口号
-
struct sockaddr_in myself;
-
myself.sin_family=AF_INET;
-
myself.sin_port=htons(54321);
-
myself.sin_addr.s_addr=INADDR_ANY;
-
if(bind(sockfd,(struct sockaddr*)&myself,sizeof(myself)))
-
{
-
perror("bind error");
-
exit(-1);
-
}
-
-
//对方的IP地址和端口号
-
other.sin_family=AF_INET;
-
other.sin_port=htons(atoi(argv[2]));
-
other.sin_addr.s_addr=inet_addr(argv[1]);
-
-
//创建线程
-
pthread_t pthread;
-
if(pthread_create(&pthread,NULL,writeMsg,&sockfd))
-
{
-
perror("pthread_create error");
-
exit(-1);
-
}
-
-
char buf[50];
-
int len=sizeof(other);
-
-
while(1)
-
{
-
bzero(buf,sizeof(buf));
-
int ret=recvfrom(sockfd,buf,sizeof(buf),0,(struct sockaddr*)&other,&len); //接收数据
-
if(ret<0)
-
{
-
perror("recvfrom error");
-
exit(-1);
-
}
-
printf("%s\n",buf);
-
}
-
-
return 0;
-
}
-
-
//线程的操作
-
void *writeMsg(void *arg)
-
{
-
int sockfd=*(int *)arg;
-
char buf[50];
-
while(1)
-
{
-
bzero(buf,sizeof(buf));
-
scanf("%s",buf);
-
int ret=sendto(sockfd,buf,sizeof(buf),0,(struct sockaddr *)&other,sizeof(other)); //发送数据
-
if(ret<0)
-
{
-
perror("sendto error");
-
exit(-1);
-
}
-
}
-
}
-
-
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhfibeab
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
怎样阻止微信小程序自动打开
PHP中文网 06-13 -
photoshop蒙版画笔没反应怎么办
PHP中文网 06-24