赞
踩
#include <stdio.h>
#include <sys/socket.h> //socket函数
#include <netinet/in.h> //struct sockaddr_in结构体
#include <string.h> //memset跟strlen
#include <arpa/inet.h> //bind函数
#include <unistd.h> //close函数
int main(int argc, const char *argv[])
{
int sockfd = socket(AF_INET, SOCK_DGRAM, 0); // include<sys/socket.h>
if (sockfd < 0)
{
perror("socket");
return 0;
}
struct sockaddr_in my_addr; // #include<netinet/in.h>
memset(&my_addr, 0, sizeof(my_addr)); // 初始化
my_addr.sin_family = AF_INET; // IPV4
my_addr.sin_port = htons(9000); // 端口号
my_addr.sin_addr.s_addr = htonl(INADDR_ANY); // 通配地址,发送者主机地址
int ret = bind(sockfd, (const struct sockaddr *)&my_addr, sizeof(my_addr));
if (ret < 0)
{
perror("bind");
return 0;
}
// recvfrom接收数据
while (1)
{
unsigned char buf1[1500] = ""; // 最大1500
struct sockaddr_in from_addr;
socklen_t from_len = sizeof(from_addr);
int len = recvfrom(sockfd, buf1, sizeof(buf1), 0, (struct sockaddr *)&from_addr, &from_len);
if (len < 0)
{
perror("recvfrom");
return 0;
}
char ip_str[16] = "";
inet_ntop(AF_INET, &from_addr.sin_addr.s_addr, ip_str, 16); // 获取发送者的IP
unsigned short port = ntohs(from_addr.sin_port);
printf("TP:%s PORT:%hu 长度:%d 消息:%s\n", ip_str, port, len, buf1);
close(sockfd);
return 0;
}
}
此代码是一个简单的UDP服务器程序,用于接收来自客户端的数据并输出发送者的IP地址、端口号、数据长度以及数据内容。以下是对代码的详细解读:
引入必要的头文件:
stdio.h
:标准输入输出库。sys/socket.h
:提供套接字函数的定义。netinet/in.h
:定义了 IP 地址结构 sockaddr_in
等。string.h
:提供字符串处理函数的定义。arpa/inet.h
:提供了一些 IP 地址转换函数的定义。unistd.h
:提供了一些系统调用函数的定义。在 main
函数中:
创建一个 UDP 套接字:int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
。
socket
函数创建一个基于 IPv4 的 UDP 套接字。定义并初始化服务器的地址结构体 my_addr
,并将套接字绑定到该地址:
- struct sockaddr_in my_addr;
- memset(&my_addr, 0, sizeof(my_addr));
- my_addr.sin_family = AF_INET;
- my_addr.sin_port = htons(9000);
- my_addr.sin_addr.s_addr = htonl(INADDR_ANY);
- int ret = bind(sockfd, (const struct sockaddr *)&my_addr, sizeof(my_addr));
在一个无限循环中接收数据并处理:
recvfrom
函数接收数据,并获取发送者的地址信息。解析接收到的数据:
buf1
中,数据的长度为 len
。inet_ntop
函数将发送者的IP地址转换为字符串形式,存储在 ip_str
中。ntohs
函数将端口号转换为主机字节序,并存储在 port
中。打印接收到的信息:
printf
函数输出发送者的IP地址、端口号、数据长度以及数据内容。关闭套接字并退出程序:
总结:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。