0

最近在学习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() 函数,然后使接收字符转换结构类型。

4

1 回答 1

1

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

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

于 2013-06-19T08:05:05.950 回答