1.在这里要说一下本地ip和自定义ip
一般虚拟机的本地ip为127.0.0.1,在配置文件/etc/hosts 中可以看到 这样子
127.0.0.1 localhost
如果/etc/hosts 的localhost为某ip,那么你在sockect中的ip也只能写为该ip地址
即:
sockfd.sin_addr.s_addr=inet_addr("xxx.xxx.xxx.xxx");//其中xxx.xxx.xxx.xxx为/etc/hosts中localhost的ip地址
2.两台虚拟机要socket在一起,必须服务器的ip地址设置好,端口号在可用的范围内。客户端connect的ip地址为服务器的ip地址,端口号为服务器的IP地址
并且,两台虚拟机处于同一网段。
3.如果通信中失败,可以用perror("socket/bind/connect/listen");输出错误原因
4.如果出现为
bind: Address already in use
可能是因为你强制ctrl+c/ctrl+z退出了socket,但是端口在在后台运行
bind:address already in use的存在是合理的,在服务端终止之后,会有一个TIME_WAIT的状态,再次打开会出现:bind:address already in use。
服务器端可以尽可能的使用REUSEADDR(在绑定之前尽可能调用setsockopt来设置REUSEADDR)套接字选项,这样就可以使得不必等待TIME_WAIT状态就可以重启服务器了,也就是说:TIME_WAIT状态还是存在的,但是不影响我们重新启动服务器。
但是,当我们等上个2-4分钟后,然后在运行,就又没有这种情况了,很好解释,那只是因为在一定的时间内这个端口还被占用着,没有来的及释放,但是2-4分钟后,端口释放完毕, 所以可以正常的运行这个程序了
可以用命令netstat -an |grep 50001(端口号)查看是否还在后台运行,一般等个2分钟就行,不然就把端口号换成另 一 个,在运行就行。但是怎么让ctrl+c后端口也释放呢。
这里就要用到setsocket函数
在bind前加入这一行代码
if((setsockopt(server_sockfd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on)))<0)
{
perror("setsockopt failed");
}
这次,让我们再次反复的启动服务器,尽情的在“黑窗户”里面输入./server ./server ./server ......服务器的程序好像突然间变乖了,记住是要ctrl+c!!,不是ctrl+z,后者后还是会Address already in use呵呵,童鞋们,为自己的成就庆祝吧!!!