标题:我的SOCKET代码服务器端recv函数的问题,请各位帮忙看一下。
只看楼主
yangfrancis
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:贵宾
威 望:141
帖 子:1510
专家分:7661
注 册:2014-5-19
结帖率:100%
已结贴  问题点数:20 回复次数:12 
我的SOCKET代码服务器端recv函数的问题,请各位帮忙看一下。
SOCKET sersock,clisock;        //服务器与客户端套接字
    struct sockaddr_in sa;        //服务器信息
    struct sockaddr_in cliaddr;    //客户端信息
    int serport=5000;        
//端口号(尽量选一个大于1024的数,因为1024以前的基本都是系统保留或作为公共服务之用的)
    //char buff[256];                //缓冲区(用于暂存要传递的信息)
    WSADATA ws;                    //记录WinSock DLL信息
    int len;                    //缓冲区长度

    WORD wVersionRequested;        //存储版本号
    wVersionRequested=MAKEWORD(2,2);    //得到版本号

    if(WSAStartup(wVersionRequested,&ws)!=0)    //初始化Winsock
    {
        SetWindowText(wndMain,"初始化失败");//cout<<"初始化Winsock失败!"<<endl;
        return -1;                //程序失败,出现非正常退出
    }
    SetWindowText(wndMain,"正在创建套接字");
    sersock=socket(AF_INET,SOCK_STREAM,0);    //创建套接字

    memset(&sa,0,sizeof(sa));    //填充服务器地址结构(清零)
    sa.sin_family=AF_INET;
    sa.sin_port=htons(serport);    //将一个整型变量从主机地址顺序转变成网络地址顺序,从而保证数据在不同主机之间传递能被正确解释
    sa.sin_addr.s_addr=INADDR_ANY;
   
    if(bind(sersock,(const sockaddr*)&sa,sizeof(sa))!=0)//绑定套接字到服务器
    {
        SetWindowText(wndMain,"绑定失败");return -1;//程序失败,出现非正常退出
    }
    else
        SetWindowText(wndMain,"绑定成功");
    if(listen(sersock,5)!=0)
        //服务器套接字进行监听,第二个参数是允许等待连接的队列的最大长度
    {
        SetWindowText(wndMain,"监听失败");return -1;//程序失败,出现非正常退出
    }
    else
        SetWindowText(wndMain,"等待连接请求");
    len=sizeof(cliaddr);
    clisock=accept(sersock,(struct sockaddr*)&cliaddr,&len);
    if(flag)
        send(clisock,buff,strlen(buff),0);    //发送数据
    else
    {
        memset(buff,0,sizeof(buff));
        len=recv(sersock,buff,256,0);  //客户端send函数是正常返回被发送字串长度。
        switch(len)           //实际返回值是SOCKET_ERROR
        {
        case 0:SetWindowText(btnSend,"0");break;
        case SOCKET_ERROR:SetWindowText(btnSend,"SOCK_ERROR");break;
        default:
            char ch[5];itoa(len,ch,10);SetWindowText(btnSend,ch);break;
        }
    }
    Sleep(10);
    closesocket(clisock);        //关闭连接
    closesocket(sersock);
    WSACleanup();
