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中.