UDP通讯程序设计

时间:2021-10-10 08:32:04

                  UDP通讯程序设计

一、函数化

UDP通讯程序设计

1.1服务器使用的函数

  创建socket----->socket

  绑定地址-------->bind

  接受数据-------->recvfrom

  发送数据-------->sendto

  结束连接-------->close

1.2客户机使用函数

  创建套接字------>socket

  发送数据-------->sento

  接受数据-------->recvfrom

  结束连接-------->close

二、函数学习

2.1 发送数据sendto

2.1.1包含头文件

  #include <sys/types.h>
  #include <sys/socket.h>

2.1.2函数原型

  ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
const struct sockaddr *dest_addr, socklen_t addrlen);

2.1.3函数参数

  sockfd:创建的套接字

  *buf:要发送的数据地址

  len:数据长度

  flags:标识符

  dest_addr:目的机地址

  addrlen:地址长度

2.1.4返回值

  实际发送的数据量

2.2接收数据recvfrom

2.2.1包含头文件

  #include <sys/types.h>
  #include <sys/socket.h>

2.2.2函数原型

  ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
    struct sockaddr *src_addr, socklen_t *addrlen);

2.2.3函数参数

  sockfd:创建的套接字

  *buf:数据存放的地址

  len:数据长度

  flags:标识符

  dest_addr:数据来源方方的地址

  addrlen:地址长度的指针

2.2.4返回值

  以字节计数的消息长度,若无可用消息或对方已经按序结束则返回0,若出错则返回-1

三、编写服务器代码

  touch  udp_server.c

  chmod 777 udp_server.c

 #include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h> #define portnum 8888
#define msg_size 128
int main()
{
int sockfd;
char buffer[msg_size];
struct sockaddr_in server_addr;
struct sockaddr_in client_addr;
int addrlen;
int n;
//1.创建套接字
sockfd = socket(AF_INET,SOCK_DGRAM,); //2.绑定地址
bzero(&server_addr,sizeof(struct sockaddr_in));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(portnum);
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
bind(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr)); //3.接受数据
while()
{
addrlen = sizeof(struct sockaddr); //获取数据长度地址
bzero(buffer,sizeof(buffer));
n = recvfrom(sockfd,buffer,msg_size,,(struct sockaddr *)(&client_addr),&addrlen);
buffer[n] = ;
printf("server received :%s\n",buffer);
}
//4.结束连接
close(sockfd);
return ;
}

编译运行:

UDP通讯程序设计

四、编写客户机代码

  touch udp_client,c

  chmod 777 udp_client.c

#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h> #define buffer_size 128
#define portnum 8888
int main(int argc,char **argv[])
{
int sockfd;
char buffer[buffer_size];
struct sockaddr_in server_addr; if(argc != )
{
printf("usage: %s server_ip\n",argv[]);
exit();
}
//1.创建套接字
sockfd = socket(AF_INET,SOCK_DGRAM,); //初始化服务器地址
bzero(&server_addr,sizeof(struct sockaddr_in));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(portnum);
inet_aton(argv[],&server_addr.sin_addr); //2.发送数据
while()
{
printf("please input char: \n");
fgets(buffer,buffer_size,stdin);
sendto(sockfd,buffer,strlen(buffer),,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr));
bzero(buffer,buffer_size);
} //3.关闭连接
close(sockfd);
return ; }

编译运行:

UDP通讯程序设计

4.1则可以看到服务器运行结果

UDP通讯程序设计