搜索更多相关主题的帖子: 服务器 版本号 缓冲区 客户端 记录 
2016-07-08 20:08
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:10 
没看到buff的定义,除了 //char buff[256];
2016-07-08 21:21
yangfrancis
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:贵宾
威 望:141
帖 子:1510
专家分:7661
注 册:2014-5-19
得分:0 
回复 2楼 rjsp
对了。我没说清楚。这段代码是函数体内的内容。buff是一个形参。
2016-07-09 08:16
yangfrancis
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:贵宾
威 望:141
帖 子:1510
专家分:7661
注 册:2014-5-19
得分:0 
int ServerListening(char*buff)
{

    sersock,clisock;        //服务器与客户端套接字
    struct sockaddr_in sa;        //服务器信息
    struct sockaddr_in cliaddr;    //客户端信息
    int serport=5000;        
//端口号(尽量选一个大于1024的数,因为1024以前的基本都是系统保留或作为公共服务之用的)
    //char buff[256];                //缓冲区(用于暂存要传递的信息)
    WSADATA ws;                    //记录WinSock DLL信息
    int len;                    //缓冲区长度

    WORD wVersionRequested;        //存储版本号
    wVersionRequested=MAKEWORD(2,2);    //得到版本号

    if(WSAStartup(wVersionRequested,&ws)!=0)    //初始化Winsock
    {
        SetWindowText(wndMain,"初始化失败");//cout<<"初始化Winsock失败!"<<endl;
        return -1;                //程序失败,出现非正常退出
    }
    SetWindowText(wndMain,"正在创建套接字");
    sersock=socket(AF_INET,SOCK_STREAM,0);    //创建套接字

    memset(&sa,0,sizeof(sa));    //填充服务器地址结构(清零)
    sa.sin_family=AF_INET;
    sa.sin_port=htons(serport);    //将一个整型变量从主机地址顺序转变成网络地址顺序,从而保证数据在不同主机之间传递能被正确解释
    sa.sin_addr.s_addr=INADDR_ANY;
   
    if(bind(sersock,(const sockaddr*)&sa,sizeof(sa))!=0)//绑定套接字到服务器
    {
        SetWindowText(wndMain,"绑定失败");return -1;//程序失败,出现非正常退出
    }
    else
        SetWindowText(wndMain,"绑定成功");
    if(listen(sersock,5)!=0)
        //服务器套接字进行监听,第二个参数是允许等待连接的队列的最大长度
    {
        SetWindowText(wndMain,"监听失败");return -1;//程序失败,出现非正常退出
    }
    else
        SetWindowText(wndMain,"等待连接请求");
    len=sizeof(cliaddr);
    clisock=accept(sersock,(struct sockaddr*)&cliaddr,&len);
    if(flag)
        send(clisock,buff,strlen(buff),0);    //发送数据
    else
    {
        memset(buff,0,sizeof(buff));
        len=recv(sersock,buff,256,0);  //客户端send函数是正常返回被发送字串长度。
        switch(len)           //实际返回值是SOCKET_ERROR
        {
        case 0:SetWindowText(btnSend,"0");break;
        case SOCKET_ERROR:SetWindowText(btnSend,"SOCK_ERROR");break;
        default:
            char ch[5];itoa(len,ch,10);SetWindowText(btnSend,ch);break;
        }
    }
    Sleep(10);
    closesocket(clisock);        //关闭连接
    closesocket(sersock);
    WSACleanup();
    return 0;
}
2016-07-09 08:19
yangfrancis
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:贵宾
威 望:141
帖 子:1510
专家分:7661
注 册:2014-5-19
得分:0 
//客户端是这个。
ClientGet(char*buff)
{
    SOCKET sock;            //套接字
    struct sockaddr_in sa;    //地址信息
    int servport=5000;        //端口号
    //char buff[256];            //缓冲区
    int len;                //缓冲区长度
    WSADATA ws;                //记录WinSock DLL信息

    WORD wVersionRequested;    //版本号
    wVersionRequested=MAKEWORD(2,2);    //计算版本号

    if(WSAStartup(wVersionRequested,&ws)!=0)    //如果初始DLL失败
    {
        return -1;
    }

    sock=socket(AF_INET,SOCK_STREAM,0);        //创建套接字
    memset(&sa,0,sizeof(sa));            //定义地址结构(清零)
    sa.sin_family=AF_INET;
    sa.sin_port=htons(servport);        //赋值端口信息
    sa.sin_addr.s_addr=inet_addr("192.168.1.103");//服务器IP
    connect(sock,(const sockaddr*)&sa,sizeof(sa));    //连接服务器
    //memset(buff,0,sizeof(buff));        //初始缓冲区
    if(!flag)
    {
        memset(buff,0,sizeof(buff));
        len=recv(sock,buff,256,0);    //接受数据
    }
    else
    {
        int num=send(sock,buff,strlen(buff),0);
        if(num>0)
        {
            char ch[5];itoa(num,ch,10);
            MessageBox(wndMain,ch,"info",MB_OK);
        }
    }
   
    closesocket(sock);
    WSACleanup();
    if(flag)//发数据返回1
    {
        return 1;
    }
    if(strlen(buff)!=0)//接受数据返回0
        return 0;
    else
        return -1;//无数据可接受返回-1
}
2016-07-09 08:25
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
第一,你可以将服务端的Sleep(10);改大点,比如10000
第二,要确保ClientGet(char*buff)中buff指向的空间有256字节
2016-07-09 10:00
yangfrancis
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:贵宾
威 望:141
帖 子:1510
专家分:7661
注 册:2014-5-19
得分:0 
谢谢,我试一下看.
2016-07-09 11:32
yangfrancis
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:贵宾
威 望:141
帖 子:1510
专家分:7661
注 册:2014-5-19
得分:0 
改过了,服务器recv还是返回SOCKET_ERROR, 可能有其他原因
2016-07-09 11:38
tw314809
Rank: 2
等 级:论坛游民
帖 子:3
专家分:10
注 册:2016-7-10
得分:10 
以下是引用yangfrancis在2016-7-9 08:19:35的发言:

