Home >Database >Mysql Tutorial >网络编程(2)Socket同步非阻塞工作模式

网络编程(2)Socket同步非阻塞工作模式

WBOY
WBOYOriginal
2016-06-07 15:14:391166browse

同步非阻塞模式比前面说的那个同步阻塞模式要高些,虽然高得有限.在这种模式下,send或recv函数会设为MSG_DONTWAIT, 即非阻塞,即便没有,就略过继续做后面的事。比如有多个socket时,可以去查看其他socket有没有可以接收的数据。然后再反复检查前面的执行

        同步非阻塞模式比前面说的那个同步阻塞模式要高些,虽然高得有限.在这种模式下,send或recv函数会设为MSG_DONTWAIT,

即非阻塞,即便没有值,就略过继续做后面的事。比如有多个socket时,可以去查看其他socket有没有可以接收的数据。然后再反复检查前面的执行情况,直到有数据为止。

      这种模式优点是不阻塞了,但消耗的系统资源太多,因为它要不停的去检查,做了很多没有必要的调用。

一。Socket客户端例子
所用到的头文件在 网络编程(1)跨平台的Socket同步阻塞工作模式例子 中有.

代码如下:

/*************************************************
Author: xiongchuanliang
Description: 同步非阻塞工作模式例子_客户端代码
编译命令:
Linux:
g++ -o tcpclientnoblk tcpclientnoblk.cpp -m64 -I./common
**************************************************/

// 客户端代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "initsock.h"
#include "common.h"

int main(int argc, char* argv[])
{	  
	 int sclient = 0;	//连接服务端的套接字
	 int flags =  0;	//fcntl返回标识
	 int recvbytes = 0; //服务端返回的数据长度
	 char recvData[MAXDATASIZE] = {0};	//保存服务端返回的数据

	 //取出传入参数
	 const size_t MaxLen = 500;
	 char  testMsg[MaxLen]={0};

	 if(argc 
	 // #include <sys>
	 // ioctl(sclient,FIONBIO,&flags);

	//将套接字连接上服务器
	if( connect(sclient,(struct sockaddr *)&server_addr,sizeof(struct sockaddr) ) == -1)
	{
		PrintError("connect() failed");
		exit(EXIT_FAILURE);
	}
	
	//同步非阻塞模式--发送数据到服务端
	 while(send(sclient,testMsg,strlen(testMsg),MSG_DONTWAIT) == -1)
	 {
		  sleep(10);
		  printf("send() sleep(10)\n");
	 }
	 printf("send success!\n");
	
	//同步非阻塞模式--接收返回的数据	
	while( (recvbytes = recv(sclient,recvData,MAXDATASIZE,MSG_DONTWAIT)) == -1)
	{
		  sleep(10);
		  printf("recv() sleep(10)\n");
	 }
	 printf("recv success!\n");

	if( recvbytes == 0)
	{
		printf("recv() no data!\n");
	}else if( recvbytes 

<br>
二。总结<br>
设为非阻塞模式,主要就是更改Socket的属性。并设置 MSG_DONTWAIT.<br>
更改Socket属性提供了两种方法:<br>
方法一:<pre class="brush:php;toolbar:false">         flags = fcntl(sclient, F_GETFL, 0); //得到套接字描述符标识位
	 if(flags <br>
方法二:<pre class="brush:php;toolbar:false">#include <unistd.h>
	  #include <sys>
	  ioctl(sclient,FIONBIO,&flags);</sys></unistd.h>
   

   同时,在代码中,可以看到send和recv都放在while中,不停的检查返回值。效率并不高。


MAIL: xcl_168@aliyun.com

BLOG:http://blog.csdn.net/xcl168


Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Previous article:2015.2.26Next article:mysql与oracle 表字段定义比较