SOLA&AIR
2021-03-19 11:33
采纳率: 100%
浏览 33

Socket C++ revc接收 C#传来的数据

问题是这样的:

我在做一个 socket 连接 客户端和服务器的数据交互的功能, 

       socket服务器是用C++写的,代码是这样的:


#include <iostream>
#include <sys/socket.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <string.h>
using namespace std;

#define PORT 8888
#define LISTENQ 10

#define BUFFSIZE 1024
#define IPSIZE 16
#define NUMZERO 0

char* GetTime();
int main()
{
    // 创建套接字
    int listenfd;
    listenfd = socket(AF_INET, SOCK_STREAM, 0);     
    if (listenfd < NUMZERO)
    {
        std::cout << "create socketfd failed" << std::endl;
        return 0;
    }
    
    // 配置服务器地址相关参数
    struct sockaddr_in servaddr;           
    memset(&servaddr, 0, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    servaddr.sin_port = htons(PORT);
    
    
    // 上面两者绑定    sys/socket.h
    int bind_ok = ::bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr));
    if (bind_ok < NUMZERO)
    {
        std::cout << "bind socket with server address  failed" << std::endl;
        return 0;
    }
        
    // 监听套接字上的端口  sys/socket.h
    int listen_ok = listen(listenfd, LISTENQ);
    if(listen_ok < NUMZERO)
    {
        std::cout << "listen socket  failed" <<std::endl;
        return 0;
    }

    struct sockaddr_in clientaddr;
    socklen_t clientaddr_len = sizeof(clientaddr);

    // 阻塞,直到有客户端连接
    int clientfd = accept(listenfd, (struct sockaddr*)&clientaddr, &clientaddr_len);
    if (clientfd < NUMZERO)
    {
        std::cout << "create connection socket failed" <<std::endl;
        return 0;
    }
    
    
    // 输入连接的 IP 地址
    char ipstr[IPSIZE];
    memset(ipstr, 0, sizeof(ipstr));
    inet_ntop(AF_INET, &clientaddr.sin_addr.s_addr, ipstr, sizeof(ipstr));
    std::cout << "Connected by " << ipstr << "(" << ntohs(clientaddr.sin_port) << ")" << std::endl;

    while(true)
    {
        char buf[BUFFSIZE];
        memset(buf, 0, sizeof(buf));
        
        int reLen = recv(clientfd, buf, BUFFSIZE, 0);
        if (reLen < NUMZERO)
        {
            cout << "recv ERROR 。 TIME:" << GetTime() << endl;
        }
        else if(reLen == NUMZERO)
        {
            // 正常退出
            cout << "Exit(0)。 TIME:" << GetTime() << endl;
            break;
        }
        
        // 这里是输出   
        cout << "client send data :" << buf <<  " lenth = " << strlen(buf) << endl;
        
        // 发送消息
        int seLen = send(clientfd, buf, BUFFSIZE, 0);
        if (seLen < NUMZERO)
        {
            cout << "send ERROR。 TIME:" << GetTime() << endl;
        }
    }
    close(clientfd);
    return 0;
}

// 获取时间
char* GetTime()
{
    long t = time(0);
    char* times = ctime(&t);
    return times;
}

然后客户端是用 C# 写的,代码如下:

    public void Send()
    {
        byte[] str = { 1, 2, 3, 4, 5};
        IAsyncResult asyncSend = socket.BeginSend(str, 0, str.Length, SocketFlags.None, new AsyncCallback(SendCallBack), socket);
        bool success = asyncSend.AsyncWaitHandle.WaitOne(5000, true);
        if (!success)
        {
            print("连接失败");
        }
    }

数据连接是通的,发送的数据 服务器 recv 确实收到了。但是输出的结果确实这样的

我想知道为什么输出是个空,明明有数据的啊。应该怎样修改才能有数据呢?

本人是一个小白,代码可能还有其他的问题,期望有大佬提示指点,谢谢。

  • 写回答
  • 好问题 提建议
  • 关注问题
  • 收藏
  • 邀请回答

1条回答 默认 最新

  • peng450 2021-03-19 15:27
    已采纳

    虽然我对c#不了解,但是你注意一下这个

    byte[] str = { 1, 2, 3, 4, 5};

    这个看起来像是数字,但c++接收时使用为char类型,这里的数字是否在c++上表示的是ascll的1,2,3,4,5 ?

    ascll的1-5可能输出不了什么。

    建议尝试解决方法:

    1:在c#中使用字符1-5. (byte[] str = { '1', '2', '3', '4', '5'}; 不知道c#有没有这些语法。请自己尝试)

    2:在c++中单个字节打印 如:for(i=0;i<reLen;i++){cout<<(int)buf[i];}

    已采纳该答案
    评论
    解决 1 无用
    打赏 举报

相关推荐 更多相似问题