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 win2012磁盘空间不足,c盘正常,d盘无法写入
  • ¥15 用土力学知识进行土坡稳定性分析与挡土墙设计
  • ¥70 PlayWright在Java上连接CDP关联本地Chrome启动失败,貌似是Windows端口转发问题
  • ¥15 帮我写一个c++工程
  • ¥30 Eclipse官网打不开,官网首页进不去,显示无法访问此页面,求解决方法
  • ¥15 关于smbclient 库的使用
  • ¥15 微信小程序协议怎么写
  • ¥15 c语言怎么用printf(“\b \b”)与getch()实现黑框里写入与删除?
  • ¥20 怎么用dlib库的算法识别小麦病虫害
  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启