UDP服务端
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define ERR_EXIT(msg)\
do\
{ \
perror("msg"); \
exit(EXIT_FAILURE); \
}while(0)
int main()
{
//创建套接字
int sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if(sock == -1)
ERR_EXIT("create socket error");
//服务端套接字地址信息
struct sockaddr_in addr;
addr.sin_family = AF_INET;
//地址使用INADDR_ANY宏绑定可以接受主机任意IP消息(多个网卡有多个IP,或者一个网卡设置多个IP)
addr.sin_addr.s_addr = INADDR_ANY;
//需要将主机字节序转换为网络字节序(端口号用短整型表示)
addr.sin_port = htons(9000);
//绑定地址信息
int ret = bind(sock, (struct sockaddr*)&addr, sizeof(struct sockaddr_in));
if(ret == -1)
ERR_EXIT("bind error");
char buff[1024] = { 0 };
struct sockaddr_in client;
while(1)
{
socklen_t len = sizeof(client);
//接受消息同时会拿到对方的地址信息,用于回复消息
memset(buff, 0, sizeof(buff));
recvfrom(sock, (void *)buff, 1023, 0, (struct sockaddr*)&client, &len);
printf("[%s : %d]# %s\n", inet_ntoa(client.sin_addr), ntohs(client.sin_port), buff);
//发送消息
memset(buff, 0, sizeof(buff));
printf("Please Enter:");
scanf("%s", buff);
sendto(sock, (void *)buff, strlen(buff), 0, (struct sockaddr *)&client, len);
}
return 0;
}
UDP客户端
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define ERR_EXIT(msg)\
do\
{ \
perror("msg"); \
exit(EXIT_FAILURE); \
}while(0)
int main(int argc, char * argv[])
{
//创建套接字
int sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if(sock == -1)
ERR_EXIT("create socket error");
//服务端套接字地址信息(用于发送)
struct sockaddr_in server;
server.sin_family = AF_INET;
server.sin_port = htons(atoi(argv[2]));
server.sin_addr.s_addr = inet_addr(argv[1]);
//客户端套接字可以不绑定地址信息,发送时由内核自己选择接口进行绑定,
char buff[1024] = { 0 };
while(1)
{
//发送消息
memset(buff, 0, sizeof(buff));
printf("Please Enter:");
scanf("%s", buff);
sendto(sock, (void *)buff, strlen(buff), 0, (struct sockaddr *)&server, sizeof(server));
//接受消息
memset(buff, 0, sizeof(buff));
recvfrom(sock, (void *)buff, 1023, 0, NULL, NULL);
printf("server# %s\n", buff);
}
return 0;
}
相关函数socket套接字及相关函数介绍
最后的是监听环回接口 9000端口产生的包即UDP网络程序相互发送的数据报,这块就可以解释当发送地址和接口地址相同时会被环回驱动程序放入IP输入队列 环回驱动程序
服务器监听任意IP 9000端口