//设置发送超时
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地址 转换成 网络字节序的整数。
自己去搜一下网络字节序相关信息。