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

Python012

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))

说实在的这个问题非常简单,不过你习惯太差,你把send和recv的返回值看看不就明白了!

前提是你描述的都是事实。

否则还可能有Socket问题。

如果是linux,strace一下就知道什么问题了。

Windows的也很简单。

前面的明显不正确,send如果是TCP,(UDP 不应该用send),send返回时,消息已经发出了。

你的代码其实没有任何问题,之所以 server 没有打印,是由于server最后打印时的代码是

printf("%s",buff)

把它改成

printf("%s\n",buff)

即可。 标准输出是行缓冲的,所以如果打印的内容没有 \n 了话,内容不会真正打印出来,而是留在缓冲中。

至于你client打印时

printf("recv from server :%s", buff)

虽然没有在后面加 \n, 但是你从server发到client的消息里已经带有 \n 了,所以这里没出问题。

关于标准输入输出缓冲相关的更多细节,自己搜一下吧。

htons和inet_aton有什么区别?

htons 是把 主机使用的字节序转成网络字节序 (即入参是整数,返回值也是整数)

而 inet_aton 是吧 ascii 字符串形式的IP地址 转换成 网络字节序的整数。

自己去搜一下网络字节序相关信息。