int mySend(int fd, char *msg, int len)
{
if (NULL == msg || fd < 0 || len < 0)
{
perror("mySend arg error");
return -1;
}
int datasize = len + 4; //实际数据大小
char *pdata = (char *)malloc(datasize); //开辟空间
if (NULL == pdata)
{
perror("malloc");
return -1;
}
memset(pdata, 0, datasize); //清空内存
int head = htons(len); //头部转换至网络字节序
memcpy(pdata, &head, 4); //复制头部
memcpy(pdata + 4, msg, len); //复制消息
char *ptemp = pdata; //临时指针
int sizetemp = datasize; //临时大小
while (sizetemp > 0)
{
int ret = send(fd, ptemp, sizetemp, 0);
if (-1 == ret)
{
close(fd);
return -1;
}
else if (0 == ret)
{
continue;
}
ptemp = ptemp + ret;
sizetemp = sizetemp - ret;
}
free(pdata);
return datasize;
}
int myRecv(int fd, char **msg)
{
if (NULL == msg || fd < 0)
{
perror("myRecv arg error");
return -1;
}
int head = 0;
int len = 0;
int num = 4;
char *p = (char *)&head;
while (len < 4)
{
int ret = recv(fd, p, num, 0);
if (-1 == ret)
{
return -1;
}
else if (0 == ret)
{
return 0;
}
len = len + ret;
p = p + ret;
num = num - ret;
}
head = ntohs(head);
if (4 == len)
{
char *p = (char *)malloc(head + 1);
memset(p, 0, head + 1);
len = recv(fd, p, head, 0);
if (len != head)
{
free(p);
return -1;
}
p[len] = '\0';
*msg = p;
}
else
{
return -1;
}
return len;
}