【问题标题】:Send() and recv() double or intSend() 和 recv() double 或 int
【发布时间】:2014-06-22 08:11:15
【问题描述】:

我在从客户端到服务器以及从服务器到客户端的发送和接收双精度/整数方面遇到问题。 此刻,我有:

客户:

cin>>xp;
send( master,(char*)&xp,sizeof(xp),0);

服务器:

int valread, nr;
char * buffer;   
valread = recv(s,(char *)&nr,sizeof(buffer),0);

它可以工作,但是当我从服务器发送到客户端时,我做错了。

我在服务器上:

int lol;
lol=5;
send(s, (char*)&lol, sizeof(lol), 0);

我想要这个 int 在客户端:

bytesRecv = recv(master,(char*)&nr,sizeof(buffer),0);

我不知道为什么它不起作用:/ 当我在客户端 cout/printf 这个 int 时,它是 0 或 9,2555... 请帮忙:/

【问题讨论】:

  • 听起来像endianness 问题。
  • 为什么是sizeof (buffer)?为什么在发送整数时关心char * 占用多少字节?
  • 你使用什么协议?为什么忽略send 和recv 的返回值?如果您只收到一个字节会怎样?
  • 这是我的错。我有这个: bytesRecv = recv(mainSocket,(char*)&nr,sizeof(nr),0);但这仍然行不通。我使用 tcp

标签: c++ winsock


【解决方案1】:

您的 sizeof(buffer) 错误 - 您应该发送和接收 sizeof(int)。

另外,请注意,如果您的服务器和客户端以不同的顺序在内存中存储整数 - their Endianness 可能不同,这将不起作用。

为确保这不是问题,请从主机切换到网络顺序并返回。了解htonl 和ntohl

【讨论】:

  • 好的,我改进了这个,但还是不行。我可能会补充一点,我在 Win 上对此进行了编程。但是为什么发送/接收客户端->服务器它可以工作,但服务器->客户端没有?也许你可以举个简单的例子来说明从服务器到客户端的发送/接收 int?
  • ntohl 也存在于 Windows 上。但是,如果您的客户端和服务器都在 Windows 上,则字节序不是问题。
  • 是的,我的客户端和服务器在同一台电脑上的 Win
  • 使用调试器 - 你在bytesRecv 中得到了什么?
  • 好的,可以了。当我发送/接收整数时。但是我必须做什么才能发送/接收双倍?我可以使用:服务器:send(s, (char*)&koniec, sizeof(double), 0); 客户端:recv(master,(char*)&nr,sizeof(double),0); 吗?当我使用它并在客户端上使用 printf 时,它不起作用:/
猜你喜欢
  • 1970-01-01
  • 2014-05-05
  • 2019-01-13
  • 1970-01-01
  • 2020-01-08
  • 2016-07-27
  • 1970-01-01
  • 2016-08-02
  • 2014-08-17
相关资源
最近更新 更多