ToB企服应用市场:ToB评测及商务社交产业平台

标题: 14.8 Socket 一收一发通信 [打印本页]

作者: 写过一篇    时间: 2023-11-3 07:25
标题: 14.8 Socket 一收一发通信
通常情况下我们在编写套接字通信程序时都会实现一收一发的通信模式,当客户端发送数据到服务端后,我们希望服务端处理请求后同样返回给我们一个状态值,并以此判断我们的请求是否被执行成功了,另外增加收发同步有助于避免数据包粘包问题的产生,在多数开发场景中我们都会实现该功能。
Socket粘包是指在使用TCP协议传输数据时,发送方连续向接收方发送多个数据包时,接收方可能会将它们合并成一个或多个大的数据包,而不是按照发送方发送的原始数据包拆分成多个小的数据包进行接收。
造成粘包的原因主要有以下几个方面:
如果读者是一名Windows平台开发人员并从事过网络套接字开发,那么一定很清楚此缺陷的产生,当我们连续调用send()时就会产生粘包现象,而解决此类方法的最好办法是在每次send()后调用一次recv()函数接收一个返回值,至此由于数据包不连续则也就不会产生粘包的现象。
14.8.1 服务端实现

服务端我们实现的功能只有一个接收,其中RecvFunction函数主要用于接收数据包,通过使用recv函数接收来自socket连接通道的数据,并根据接收到的数据判断条件,决定是否发送数据回应。如果接收到的数据中命令参数满足command_int_a=10和command_int_b=20,那么该函数会构建一个新的数据包,将其发送回客户端,其中包括一个表示成功执行的标志、一个包含欢迎信息的字符串以及其他数据信息。如果接收到的数据命令参数不满足上述条件,则函数会构建一个新的数据包,将其发送回客户端,其中只包括一个表示执行失败的标志。最后,函数返回一个BOOL类型的布尔值,表示接收函数是否成功执行。
[code]#include #include #include #pragma comment(lib,"ws2_32.lib")typedef struct{  int command_int_a;  int command_int_b;  int command_int_c;  int command_int_d;  unsigned int command_uint_a;  unsigned int command_uint_b;  char command_string_a[256];  char command_string_b[256];  char command_string_c[256];  char command_string_d[256];  int flag;  int count;}send_recv_struct;// 调用接收函数BOOL RecvFunction(SOCKET &sock){  // 接收数据  char recv_buffer[8192] = { 0 };  int recv_flag = recv(sock, (char *)&recv_buffer, sizeof(send_recv_struct), 0);  if (recv_flag




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4