recv和write只能用于套接字。
需要库
#include<sys/socket.h>
send函数用于向已连接的套接字发送数据
ssize_t send(int sock,const void *buffer,size_t length, int flags);
fd指定套接字描述符;
buf 发送数据缓冲区;
len 发送数据大小;
flag 指明消息传送的类型;
参数flags的取值
MSG_OOB 发送数据是成为带外数据
MSG_DONTROUTE 数据不包括路由信息
EWOULDBLOCK 不能发送立即返回,不阻塞。
recv函数用于从已连接的套接字接受消息。
ssize_t recv(int socket, void* buffer, size_t length, int flags);
参数flags取值
MSG_OOB 读带外数据
MSG_PEEK 窥探套接字的数据而不读出
MSG_WAITALL 请求堵塞知道数据读完,可能小于要求数据大小,原因出现信号,连接中断;
举例:
服务端
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include <signal.h>
#include <fcntl.h>
#include <unistd.h>
int listenfd, connfd;
void sig_urg(int signo);
int main()
{
int n;
char buff[100];
socklen_t len;
struct sockaddr_in servaddr, cliaddr;
struct sigaction action;
action.sa_handler=sig_urg;
sigemptyset(&action.sa_mask);
action.sa_flags=0;
listenfd=socket(AF_INET, SOCK_STREAM,0);
if(listenfd<0)
{
printf("Socket created failed.\n");
return -1;
}
servaddr.sin_family=AF_INET;
servaddr.sin_port=htons(6666);
servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
if(bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr))<0)
{
printf("bind failed.\n");
return -1;
}
printf("listening....\n");
listen(listenfd, 5);
len=sizeof(cliaddr);
connfd=accept(listenfd,(struct sockaddr *)&cliaddr, &len);
if(sigaction(SIGURG,&action, NULL)==-1)
{
printf("Couldn't register signal handler.\n");
return -2;
}
fcntl(connfd,F_SETOWN,getpid());
while(1)
{
if((n=read(connfd,buff,sizeof(buff)))==0)
{
printf("received EOF \n");
return 0;
}
if(n>0)
{
buff[n]=0;
printf("read %d bytes is: %s \n",n,buff);
}
}
}
void sig_urg(int signo)
{
int n;
char buff[100];
n=recv(connfd,buff,sizeof(buff),MSG_OOB);
buff[n]=0;
printf("SIGURG received is recv %d byte: %s\n",n,buff);
memset(buff,0,sizeof(buff));
}
客户端
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
int main()
{
int sockfd,n;
struct sockaddr_in servaddr;
sockfd=socket(AF_INET,SOCK_STREAM,0);
if(sockfd<0)
{
printf("Socket created failed.\n");
return -1;
}
servaddr.sin_family=AF_INET;
servaddr.sin_port=htons(6666);
servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
printf("connecting...\n");
if(connect(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr))<0)
{
printf("Connect Error.\n");
return -1;
}
write(sockfd,"123",3);
printf("write 3 byte of normal data. \n");
sleep(1);
send(sockfd,"a",1,MSG_OOB);
printf("send 1 byte of OOB data.\n");
sleep(1);
write(sockfd,"56",2);
printf("write 2 byte of normal data \n");
sleep(1);
send(sockfd,"b",1,MSG_OOB);
printf("send 1 byte of OOB data\n");
sleep(1);
write(sockfd,"89",2);
printf("write 2 byte of normal data \n");
sleep(1);
return 0;
}