免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 8790 | 回复: 14

[C++] socket服务器端接收不到数据 [复制链接]

论坛徽章:
0
发表于 2014-03-21 17:25 |显示全部楼层
10可用积分
客户端代码
void SocketSend(char *IpAddress, int Port, char *Type, char *parameter);

int _tmain(int argc, _TCHAR* argv[])
{
        SocketSend("127.0.0.1", 50, "1", "数据收到否?\n");

        return 0;

}


/******************************************************************************
*        void SocketSend 发送Socket数据
*        参数
*        IpAddress 接收服务器的IP地址
*        Port 端口号双方必须保持一致
*        Type 用于标识消息类型
*        parameter 具体参数
******************************************************************************/
void SocketSend(char *IpAddress, int Port, char *Type, char *parameter)
{
        char *msg[] = {NULL, NULL};
        msg[0] = Type;
        msg[1] = parameter;

        WSADATA wsaData;
        WSAStartup(MAKEWORD(2, 2), &wsaData);

        SOCKET s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

        //定义结构体
        sockaddr_in sockAddr;
        sockAddr.sin_family = AF_INET;
        sockAddr.sin_addr.S_un.S_addr = inet_addr(IpAddress);
        sockAddr.sin_port = htons(Port);

        //建立连接
        int a= connect(s, (SOCKADDR*)&sockAddr, sizeof(SOCKADDR));

        //发送数据
        int b=send(s, *msg, sizeof(*msg), NULL);

        //销毁
        closesocket(s);
        WSACleanup();
}







服务器端代码
void SocketRecv(int Port, char *Type, char *Parameter);

int _tmain(int argc, _TCHAR* argv[])
{
        char *msg[] = {0, 0};
        SocketRecv(50, &*msg[0], &*msg[1]);

        printf_s(msg[0], msg[1]);

        return 0;
}


/******************************************************************************
*        void SocketRecv 接收Socket数据
*        参数
*        Port 端口号双方必须保持一致
*        Type 用于标识消息类型
*        parameter 具体参数
******************************************************************************/
void SocketRecv(int Port, char *Type, char *Parameter)
{
        char *msg[] = {0, 0};

        WSADATA wsaData;
        WSAStartup(MAKEWORD(2, 2), &wsaData);

        SOCKET s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); //创建TCP套接字

        sockaddr_in sockaddr;
        sockaddr.sin_family = AF_INET;
        sockaddr.sin_addr.S_un.S_addr = INADDR_ANY;
        sockaddr.sin_port = htons(Port);

        bind(s, (SOCKADDR*)&sockaddr, sizeof(SOCKADDR));

        listen(s, 30);

        SOCKADDR ClientAddr;
        int nSize = sizeof(SOCKADDR);
        SOCKET ClientSock;
        ClientSock = accept(s, (SOCKADDR*)&ClientAddr, &nSize);

        char i = NULL;
        recv(s, *msg, sizeof(*msg), NULL);
        Type = msg[0];
        Parameter = msg[1];
         
        closesocket(ClientSock);
        closesocket(s);

        WSACleanup();
}

最佳答案

查看完整内容

char *msg = "";...................recv(ClientSock, Parameter, strlen(Parameter), NULL);strlen(Parameter) 就是0,你给了一个长度为0的缓冲区, 当然收不到数据。定义:char msg[80] = {'\0'};

论坛徽章:
1
双子座
日期:2013-11-14 17:43:24
发表于 2014-03-21 17:25 |显示全部楼层
char *msg = "";
...................
recv(ClientSock, Parameter, strlen(Parameter), NULL);
strlen(Parameter) 就是0,你给了一个长度为0的缓冲区, 当然收不到数据。

定义:char msg[80] = {'\0'};

论坛徽章:
11
巨蟹座
日期:2013-12-23 11:12:14双子座
日期:2014-08-28 09:14:55子鼠
日期:2014-07-25 16:21:22摩羯座
日期:2014-07-23 15:17:47摩羯座
日期:2014-05-30 13:09:05午马
日期:2014-04-30 18:10:00天秤座
日期:2014-04-25 12:12:00申猴
日期:2014-04-22 11:30:15午马
日期:2014-03-07 16:06:40辰龙
日期:2013-12-25 18:36:00摩羯座
日期:2014-09-02 17:00:55
发表于 2014-03-21 17:45 |显示全部楼层
死循环都没,等服务器结束了,客户端才发来

论坛徽章:
0
发表于 2014-03-24 10:38 |显示全部楼层
回复 2# Susake_


    不会啊 程序会在listen处一直等待

论坛徽章:
4
双子座
日期:2014-08-28 10:08:002015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:58:112015年亚洲杯之阿联酋
日期:2015-03-13 03:25:15
发表于 2014-03-24 10:51 |显示全部楼层
呃,  char* msg[] = {0, 0};  这种也行?

论坛徽章:
0
发表于 2014-03-24 11:19 |显示全部楼层
回复 4# weishuo1999


    恩 没把这个改变成方法的时候试过可行

论坛徽章:
1
双子座
日期:2013-11-14 17:43:24
发表于 2014-03-24 11:38 |显示全部楼层
两个错误:

1. 客户端向50端口发送数据,SocketSend("127.0.0.1", 50, "1", "数据收到否?\n");
2. 服务端监听30端口:listen(s, 30);

还有:服务端按照常规流程写(至少在接收数据的地方加个循环)。

论坛徽章:
0
发表于 2014-03-24 11:43 |显示全部楼层
回复 6# star_in_sky


    listen第二个参数是监听缓存设置把 不是设置端口的好不? 大神 第一个是我自定义的方法名啊哪错了? 能具体点不?

论坛徽章:
1
双子座
日期:2013-11-14 17:43:24
发表于 2014-03-24 12:00 |显示全部楼层
回复 7# tan1301230147

抱歉。我搞错了。

有错误的地方是:;
recv(s, *msg, sizeof(*msg), NULL);

应该改为:
recv(ClientSock, *msg, sizeof(*msg), NULL);

s:  监听套接字。
ClientSock: 才是客户端的套接字。

不过在收数据的地方,你最好加个循环。

   

论坛徽章:
0
发表于 2014-03-24 13:48 |显示全部楼层
回复 8# star_in_sky


    重新定义了一下 传过去的数据乱码了
客户端
int _tmain(int argc, _TCHAR* argv[])
{
        SocketSend("127.0.0.1", 80, "数据收到否?\n");

        return 0;

}


/******************************************************************************
*        void SocketSend 发送Socket数据
*        参数
*        IpAddress 接收服务器的IP地址
*        Port 端口号双方必须保持一致
*        Type 用于标识消息类型
*        parameter 具体参数
******************************************************************************/
void SocketSend(char *IpAddress, int Port, char parameter[])
{

        WSADATA wsaData;
        WSAStartup(MAKEWORD(2, 2), &wsaData);

        SOCKET s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

        //定义结构体
        sockaddr_in sockAddr;
        sockAddr.sin_family = AF_INET;
        sockAddr.sin_addr.S_un.S_addr = inet_addr(IpAddress);
        sockAddr.sin_port = htons(Port);

        //建立连接
        int a= connect(s, (SOCKADDR*)&sockAddr, sizeof(SOCKADDR));

        //发送数据
        int b=send(s, parameter, sizeof(parameter), NULL);

        //销毁
        closesocket(s);
        WSACleanup();
}










服务器
int _tmain(int argc, _TCHAR* argv[])
{
        char *msg = "";
        SocketRecv(80, msg);




        return 0;
}


/******************************************************************************
*        void SocketRecv 接收Socket数据
*        参数
*        Port 端口号双方必须保持一致
*        Type 用于标识消息类型
*        parameter 具体参数
******************************************************************************/
void SocketRecv(int Port, char Parameter[])
{

        WSADATA wsaData;
        WSAStartup(MAKEWORD(2, 2), &wsaData);

        SOCKET s = socket(AF_INET, SOCK_STREAM, 0); //创建TCP套接字

        sockaddr_in sockaddr;
        sockaddr.sin_family = AF_INET;
        sockaddr.sin_addr.S_un.S_addr = INADDR_ANY;
        sockaddr.sin_port = htons(Port);

        bind(s, (SOCKADDR*)&sockaddr, sizeof(SOCKADDR));

        listen(s, 30);

        while(true)
        {
                SOCKADDR ClientAddr;
                int nSize = sizeof(SOCKADDR);
                SOCKET ClientSock;
                ClientSock = accept(s, (SOCKADDR*)&ClientAddr, &nSize);

                char i = NULL;
                recv(ClientSock, Parameter, sizeof(Parameter), NULL);
         
                closesocket(ClientSock);
                closesocket(s);

                WSACleanup();

        }


}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

SACC2019中国系统架构师大会

【数字转型 架构演进】SACC2019中国系统架构师大会,8.5折限时优惠重磅来袭!
2019年10月31日~11月2日第11届中国系统架构师大会(SACC2019)将在北京隆重召开。四大主线并行的演讲模式,1个主会场、20个技术专场、超千人参与的会议规模,100+来自互联网、金融、制造业、电商等领域的嘉宾阵容,将为广大参会者提供一场最具价值的技术交流盛会。

限时8.5折扣期:2019年9月30日前


----------------------------------------

大会官网>>
  

北京盛拓优讯信息技术有限公司. 版权所有 16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122
中国互联网协会会员  联系我们:huangweiwei@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP