赞
踩
TCP和UDP的本质区别就在于:UDP是无连接不可靠的数据报协议,TCP是面向连接的可靠字节流。因此使用TCP和UDP编写的应用程序存在一些差异。使用UDP编写的一些常见的应用程序有:DNS(域名解析系统)、NFS(网络文件系统)和SNMP(简单网络管理协议)。
类似与标准的read和write函数:
#include <sys/socket.h>
ssize_t recvfrom (int sockfd,void *buff,size_t nbytes,int flags,
struct sockaddr *from,socklen_t *addrlen);
ssize_t sendto (inat sockfd,const void * buff,size_t nbytes,int flags,
const struct sockaddr*to,socklen_t addrlen);
参数说明:
回忆read和write函数,前三个参数分别是:fd,buf,nbytes分别表示:描述符,指向读入或写出缓冲区的指针和读写的字节数,跟我们上述的recvfrom和sendto就是对应的。
对于sendto
来说,顾名思义,我们需要一个参数包含数据报接收者的协议地址(IP和端口号),上述 const struct sockaddr * to
就是这样一个参数,它指向了接收者的协议地址,另外我们需要一个addrlen,防止内核读取指针地址越界,这个套路跟以前见过TCP套接字函数中的用法一样。
对于recvfrom
来说,struct sockaddr * from
和 socklen_t *addrlen
是值-结果参数,返回发送数据者的协议地址结构,如果部关系发送者的协议地址,那么我们可以完全把这两个参数设定为NULL。
最基本的UDP回射服务器程序。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>
#define SERV_PORT 1024
#define MAXLEN 1024
void dg_echo(int sockfd,struct sockaddr*pcliaddr,socklen_t clilen);
int main()
{
int sockfd;
struct sockaddr_in servaddr,cliaddr;
if((sockfd=socket(AF_INET,SOCK_DGRAM,0))<0)
{
printf("socket error\r\n");
return -1;
}
//服务器套接字结构
memset(&servaddr,0x00,sizeof(servaddr));
servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
servaddr.sin_port=htons(SERV_PORT);
servaddr.sin_family=AF_INET;
bind(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr));
dg_echo(sockfd,(struct sockaddr *)&cliaddr,sizeof(cliaddr));
return 0;
}
void dg_echo(int sockfd ,struct sockaddr* pcliaddr,socklen_t clilen)
{
char buf[MAXLEN];
int n;
int len = clilen;
while(1)
{
if((n=recvfrom(sockfd,buf,MAXLEN,0,pcliaddr,&len))<=0)//阻塞
{
printf(
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。