6.两台虚拟机的socket通信的例子和常见错误问题

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

扫描二维码关注公众号,回复: 5890239 查看本文章

            可能是因为你强制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呵呵,童鞋们,为自己的成就庆祝吧!!!

猜你喜欢

转载自blog.csdn.net/weixin_40535588/article/details/89218194
今日推荐