send和recv

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;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值