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。