【问题标题】:How to send structure data in socket programming?socket编程中如何发送结构数据?
【发布时间】:2013-06-19 07:10:19
【问题描述】:

最近在学习c socket编程,所以写了一个例子来实践一下Client-server模型。我使用结构作为消息数据发送到服务器,服务器处理数据。我在IOS模拟器上运行的时候是对的,但是在设备上是错误的,我发现服务器从设备客户端接收到的结构数据和客户端消息数据不一样!对不起,我的英语很差。

我的结构代码是:

 typedef struct Message
    {
        char msg[4000];
        char name[256];
        bool isBroadcast;
        bool islogin;
        USER userInfo;
    }__attribute__((packed)) MessageType;

用户代码是:

typedef struct user
{
    int id_number;
    char name[256];
    char password[20];
    char *p_chatlog;
    struct sockaddr user_addr;
    int sock;
} __attribute__((packed)) USER;

发送代码是:

MessageType *loginMsg = (MessageType *)malloc(sizeof(MessageType));
bzero(loginMsg, sizeof(MessageType));
loginMsg->islogin = true;
const char *name_str = [userName.text UTF8String];
memcpy(&(loginMsg->userInfo.name), name_str, strlen(name_str));

const char *password_str = [password.text UTF8String];
memcpy(&(loginMsg->userInfo.password), password_str, strlen(password_str));
write(m_sock, loginMsg, sizeof(MessageType));
free(loginMsg);

服务器接收代码使用read()函数,然后使接收字符转换结构类型。

【问题讨论】:

  • 能否添加USER结构定义?
  • 好的,我已经编辑好了!

标签: ios sockets char structure


【解决方案1】:

我建议您确保将数据发送到network byte order;使用htonl, htons 和 ntohl, ntohs 系统函数。不同的设备很可能是不同的字节序。此外,您可能不应该只通过网络发送一个结构,即使是按网络字节顺序,您最好设计一个简单的协议来发送您需要的数据 - 它更易于维护和灵活。你也不能保证你的 write 已经发送了你请求的所有数据,你应该检查你的 read 和 write 的返回结果,以确保你有你期望的数量。

顺便说一句,建议避免使用适用于 iOS 的 POSIX 网络库,并尽可能使用本机实现。

【讨论】:

  • 我发现有人说mac os的字节序不同,iphone os的字节序不同。我去试试!谢谢你的回答!!
  • 我发现我的错误是服务器一次无法从客户端接收整个数据,但我尝试解析数据。当然你的回答让我知道我应该多研究socket数据的传输。
猜你喜欢
  • 2016-10-28
  • 2013-11-28
  • 2021-07-04
  • 1970-01-01
  • 2021-03-27
  • 2019-07-01
  • 1970-01-01
  • 2010-12-28
  • 2014-10-27
相关资源
最近更新 更多