网络编程2
udp通讯
基于Udp 编程:
服务器端
- 创建socket ,返回该设备的文件描述符
- 将fd 和本地的ip 地址 端口号 绑定
while (1)- 使用 recvfrom(2)阻塞等待客户端请求数据的到来
- 处理客户端的请求
- 将处理结果返回给客户端 sendto(2)
- 关闭fd
客户端模型
- 创建socket 设备
- 使用sendto(2) 向服务器发送消息
- 使用recvfrom(2)阻塞等待服务器 的相应消息
- 处理响应消息
- 关闭fd
udp 系统调用
recvfrom
#include <sys/types.h>
#include <sys/socket.h>
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen);
功能:从一个socket 设备上接收一条消息
参数 :
sockfd : 就是socket 设备,从这个设备上接收一条消息
buf : 将接收到的消息存储到buf 指定的地址空间中
len : buf中指定的地址空间的大小
flags : 0
src_addr : 将消息的源地址保存在这里
addrlen : 值-结果参数
如果对消息的源地址不感兴趣, src_addr 和addr_len 可以置空
返回值
失败 -1 errno
成功 返回接收到的字节数
sendto
#include <sys/types.h>
#include <sys/socket.h>
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
const struct sockaddr *dest_addr, socklen_t addrlen);
功能:在指定的socket 设备上发送一条消息
参数 :
sockfd : 指定socket 设备
buf : 将buf 中的数据发送出去
len : 指定要发送的字节数
flags : 0
dest_addr: 指定目标地址
addrlen : 指定dest_addr 空间的大小
如果对消息的源地址不感兴趣, src_addr 和addr_len 可以置空
返回值
失败 -1 errno
成功 返回接收到的字节数
客户端简短示例
#include <stdio.h>
#include <ctype.h>
#include <unistd.h>
#include <string.h>
//#define DEBUG
#include <t_net.h>
int main(int argc, char * argv[])
{
printf("socket");
char *str = "this is a test...\n";
int sfd,ret;
char buf[128];
SA4 serv;
serv.sin_family= AF_INET;
serv.sin_port = htons(3344);
inet_pton(AF_INET,argv[1],&serv.sin_addr);
D_BUG("socket");
sfd = socket(AF_INET,SOCK_DGRAM,0);
sendto(sfd, str, strlen(str) + 1, 0,(SA*)&serv,sizeof(serv));
int r = recvfrom(sfd, buf, 128, 0,NULL, NULL);
write(1,buf,r);
close(sfd);
return 0;
}
服务器端简单示例
#include <sys/wait.h>
#include <stdlib.h>
#include <signal.h>
extern int t_main(int fd);
int main(int argc, char * argv[])
{
int sfd,cfd,r;
char buf[128];
SA4 cli ;
socklen_t len = sizeof(cli);
sfd=s_bind(SOCK_DGRAM,3344);
D_BUG("s_bind");
if (sfd == -1){
perror("s_listen");
return -1;
}
while (1)
{
r = recvfrom(sfd, buf, 128, 0,(SA*)&cli, &len);
if (r > 0) {
for(int i=0;i < r;i++)
{
buf[i]= toupper(buf[i]);
}
}
sendto(sfd, buf, 128, 0,(SA*)&cli, sizeof(cli));
}
close(cfd);
return 0;
}