UDP – 面向无连接, 不安全的传输层协议.
API:
//创建套接字
int socket(int domain, int type, int protocol);
参数:
domain
type: tcp - 流式协议 udp - 报式协议
protocol - 协议类型, 会根据type默认为TCP或UDP
返回值:文件描述符(套接字)
//将本地的IP和端口与创建出的套接字绑定
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
参数:
sockfd - 创建出的文件描述符
addr - - 端口和IP
addrlen - addr结构体的长度
//接收数据: recvfrom
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen);
参数:
fd - 文件描述符
buf: 接收数据缓冲区
len: buf的最大容量
flags: 0
src_addr: 另一端的IP和端口, 传出参数
addrlen: 传入传出参数
//发送数据: sendto
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t sockaddr *dest_addr, socklen_t addrlen);
参数:
sockfd: socket函数创建出来的 buf: 存储发送的数据
len: 发送的数据的长度
flags: 0
dest_addr: 另一端的IP和端口
addrlen: dest_addr长度
服务端代码
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>
#include <arpa/inet.h>
#include <ctype.h>
int main(int argc, const char* argv[])
{
int fd = socket(AF_INET, SOCK_DGRAM, 0);
struct sockaddr_in serv_addr;
bzero(&serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(8888);
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
int ret = bind(fd, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
if(ret == -1)
{
perror("bind error");
exit(1);
}
char bufip[128];
struct sockaddr_in clien;
socklen_t clien_len = sizeof(clien);
while(1)
{
char buf[1024] = {0};
int len = recvfrom(fd, buf, sizeof(buf), 0, (struct sockaddr*)&clien, &clien_len);
if(len == -1)
{
perror("recvfrom error");
exit(1);
}
printf("client ip: %s, port: %d\n",
inet_ntop(AF_INET, &clien.sin_addr.s_addr, bufip, sizeof(bufip)),
ntohs(clien.sin_port));
printf("read buf = %s\n", buf);
for(int i=0; i<len; ++i)
{
buf[i] = toupper(buf[i]);
}
printf("touper: %s\n", buf);
len = sendto(fd, buf, strlen(buf)+1, 0, (struct sockaddr*)&clien, clien_len);
if(len == -1)
{
perror("sendto error");
exit(1);
}
}
close(fd);
return 0;
}
客户端代码:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>
#include <arpa/inet.h>
int main(int argc, const char* argv[])
{
int fd = socket(AF_INET, SOCK_DGRAM, 0);
struct sockaddr_in serv_addr;
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(8888);
inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr.s_addr);
while(1)
{
char buf[1024] = {0};
fgets(buf, sizeof(buf), stdin);
int ret = sendto(fd, buf, strlen(buf)+1, 0, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
if(ret == -1)
{
perror("sendto error");
exit(1);
}
int servlen = sizeof(servlen);
ret = recvfrom(fd, buf, sizeof(buf), 0, (struct sockaddr*)&serv_addr, &servlen);
if(ret == -1)
{
perror("recvfrom error");
exit(1);
}
printf("recv buf = %s\n", buf);
}
return 0;
}
```