简述socket编程中,udp协议服务器和客户端调用的API的过程。
客服端:
#include <stdio.h>
#include <sys/socket.h>//socket
#include <netinet/in.h>//struct sockaddr_in
#include <string.h>//memset
#include <arpa/inet.h>//htons
int main(int argc, char const *argv[])
{
//创建通信的UDP的套接字(没有port、ip)
int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
printf("UDP套接字sockfd=%d\n", sockfd);
//udp客户端 发送消息 给服务器
//定义一个IPv4地址结构 存放服务器的地址信息(目的主机)
struct sockaddr_in ser_addr;
memset(&ser_addr, 0, sizeof(ser_addr));
ser_addr.sin_family = AF_INET;//IPv4
ser_addr.sin_port = htons(8000);//服务器的端口
//服务器的IP地址
//IP换成你要发送的IP
inet_pton(AF_INET, "10.9.21.211", &ser_addr.sin_addr.s_addr);
//发送数据
//这个数据随意怎么发
sendto(sockfd, "hello net", strlen("hello net"), 0,\
(struct sockaddr *)&ser_addr, sizeof(ser_addr));
//关闭套接字
close(sockfd);
return 0;
}
服务器
#include <stdio.h>
#include <sys/socket.h>//socket
#include <netinet/in.h>//struct sockaddr_in
#include <string.h>//memset
#include <arpa/inet.h>//htons
#include <unistd.h>//close
int main(int argc, char const *argv[])
{
//创建通信的UDP的套接字(没有port、ip)
int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
printf("UDP套接字sockfd=%d\n", sockfd);
//定义IPv4地址结构 存放本机信息
struct sockaddr_in my_addr;
bzero(&my_addr, sizeof(my_addr));
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(9000);
my_addr.sin_addr.s_addr = htonl(INADDR_ANY);
//给udp套接字 bind绑定一个固定的地址信息
bind(sockfd, (struct sockaddr *)&my_addr, sizeof(my_addr));
//接收udp消息
while(1)
{
//定义一个IPv4地址结构 存放发送者的信息
struct sockaddr_in from_addr;
socklen_t from_len = sizeof(from_addr);
//这个接收的大小最大就是1500,所以这样就行,虽然有点别扭
unsigned char buf[1500]="";
int len = recvfrom(sockfd, buf, sizeof(buf), 0, \
(struct sockaddr *)&from_addr , &from_len);
//from_addr存放的就是发送者的信息
char ip[16]="";
inet_ntop(AF_INET, &from_addr.sin_addr.s_addr, ip, 16);
printf("消息来自%s %hu--->", ip, ntohs(from_addr.sin_port));
printf("len:%d msg:%s\n", len, buf);
}
//关闭套接字
close(sockfd);
return 0;
}