网络编程--UDP通信
UDP是面向无连接类型的传输服务,允许不建立好对话关系可进行数据发送。
UDP_SERVER:
1. 创建一个socket套接字,用socket()函数
2. 绑定ip和端口号到socket,用bind
3. 循环接收数据recvfrom(),用词函数可以进入阻塞状态
4. 关闭网络连接
注:intrecvfrom(socket s, void *buf, int len, unsigned int flags, struct sockaddr*from, int *fromlen)
成功:接收字符数 失败: -1
功能:用来接收远程主机指定的socket传来的数据,来源的网络地址from接收数据,存放到缓冲区buf里面去,len为buf所能接受的最大字节数,flags为0,fromlen网络地址大小
UDP_client:
1. 创建一个socket套接字,用socket()函数
2. 绑定ip和端口号到socket,用bind()可选
3. 设置对方ip和端口熟悉
4. 发送数据,用sendto
5. 关闭连接
注意:intsendto(socket s, const void *msg, int len, unsigned int flags, const structsockaddr *to, int tolen);
sendto() 用来将数据由指定的socket传给对方主机。参数s为已建好连线的socket,如果利用UDP协议则不需经过连线操作。参数msg指向欲连线的数据内容,参数flags 一般设0,发给网络地址to
以下代码:
UDP_server端:
// UDP program text,this is a UDP server
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <string.h>
#include <netdb.h>
#include <netinet/in.h>
#define portnumber 4321
int main()
{
int sockfd,nbyte;
struct sockaddr_in UDP_server;
char buf[1024];
sockfd = socket(AF_INET,SOCK_DGRAM,0); //create socket
if(-1 == sockfd)
{
perror("create socket error: ");
exit(1);
}
/*fill in IP and port number message*/
bzero(&UDP_server,sizeof(struct sockaddr_in)); //clear
UDP_server.sin_family = AF_INET;
UDP_server.sin_port = htons(portnumber);
UDP_server.sin_addr.s_addr = htonl(INADDR_ANY);
if(-1 == bind(sockfd,(struct sockaddr *)(&UDP_server),sizeof(struct sockaddr)))
{
perror("bind ip to socket error:");
exit(1);
}
while(1)
{
nbyte = sizeof(struct sockaddr_in);
nbyte = recvfrom(sockfd,buf,1024,0,(struct sockaddr *)(&UDP_server),&nbyte);
if(-1 == nbyte)
{
perror("recvfrom data error!:");
exit(1);
}
buf[nbyte] = '\0';
printf("Get message succed!\n %s \n",buf);
bzero(buf,1024);
}
close(sockfd);
return 0;
}
UDP_client端:
// UDP text, this is a UDP client
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netdb.h>
#include <netinet/in.h>
#define portnumber 4321
int main(int argc,char *argv[])
{
int sockfd,nbyte;
struct sockaddr_in UDP_client;
char buf[1024];
if(argc != 2)
{
printf("input error!\n");
exit(1);
}
sockfd = socket(AF_INET,SOCK_DGRAM,0);
if(sockfd == -1)
{
perror("create client ocket error:\n");
exit(1);
}
bzero(&UDP_client,sizeof(struct sockaddr_in));
UDP_client.sin_family = AF_INET;
UDP_client.sin_port = htons(portnumber);
if(inet_aton(argv[1],&(UDP_client.sin_addr)) < 0)
{
perror("aton error: \n");
exit(1);
}
while(1)
{
printf("Please input:\n");
fgets(buf,1024,stdin);
nbyte = sendto(sockfd,buf,strlen(buf),0,(struct sockaddr*)(&UDP_client),sizeof(struct sockaddr));
if(nbyte < 0)
{
perror("send error:\n");
exit(1);
}
printf("send succed: %s\n",buf);
bzero(buf,nbyte);
}
close(sockfd);
return 0;
}
执行效果: