c语言的recv()非阻塞方法怎么弄哦

c语言的recv()非阻塞方法怎么弄哦,第1张

需要将recv设置超时,Linux下设置超时如下:

//设置发送超时

struct timeval timeout={3,0};//3s

setsockopt(socket,SOL_SOCKET,SO_SNDTIMEO,(char )&timeout,sizeof(struct timeval));

//设置接收超时

setsockopt(socket,SOL_SOCKET,SO_RCVTIMEO,(char )&timeout,sizeof(struct timeval));

windows下设置超时如下:

int timeout = 3000; //3s

int ret=setsockopt(sock_fd,SOL_SOCKET,SO_SNDTIMEO,&timeout,sizeof(timeout));

int ret=setsockopt(sock_fd,SOL_SOCKET,SO_RCVTIMEO,&timeout,sizeof(timeout));

阻塞

阻塞调用是指调用结果返回之前,当前线程会被挂起。函数只有在得到结果之后才会返回。有人也许会把阻塞调用和同步调用等同起来,实际上他是不同的。对于同

步调用来说,很多时候当前线程还是激活的,只是从逻辑上当前函数没有返回而已。例如,我们在CSocket中调用Receive函数,如果缓冲区中没有数

据,这个函数就会一直等待,直到有数据才返回。而此时,当前线程还会继续处理各种各样的消息。如果主窗口和调用函数在同一个线程中,除非你在特殊的界面 ***

作函数中调用,其实主界面还是应该可以刷新。socket接收数据的另外一个函数recv则是一个阻塞调用的例子。当socket工作在阻塞模式的时候,

如果没有数据的情况下调用该函数,则当前线程就会被挂起,直到有数据为止。

非阻塞

非阻塞和阻塞的概念相对应,指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。

  getch():

  所在头文件:conioh

  函数用途:从控制台读取一个字符,但不显示在屏幕上

  函数原型:int getch(void)

  返回值:读取的字符

  例如:

  char ch;或int ch;

  getch();或ch=getch();

  用getch();会等待你按下任意键,再继续执行下面的语句;

  用ch=getch();会等待你按下任意键之后,把该键字符所对应的ASCII码赋给ch,再执行下面的语句。

  易错点:

  1所在头文件是conioh。而不是stdioh。

  2在使用之前要调用initscr(),结束时要调用endwin()。否则会出现不输入字符这个函数

  也会返回的情况。

  3在不同平台,输入回车,getch()将返回不同数值,而getchar()统一返回10(即\n)

  1)windows平台下ENTER键会产生两个转义字符 \r\n,因此getch返回13(\r)。

  2)unix、 linux系统中ENTER键只产生 \n ,因此getch返回10(\n)。

  3)MAC OS中ENTER键将产生 \r ,因此getch返回13(\r)。

  getch();并非标准C中的函数,不存在C语言中。所以在使用的时候要注意程序的可移植性。国内C语言新手常常使用getch();来暂停程序且不知道此函数来源,建议使用getchar();(如果情况允许)代替此功能或更换一款编译器。

kbhit()(VC++60下为_kbhit())

  功 能及返回值: 检查当前是否有键盘输入,若有则返回一个非0值,否则返回0

  用 法:int kbhit(void);

  包含头文件: include <conioh>

编辑本段程序示例

C语言

  #include<conioh>

  int main(void)

  {

  cprintf("Press any key to continue:");

  while (!kbhit()) / do nothing / ;

  cprintf("\r\nA key was pressed\r\n");

  return 0;

  }

  下面的代码,如果没有键盘输入程序一直输出Hello World,直到用户按Esc结束

  #include <conioh>

  #include <stdlibh>

  int main( void )

  {

  char ch;

  while( !kbhit() )

  {

  cprintf("Hello World\n");

  if( kbhit() )

  ch = getch();

  if( 27 == ch )

  break;

  }

  cprintf("End!\n");

  system("pause");

  return 0;

  }

C++语言

  #include <conioh>

  #include <iostream>

  using namespace std;

  int main()

  {

  while(!kbhit()) //当没有键按下

  {

  cout<<"无键按下"<<endl;

  }

  cout<<"有键按下"<<endl; //有键按下时输出这

  system("pause");

  }

  kbhit() 在执行时,检测是否有按键按下,有按下返回非0值,一般是1

  没有按下返回0;是非阻塞函数

  getch() 在执行时,检测按下什么键,如果不按键该函数不返回;是阻塞函数

  类似地

  在Tc20中有一个处理键盘输入的函数bioskey();

  int bioskey(int cmd);

  当cmd为1时,bioskey()检测是否有键按下。没有键按下时返回0;有键按下时返回按键码(

  任何按键码都不为0),但此时并不将检测到的按键码从键盘缓冲队列中清除。 是非阻塞参数。

  当cmd为0时,bioskey()返回键盘缓冲队列中的按键码,并将此按键码从键盘缓冲队列中清

  除。如果键盘缓冲队列为空,则一直等到有键按下,才将得到的按键码返回。是阻塞调用。

  //个人理解kbhit()有点像bioskey(1)

在C语言中,没有像Turbo-Pascal中的keyPressed这样的内置函数。但是,您可以通过一些平台相关的库来实现类似的功能。

如果您使用的是Windows平台,可以使用Windows API中的_kbhit()函数。在这里,您需要包含conioh头文件。以下是使用_kbhit()的一个简单示例:

#include <conioh>

#include <stdioh>

int main() {

printf("Press any key to exit\n");

while (!_kbhit()) {

// 这里可以执行其他任务

}

return 0;

}

对于Linux和Unix平台,您可以使用ncurses库来实现类似的功能。首先,确保您已经安装了ncurses库。以下是使用ncurses实现按键检测的示例:

#include <ncursesh>

#include <unistdh>

int main() {

int ch;

initscr(); // 初始化ncurses

timeout(0); // 设置getch()为非阻塞模式

noecho(); // 禁止回显按键

cbreak(); // 禁用行缓冲

printw("Press any key to exit\n");

while (1) {

ch = getch(); // 获取按键

if (ch != ERR) {

break; // 如果检测到按键,退出循环

}

// 这里可以执行其他任务

}

endwin(); // 关闭ncurses

return 0;

}

getch();并非标准C中的函数,不存在C语言中。!!

所在头文件:conioh

建议换成getchar()之类的

getch()

getch():

所在头文件:conioh

函数用途:从控制台读取一个字符,但不显示在屏幕上

函数原型:int

getch(void)

返回值:读取的字符

例如:

char

ch;或int

ch;

getch();或ch=getch();

用getch();会等待你按下任意键,再继续执行下面的语句;

用ch=getch();会等待你按下任意键之后,把该键字符所对应的ASCII码赋给ch,再执行下面的语句。

易错点:1所在头文件是conioh。而不是stdioh。

2在使用之前要调用initscr(),结束时要调用endwin()。否则会出现不输入字符这个函数

也会返回的情况。

getch();并非标准C中的函数,不存在C语言中。所以在使用的时候要注意程序的可移植性。国内C语言新手常常使用getch();来暂停程序且不知道此函数来源,建议使用getchar();(如果情况允许)代替此功能或更换一款编译器。

int delTheNode(SLink &L,int i)

{

if(L == NULL)

return 0;

int j = 0;

if(i == 0)

{

L = L->next;

return 1;

}

SLink k = L;

while(k->next != NULL)

{

if(j == i -1)

{

k->next = k->next->next;

return 1;

}

k = k->next;

j++;

}

return 0;

}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/11669153.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-17
下一篇 2023-05-17

发表评论

登录后才能评论

评论列表(0条)

保存