如何在套接字编程中发送结构数据?

时间:2013-06-19 07:10:19

标签: ios sockets char structure

我最近正在研究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()函数,然后使接收字符变换结构类型。

1 个答案:

答案 0 :(得分:1)

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

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