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");

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

报告相同问题?

悬赏问题

  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd
  • ¥20 ING91680C BLE5.3 芯片怎么实现串口收发数据
  • ¥15 无线连接树莓派,无法执行update,如何解决?(相关搜索:软件下载)
  • ¥15 Windows11, backspace, enter, space键失灵