int ServerListening(char*buff)
{
    sersock,clisock;        //服务器与客户端套接字
    struct sockaddr_in sa;        //服务器信息
    struct sockaddr_in cliaddr;    //客户端信息
    int serport=5000;        
//端口号(尽量选一个大于1024的数,因为1024以前的基本都是系统保留或作为公共服务之用的)
    //char buff[256];                //缓冲区(用于暂存要传递的信息)
    WSADATA ws;                    //记录WinSock DLL信息
    int len;                    //缓冲区长度

    WORD wVersionRequested;        //存储版本号
    wVersionRequested=MAKEWORD(2,2);    //得到版本号

    if(WSAStartup(wVersionRequested,&ws)!=0)    //初始化Winsock
    {
        SetWindowText(wndMain,"初始化失败");//cout<<"初始化Winsock失败!"<<endl;
        return -1;                //程序失败,出现非正常退出
    }
    SetWindowText(wndMain,"正在创建套接字");
    sersock=socket(AF_INET,SOCK_STREAM,0);    //创建套接字

    memset(&sa,0,sizeof(sa));    //填充服务器地址结构(清零)
    sa.sin_family=AF_INET;
    sa.sin_port=htons(serport);    //将一个整型变量从主机地址顺序转变成网络地址顺序,从而保证数据在不同主机之间传递能被正确解释
    sa.sin_addr.s_addr=INADDR_ANY;
   
    if(bind(sersock,(const sockaddr*)&sa,sizeof(sa))!=0)//绑定套接字到服务器
    {
        SetWindowText(wndMain,"绑定失败");return -1;//程序失败,出现非正常退出
    }
    else
        SetWindowText(wndMain,"绑定成功");
    if(listen(sersock,5)!=0)
        //服务器套接字进行监听,第二个参数是允许等待连接的队列的最大长度
    {
        SetWindowText(wndMain,"监听失败");return -1;//程序失败,出现非正常退出
    }
    else
        SetWindowText(wndMain,"等待连接请求");
    len=sizeof(cliaddr);
    clisock=accept(sersock,(struct sockaddr*)&cliaddr,&len);
    if(flag)
        send(clisock,buff,strlen(buff),0);    //发送数据
    else
    {
        memset(buff,0,sizeof(buff));//這句會把buff 指針清0 即是說 buff = NULL;
        len=recv(sersock,buff,256,0);  //客户端send函数是正常返回被发送字串长度。
buff 都清0了,怎麼收數據?
        switch(len)           //实际返回值是SOCKET_ERROR
        {
        case 0:SetWindowText(btnSend,"0");break;
        case SOCKET_ERROR:SetWindowText(btnSend,"SOCK_ERROR");break;
        default:
            char ch[5];itoa(len,ch,10);SetWindowText(btnSend,ch);break;
        }
    }
    Sleep(10);
    closesocket(clisock);        //关闭连接
    closesocket(sersock);
    WSACleanup();
    return 0;
}

看紅字
2016-07-10 21:14
yangfrancis
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:贵宾
威 望:141
帖 子:1510
专家分:7661
注 册:2014-5-19
得分:0 
回复 9楼 tw314809
谢谢回复。应该不是这个原因。memset注释掉仍然没用。且客户端接收信息也加了memset,照样能收。
2016-07-11 12:24



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-466778-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.292301 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved