TCP、UDP套接字的数据传输

2018-06-18 04:08:04来源:未知 阅读 ()

新老客户大回馈,云服务器低至5折

tcp发送数据:

1 #include <sys/types.h>
2 #include <socket.h>
3 ssize_t send(int sockfd,const void *msg,size_t len,int flags);

    函数send只能对面向连接的套接字使用。参数sockfd为已经建立好连接的套接字描述符。参数msg指向待发送数据的缓冲区,参数len为代发数据的长度。参数flags为控制选项:

  • MSG_OOB:在指定的套接字上发送带外数据(out-of-band data),该类型的套接字必须支持带外数据(如SOCK_STREAM)。

  • MSG_DONTROUTE:通过最直接的路径发送数据,而忽略下层协议的路由设置。

PS:函数执行成功只是说明数据写入套接字的缓冲区中,并不表示数据已经成功地通过网络发送到目的地。

tcp接收数据:

#include <sys/types.h>
#include <sys/socket.h>
ssize_t recv(int sockfd,void *buf,size_t len,int flags);

    函数从sockfd接受数据并保存到参数buf中,参数len为缓冲区的长度。(只能是面向连接的套接字)参数flags为控制选项:

  • MSG_OOB:请求接受带外数据。

  • MSG_PEEK:只查看数据而不读出。

  • MSG_WAITALL:只在接受缓冲区满时才返回。

    如果一个数据报太长以至于无法完全放下时,剩余部分将可能丢弃。如果在指定的套接字上无数据到达时,recv函数将阻塞。成功返回收到的字节数,出错-1,错误代码errno。

UDP发送数据:

#include <sys/types.h>
#include <sys/socket.h>
ssize_t sendto(int sockfd,const void *msg,size_t len,int flags,
               const struct sockaddr *to,socklen_t tolen);

函数sendto的功能和send类似,但函数sendto不需要套接字一定是面向连接的,所以该函数主要用来发送UDP数据。参数to指定目的地地址。

UDP接收数据:

#include <sys/types.h>
#include <sys/socket.h>
ssize_t recvfrom(int sockfd,void *buf,size_t len,int flags,
                 struct sockaddr *from,socklen_t *fromlen);

函数recvfrom与函数recv类似,但recvfrom不要求套接字一定是面向连接的。如果参数from非空,且该套接字不是面向连接的,则函数返回时,参数from中将保存数据的源地址。

关闭套接字:

#include <unistd.h>
int close(int fd);
#include <sys/socket.h>
int shutdown(int s,int how);

参数how的取值:

  • SHUT_RD:将连接的读通道关闭,接收缓冲区中的未读取数据将丢弃,仍可以发送数据。

  • SHUT_WR:将连接的写通道关闭,发送缓冲区中的为发送的数据丢弃,仍可以接收数据。

  • SHUT_REWR:读写通道都关闭。

  • 成功0,出错-1,errno。

 

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:13:将字符串中的小写字母转换成大写字母

下一篇:选择排序_C语言_数组