UDP网络编程的小前提
其大致流程如下:
UDP服务器和客户端实现需要的头文件
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
主要分为以下4个板块:
- 创建套接字;
- 绑定地址信息;(其中这个部分传参要考虑到其结构体的特殊性)
- 接收消息;
- 发送消息
服务端:(server)
- svr.cpp
#include <stdio.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string>
#include <iostream>
int main()
{
//创建套接字
int sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if(sockfd < 0)
{
perror("socket");
return -1;
}
//绑定地址信息
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr("0.0.0.0") ;//ip
addr.sin_port = htons(19999);
int ret = bind(sockfd, (struct sockaddr*)&addr, sizeof(addr));
if(ret < 0)
{
perror("bind");
return -1;
}
while(1)
{
char buf[1024] = { 0 };
struct sockaddr_in peer_addr;
socklen_t peer_addr_len = sizeof(peer_addr);
ssize_t recv_size = recvfrom(sockfd, buf, sizeof(buf) - 1, 0, (struct sockaddr*)&peer_addr, &peer_addr_len);
if(recv_size < 0)
{
perror("recvfrom");
continue;
}
printf("cli say: %s\n", buf);
//1.已经拥有了发送方的地址信息结构和地址信息长度
//2.组织要返回给发送方的数据,并且调用sendto
std::string s;
std::cin >> s;
ssize_t send_size = sendto(sockfd, s.c_str(), s.size(), 0, (struct sockaddr*)&peer_addr, peer_addr_len);
if(send_size < 0)
{
perror("sendto");
continue;
}
}
close(sockfd);
//
return 0;
}
- makefile
svr:svr.cpp
g++ $^ -o $@ -g
客户端(client):
- cli.cpp
#include <stdio.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string>
#include <iostream>
int main()
{
//创建套接字
int sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if(sockfd < 0)
{
perror("socket");
return -1;
}
//服务端的地址信息结构 包括服务端的ip和port
struct sockaddr_in svr_addr;
svr_addr.sin_family = AF_INET;
svr_addr.sin_port = htons(19999);
svr_addr.sin_addr.s_addr = inet_addr("0.0.0.0");
while(1)
{
std::string s;
std::cin >> s;
ssize_t send_size = sendto(sockfd, s.c_str(), s.size(), 0, (struct sockaddr*)&svr_addr, sizeof(svr_addr));
if(send_size < 0)
{
perror("sendto");
continue;
}
char buf[1024] = { 0 };
struct sockaddr_in peer_addr;
socklen_t peer_addr_len = sizeof(peer_addr);
ssize_t recv_size = recvfrom(sockfd, buf, sizeof(buf) - 1, 0, NULL, NULL);
if(recv_size < 0)
{
perror("recvfrom");
continue;
}
printf("svr say: %s\n", buf);
}
close(sockfd);
//
return 0;
}
- makefile
cli:cli.cpp
g++ $^ -o $@ -g