VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 963|回复: 1

[求助] 阻塞服务器如何关闭了重连客户端

[复制链接]
71_avatar_middle
在线会员 发表于 2016-5-22 11:38:08 | 显示全部楼层 |阅读模式
我编写的回声服务器用阻塞方式,当服务器端关闭了,再次开启服务端如何实现重连呢,请求高手指教一下。谢谢
代码如下
server端
#include <stdio.h>
#include <string.h>
#include <Winsock2.h>
#pragma comment(lib, "ws2_32.lib")

int  main(void)
{
        int err; // 错误信息
        WSADATA wsaData;       // winsock 结构体
        WORD wVersionRequested;// winsock 的版本
        // 配置 Windows Socket版本
        wVersionRequested = MAKEWORD( 2, 2 );
        // 初始化 Windows Socket
        err = WSAStartup( wVersionRequested, &wsaData );
        if ( err != 0 )
        {
                // 启动错误,程序结束
                return 1;
        }

        SOCKET sockServer;     // 服务端 Socket
        SOCKADDR_IN addrServer;// 服务端地址
       
        SOCKADDR_IN addrClient;// 客户端地址
        // 定义服务器端socket
        sockServer = socket(AF_INET, SOCK_STREAM, 0);
        //  设置服务端 socket
        addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); // 本机IP
        addrServer.sin_family = AF_INET;                   // 协
        //议类型是INET
        addrServer.sin_port = htons(6000);
        // 将服务器端socket绑定在本地端口
        bind(sockServer, (SOCKADDR *)&addrServer, sizeof(SOCKADDR));
        // Listen 监听端口
        listen(sockServer, 5);

        while(1)
        {
                // 等待客户端连接
                printf("服务器已启动:\n监听中...\n");
                int len = sizeof(SOCKADDR);
       
                SOCKET sockClient;     // 客户端 Scoket
                sockClient = accept(sockServer, (SOCKADDR *)&addrClient, &len);//数值型ip转换成字符串

                char recvBuf[BUFFSIZE] = {0};  // 接受客户端返回结果的字符串

                //数据接受发送
                while (1)
                {
                        char str[32]; //键盘输入的命令字符串
                        printf(">>");
                        gets(str);

                        // 发送指令字符串
                        send(sockClient, str, strlen(str) , 0);

                        recv(sockClient, str, BUFFSIZE, 0);
                        printf("recv %s\n", str);
                  
                        }
                closesocket(sockClient);
        }
        closesocket(sockServer);
        WSACleanup();

        return 0;
}

客服端
#include <Winsock2.h>
#include <stdio.h>
#include<string.h>

#pragma comment(lib, "ws2_32.lib")

#define MESSAGE_BUFF_SIZE 1024*35

int main(void)
{
        int err = 0;
        WSADATA wsaData;
        WORD wVersionRequested;
        wVersionRequested = MAKEWORD( 2, 2 );
        err = WSAStartup( wVersionRequested, &wsaData );
        if ( err != 0 )
        {
                return 1;
        }

        SOCKET sockClient;      // 客户端 Scoket
        SOCKADDR_IN addrServer; // 服务端地址

        // 新建客户端 scoket
        sockClient = socket(AF_INET, SOCK_STREAM, 0);

        // 定义要连接的服务端地址
        addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");  // 服务端 IP
        addrServer.sin_family = AF_INET;                           // 协议类型是INET
        addrServer.sin_port = htons(6000);                         // 连接端口

        while (1)
        {
                printf("\n等待连接 ");
                int con ;
                do
                {
                        con         = connect(sockClient, (SOCKADDR *)&addrServer, sizeof(SOCKADDR)) ;
                        Sleep(1000);
                }while(SOCKET_ERROR == con);
                printf("connected con = %d\n", con);
                printf("\n连接成功\n");

                while( 1 )
                {   
                        char recvCmd[1024] = {0};      //接收服务器端命令缓冲区

                        printf("接收指令是:");
                        recv(sockClient, recvCmd, sizeof(recvCmd), 0);  //接收指令
                        printf("%s\n", recvCmd);
                        printf("after recv\n");
                       
                        send(sockClient, recvCmd, strlen(recvCmd), 0);
                }
        }

        WSACleanup();
        return 0;
}




上一篇:对话框数据传递问题
下一篇:CListCtrl控件DrawItem中自绘问题,同志们帮忙看看,谢谢了!
51_avatar_middle
online_admins 发表于 2016-5-24 23:03:01 | 显示全部楼层
第一次连接成功了之后,Client 端就会在 第二个 while 中无线的循环下去,即使是 recv 接收失败,你也没做任何处理,所以想实现断线重连的话,在 第二个 while 中对 recv 和 send 进行判断,如果发现出错了,就说明对方关闭了,或者是网络出现问题了,应该 调用 break 调出当前循环,进入上一层的 while,这样才能再次调用 connect 进行再次连接
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2019-8-19 08:37

Powered by Discuz! X3.4

© 2009-2019 cctry.com

快速回复 返回顶部 返回列表