linux下udp编程
时间: 2023-09-12 18:06:07 浏览: 44
在Linux下进行UDP编程,可以使用C语言的套接字(socket)编程。下面是一个简单的UDP客户端和服务器的示例,你可以参考它进行开发。
UDP客户端:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define SERVER_IP "127.0.0.1"
#define SERVER_PORT 8000
int main(int argc, char *argv[])
{
int sockfd;
struct sockaddr_in server_addr;
char send_buf[1024] = "Hello, UDP server!";
char recv_buf[1024] = {0};
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd < 0) {
perror("socket error");
exit(-1);
}
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = inet_addr(SERVER_IP);
server_addr.sin_port = htons(SERVER_PORT);
sendto(sockfd, send_buf, strlen(send_buf), 0,
(struct sockaddr *)&server_addr, sizeof(server_addr));
recvfrom(sockfd, recv_buf, sizeof(recv_buf), 0, NULL, NULL);
printf("recv from server: %s\n", recv_buf);
close(sockfd);
return 0;
}
```
UDP服务器:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define SERVER_PORT 8000
int main(int argc, char *argv[])
{
int sockfd;
struct sockaddr_in server_addr, client_addr;
char recv_buf[1024] = {0};
char send_buf[1024] = "Hello, UDP client!";
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd < 0) {
perror("socket error");
exit(-1);
}
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
server_addr.sin_port = htons(SERVER_PORT);
if (bind(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {
perror("bind error");
exit(-1);
}
printf("UDP server is running...\n");
while (1) {
socklen_t len = sizeof(client_addr);
int n = recvfrom(sockfd, recv_buf, sizeof(recv_buf), 0,
(struct sockaddr *)&client_addr, &len);
if (n < 0) {
perror("recvfrom error");
continue;
}
printf("recv from client %s:%d : %s\n",
inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port), recv_buf);
sendto(sockfd, send_buf, strlen(send_buf), 0,
(struct sockaddr *)&client_addr, sizeof(client_addr));
}
close(sockfd);
return 0;
}
```
这里的服务器会一直监听客户端发送的消息,并且将收到的消息原样返回给客户端。你可以在命令行中编译并运行这两个程序,然后在另一个终端中使用netcat等工具向服务器发送UDP报文,观察服务器的响应。