#include <sys/socket.h>
ssize_t recvfrom(int sockfd, void* buf, size_t count, int flags, struct sockaddr* src_addr, socklen_t* addrlen);
功能:接收数据
参数:前四个参数和函数recv相同
src_addr:输出源主机的地址信息
addrlen:输入输出源主机的地址信息的字节数
返回值:成功返回实际接收的字节数,失败返回-1
include <sys/socket.h>
ssize_t sendto(int sockfd, void const* buf, size_t count, int flags,struct sockaddr const* dest_addr, socklen_t addrlen);
功能:发送数据
参数:前四个参数和函数send相同
dest_addr:目的主机的地址信息。
addrlen:目的主机的地址信息的字节数。
返回值:成功返回实际发送的字节数,失败返回-1
| 步骤 |
服务器 |
客户机 |
步骤 |
| 1 |
创建套接字 socket |
socket 创建套接字 |
1 |
| 2 |
准备地址结构 sockaddr_in |
sockaddr_in 准备地址结构 |
2 |
| 3 |
绑定地址 bind |
—— |
—— |
| 4 |
接收请求 recvfrom |
sendto 发送请求 |
3 |
| 5 |
发送响应 sendto |
recvfrom 接收响应 |
4 |
| 6 |
关闭套接字 close |
close 关闭套接字 |
5 |
| 步骤 |
服务器操作 |
服务器函数 |
客户机函数 |
客户机操作 |
步骤 |
| 1 |
创建套接字 |
socket |
socket |
创建套接字 |
1 |
| 2 |
准备地址结构 |
sockaddr in |
sockaddr in |
准备地址结构 |
2 |
| 3 |
绑定地址 |
bind |
connect |
建立连接 |
3 |
| 4 |
接收请求 |
recvfrom |
send/write |
发送请求 |
4 |
| 5 |
发送响应 |
sendto |
recv/read |
接收响应 |
5 |
| 6 |
关闭套接字 |
close |
close |
关闭套接字 |
6 |
//基于udp的服务器
#include<stdio.h>
#include<ctype.h>
#include<string.h>
#include<unistd.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<arpa/inet.h>
int main(void){
printf("服务器:创建套接字\n");
int sockfd = socket(AF_INET,SOCK_DGRAM,0);
if(sockfd == -1){
perror("socket");
return -1;
}
printf("服务器:组织地址结构\n");
struct sockaddr_in ser;
ser.sin_family = AF_INET;
ser.sin_port = htons(9090);
ser.sin_addr.s_addr = inet_addr("192.168.249.129");
printf("服务器:绑定套接字和地址结构\n");
if(bind(sockfd,(struct sockaddr*)&ser,sizeof(ser)) == -1){
perror("bind");
return -1;
}
printf("服务器:业务处理\n");
for(;;){
//接收数据
char buf[64] = {};
struct sockaddr_in cli;//客户端地址结构
socklen_t len = sizeof(cli);//地址结构大小
if(recvfrom(sockfd,buf,sizeof(buf)-1,0,
(struct sockaddr*)&cli,&len) == -1){
perror("recvfrom");
return -1;
}
//转大写
for(int i = 0;i < strlen(buf);i++){
buf[i] = toupper(buf[i]);
}
//回传给客户端
if(sendto(sockfd,buf,strlen(buf),0,
(struct sockaddr*)&cli,len) == -1){
perror("sendto");
return -1;
}
}
printf("服务器:关闭套接字\n");
close(sockfd);
return 0;
}
//基于udp的客户端
#include<stdio.h>
#include<string.h>
#include<unistd.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<arpa/inet.h>
int main(void){
printf("客户端:创建套接字\n");
int sockfd = socket(AF_INET,SOCK_DGRAM,0);
if(sockfd == -1){
perror("socket");
return -1;
}
printf("客户端:组织服务器的地址结构\n");
struct sockaddr_in ser;
ser.sin_family = AF_INET;
ser.sin_port = htons(9090);
ser.sin_addr.s_addr = inet_addr("192.168.249.129");
printf("客户端:业务处理\n");
for(;;){
char buf[64] = {};
fgets(buf,sizeof(buf),stdin);
if(strcmp(buf,"!\n") == 0){
break;
}
if(sendto(sockfd,buf,strlen(buf),0,
(struct sockaddr*)&ser,sizeof(ser)) == -1){
perror("sendto");
return -1;
}
if(recv(sockfd,buf,sizeof(buf)-1,0) == -1){
perror("recv");
return -1;
}
printf("%s",buf);
}
printf("客户端:关闭套接字\n");
close(sockfd);
return 0;
}