我最近正在研究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()函数,然后使接收字符变换结构类型。
答案 0 :(得分:1)
我建议您确保在network byte order中发送数据;使用htonl,htons和ntohl,ntohs系统函数。不同的设备可能是不同的字节序。此外,您可能不应该只通过网络发送结构,即使在网络字节顺序中,您最好设计一个简单的协议来发送您需要的数据 - 它更易于维护和灵活。您也不能保证您的写入已经发送了您请求的所有数据,您应该检查您的读写结果,以确保您有预期的金额。
顺便提一下,建议避免使用适用于iOS的POSIX网络库,并尽可能使用本机实现。