UDP——服务器程序设计
步骤
1)创建一个socket,用函数socket();
2)绑定IP地址、端口等信息到socket上,用函数bind();
3)循环接收数据,用函数recvfrom();
4)关闭网络连接
UDP——客户端程序设计
步骤
1)创建一个socket,用函数socket();
2)绑定IP地址、端口等信息到socket上,用函数bind();
3)设置对方的IP地址和端口等属性;
4)发送数据,用函数sendto();
5)关闭网络连接;
示例
udp_server.c
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <netdb.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <arpa/inet.h>
#define SERVER_PORT 8888
#define MAX_MSG_SIZE 1024
void udps_respon(int sockfd)
{
struct sockaddr_in addr;
int addrlen, n;
char msg[MAX_MSG_SIZE];
while(1)
{
bzero(msg, sizeof(msg));
addrlen = sizeof(struct sockaddr);
n = recvfrom(sockfd, msg, MAX_MSG_SIZE, 0, (struct sockaddr*)&addr, &addrlen);
msg[n] = 0;
//显示收到的消息
fprintf(stdout, "Server have received %s", msg);
}
}
int main()
{
int sockfd;
struct sockaddr_in addr;
//socket
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if(sockfd < 0)
{
fprintf(stderr, "Socket error:%s\n", strerror(errno));
exit(1);
}
//sockaddr
bzero(&addr, sizeof(struct sockaddr_in));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = htonl(INADDR_ANY);
addr.sin_port = htons(SERVER_PORT);
//bind
if(bind(sockfd, (struct sockaddr*)&addr, sizeof(struct sockaddr_in)) < 0)
{
fprintf(stderr, "Bind error:%s\n", strerror(errno));
exit(1);
}
udps_respon(sockfd);
close(sockfd);
return 0;
}
udp_client.c
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <netdb.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <arpa/inet.h>
#define SERVER_PORT 8888
#define MAX_BUF_SIZE 102
void udpc_requ(int sockfd, const struct sockaddr_in *addr, int len)
{
char buffer[MAX_BUF_SIZE];
int n;
while(1)
{
printf("Please input char:\n");
fgets(buffer, MAX_BUF_SIZE, stdin);
sendto(sockfd, buffer, strlen(buffer), 0, addr, len);
bzero(buffer, MAX_BUF_SIZE);
}
}
int main(int argc, char **argv)
{
int sockfd;
struct sockaddr_in addr;
if(argc != 2)
{
fprintf(stderr, "Usage:%s server_ip\n", argv[0]);
exit(1);
}
//socket
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if(sockfd < 0)
{
fprintf(stderr, "Socket error:%s\n", strerror(errno));
exit(1);
}
bzero(&addr, sizeof(struct sockaddr_in));
addr.sin_family = AF_INET;
addr.sin_port = htons(SERVER_PORT);
if(inet_aton(argv[1], &addr.sin_addr) < 0)
{
fprintf(stderr, "Ip error:%s\n", strerror(errno));
exit(1);
}
udpc_requ(sockfd, &addr, sizeof(struct sockaddr_in));
close(sockfd);
return 0;
}
编译运行udp_server:
[root@192 udp]# gcc udp_server.c -o udp_server
[root@192 udp]# ls
udp_client udp_client.c udp_server udp_server.c
[root@192 udp]# ./udp_server
编译运行udp_client并输入例如"123":
[root@192 udp]# gcc udp_client.c -o udp_client ^
[root@192 udp]# ls
udp_client udp_client.c udp_server udp_server.c
[root@192 udp]# ./udp_client 192.168.0.108
Please input char:
123
Please input char:
udp_server端打印如下:
[root@192 udp]# ./udp_server
Server have received 123