gksakura 2015-12-13 16:35 采纳率: 100%
浏览 1892
已采纳

客户端发送消息给服务端后,服务端应答无效

连接建立了,语言C++。前端是用cocos2d封装好的。
目前是:客户端向服务端send:服务端能接到;服务端向客户端send:客户端能接到。
但是:客户端向服务端send,服务端接到后立即应答向客户端send,客户端就接不到。
代码如下:
客户端:(在一个按钮中触发)

gksock->connect_(5500,"127.0.0.1");
struct gksakura
{
    int a;
    char b[32];
};
struct gksakura gk;
ZeroMemory(&gk,sizeof(gk));
gk.a=32;
strcpy(gk.b,"matousakura");
char ans[64];
ZeroMemory(ans,sizeof(ans));
auto errcode =gksock->send((char*)&gk,128);
if (errcode!=SOCKET_ERROR)
{
    CCLOG("!!!!!!!!!!!!!!!!!!!!!!!!!");
    gksock->recv(ans,128);
    CCLOG("%s",ans);
}
gksock->close();

服务端:

        while(1)
        {

        SOCKET sClient=accept(sServer,(SOCKADDR*)&addrclient,&addrclientlen);printf("accetp ing!\n");
        if (sClient==INVALID_SOCKET)
        {
            printf("accept failed!\n");
            break;
        }

        struct gksakura
        {
            int a;
            char b[32];
        };
        struct gksakura gk;
        ZeroMemory((char*)&gk,sizeof((char*)&gk));
        char ans[]="get it!";
        errcode=recv(sClient,(char*)&gk,128,0);printf("recv ing!\n");
        if (errcode==SOCKET_ERROR)
        {
            printf("recv failed!\n");
            closesocket(sClient);
            break;
        }
        else
        {
            printf("%d\n%s\n",gk.a,gk.b);
            printf("want to send %s\n",ans);
            errcode=send(sClient,ans,128,0);printf("send ing!\n");
            if (errcode==SOCKET_ERROR)
            {
                printf("send failed!\n");
                closesocket(sClient);
                break;
            }
        }
        closesocket(sClient);

        }
        closesocket(sServer);printf("close!\n");
        WSACleanup();
  • 写回答

1条回答 默认 最新

  • 云霏阳 2015-12-14 00:33
    关注

    楼主,你代码内存越界了
    1.客户端发送的时候,读越界,接收的时候,写越界;
    2.服务器接收的时候,写越界,发送的时候,读越界。
    建议代码修改如下:
    1.客户端
    auto errcode =gksock->send((char*)&gk,sizeof(gk));
    gksock->recv(ans,sizeof(ans));
    2.服务器
    errcode=recv(sClient,(char*)&gk,sizeof(gk),0);printf("recv ing!\n");
    errcode=send(sClient,ans,strlen(ans),0);printf("send ing!\n");

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥40 求一款能支持ios15以上的屏蔽越狱插件。比较好用的
  • ¥15 C++ QT对比内存字符(形式不定)
  • ¥30 C++第三方库libiconv 远程安装协助
  • ¥15 https://github.com/youlaitech/vue3-element-admin/blob/master/src/store/modules/user.ts 这2句代码如何理解
  • ¥15 duilib开发文本字串超过长度显示
  • ¥20 mysql的.ibd文件为啥那么多
  • ¥15 C++中采用栈和BFS算法求解迷宫问题
  • ¥15 关于#java#的问题:这是跳转失败出现的界面这是哪个出现问题的servlet(开发工具-ide)
  • ¥15 EBS R12费用采购跨月冲销
  • ¥15 python中用mplfinance如何做到多股同列?