UDP套接字的数据传输.套接字的关闭

时间:2021-05-12 19:15:16

1.发送数据

#include <sys/types.h> #include <sys/socket.h> ssize_t  sendto(int s,const void *msg,size_t  len ,int flags,const  struct  sockaddr   *to,socklen_t  tolen); 函数sendto的功能与参数send类似,但函数sendto不需要套接字处于连接状态,所以该函数通常用来发送UDP数据,同时因为是无连接的套接字,在使用sendto时需要指定数据目的地址. 参数msg 指向待发送数据的缓存区,参数len指定了待发送数据的长度,参数flags是控制选项,含义与send() 一致,参数to用于指定目的地址,目的地址的长度由tolen指定; 执行成功返回 实际发送的数据的字节数,出错返回-1;

char send_buf[BUFFERSIZE];
struct socketaddr_in     dest_addr;
//设置目的地址;
dest_addr.sin_family = AF_INET;
dest_addr.sin_port = htons(DEST_PORT);
if(inet_aton("172.17.242.131",&dest_addr.sin_addr)<0)
{
        perror("inet_aton");
        exit(1);
}
if(sendto(sockfd,send_buf,len,0,(struct sockaddr *)&dest_addr,sizeof(struct sockaddr_in))<0)
{
        perror("sendto");
        exit(1);
}

 2.接收数据

#include <sys/types.h> #include <sys/socket.h> ssize  recvfrom(int s,void  *buf,size_t len,int flags,struct sockaddr *from,socklen_t    *fromlen);, 函数recvfrom与函数recv功能相似,只是recv是面向连接的套接字 ,而函数recvfrom没有此限制,可以用于从无连接的套接字(UDP)上接收数据; 参数buf指定接收缓冲区,参数len指定了缓冲区的大小,参数flags控制选项如果参数from非空,且该套接字不是面向连接的,则函数recvfrom返回时,参数from将保存数据的源地址,参数fromlen在调用recvfrom前为参数from的长度, 调用recvfrom后保存from的实际大小;执行返回实际接收的数据的字节数.

//UDP的数据接收
char recv_buf[BUFFERSIZE];
struct sockaddr_in   src_addr;
int src_len;
src_len=sizeof(struct  sockaddr_in);
if(recvfrom(sockfd,recv_buf,sizeof(recv_buf),0,(struct sockaddr *)&src_addr,&src_len)<0)
{
        perror("again_recvfrom");
        exit(1);
}

 3.关闭套接字

1.函数close() 函数close()用来关闭一个套接字描述符,它与关闭文件描述符是类似的. #include <unistd.h> int close(int fd); 参数fd为一个套接字描述符,该函数关闭一个套接字; 2.函数shutdown() 函数shutdown也用于关闭一个套接字描述符. #include <sys/socket.h> int shutdown(int s,int how); 参数how指定关闭的方式

  • SHUT_RD:将连接上的读通道关闭,此后进程将不能再接收任何数据,接收缓冲区中数据也将被丢弃,但仍然可以在该套接字上发送数据.
  • SHUT_WR:将连接上的写通道关闭,此后进程将不能再发送任何数据,发送缓冲区的还位被数据也将被丢弃,但仍然可以在该套接字上接收数据.
  • SHUT_RDWR:读写通道都将关闭.

执行成功返回0,出错返回-1,错误代码存入errno中.