sock通信--数据结构的传送

  sock通信中有几个问题必须注意,由于标准的不统一,有的机器使用的大端存储,而有的机器使用的是小端存储(如果对大小端不了解可以上网搜寻一下相关信息). 我们的机器的存储方式各不相同,但是由于历史原因,网络字节序使用的是大端,也就是说,我们要通过网络传输信息到远断,我们要当心了.

  如果明确了传送信息的双方都是相同的存储方式那么还好办,如果传送双方的存储方式不相同或者不一定相同,我们就必须把发送的数据进行相应的格式转换再发送到网络上,直至远端.

  由于网络字节序是大端,那么,我们再发送一个数据结构时,需要把这个结构中的每个成员转换成网络字节序,再发送到远端,而不只是简单的发送这些数据给远端.

  下面是我在发送数据结构时使用的一些例程,希望对涉及到这方面的朋友有帮助.

  在这个例子中,我定义了一个这样的结构体进行传送

 


typedef struct
{
    uint16_t packetlen;
    uint8_t cmdtype;
    uint16_t sessionid;
    uint16_t messageid;
    uint32_t ackinfo;
} ControlHeader;


  定义了这些函数处理结构体中的成员,把他们转换成相应的格式存入缓存中
//
//basic convert funtion declaration
//
void SendUint32_tToBuff(char *buf, uint32_t n);
void SendUint16_tToBuff(char *buf, uint16_t n);
void SendStringToBuff(char *buf, char *str);
uint32_t GetUint32_tFromBuff(char *buf);
uint16_t GetUint16_tFromBuff(char *buf);

//
//structure convert function declaration
//
void init_ControlHeader(uint8_t type, uint16_t sid, uint16_t mid,
uint32_t ack, ControlHeader *pHead);
void sendHeadtobuff(char *buf, ControlHeader *pHead);
void getHeaderfrombuff(void *buff, ControlHeader *p);
int getHeadlen();

  上述定义存放在struct.h文件中,另外写了一个struct.c对上述声明进行定义  

 

  下面我们写一个简单的网络通信例程,进行试验

  服务器端

 

客户端

 

完毕.

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Linux下的socket通信是一种用于在不同计算机之间进行通信的技术。它允许两个或多个进程通过网络进行数据交换。 举一个简单的Linux sock通信案例来说明。假设我们有两台计算机:主机A和主机B。主机A上有一个服务端程序,主机B上有一个客户端程序。服务端程序监听一个指定的端口号,等待客户端连接。客户端程序连接到服务端并发送一条消息。 步骤如下: 1. 在主机A上,我们需要创建一个服务端程序。首先,我们需要使用socket()函数创建一个套接字。然后,我们使用bind()函数将套接字与一个IP地址和端口号绑定。接下来,我们使用listen()函数监听该端口,等待连接请求。一旦有连接请求到达,我们使用accept()函数接受连接,并返回一个新的套接字用于与客户端通信。最后,我们使用recv()函数接收客户端发送的数据,并使用send()函数发送响应数据。 2. 在主机B上,我们需要创建一个客户端程序。首先,我们也需要使用socket()函数创建一个套接字。然后,我们使用connect()函数连接到主机A的IP地址和端口号。一旦连接建立,我们使用send()函数发送一条消息给服务端。接下来,我们使用recv()函数接收服务端的响应。 通过上述步骤,我们实现了主机A和主机B之间的sock通信。服务端程序可以接受来自客户端的请求并响应,而客户端程序可以与服务端进行交互。 这只是一个简单的例子,真实的sock通信可能涉及更复杂的操作和协议。然而,Linux提供了丰富的套接字API,使得开发sock通信变得相对容易。利用sock通信,我们可以构建各种各样的网络应用,如网页服务器、聊天室等。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值