服务端与客户端进行通信,服务端实现不定长接收数据与文本。
recvvl是不定长处理数据
recv是定长处理数据
recvvlfile是不定长处理文本
recvfile是定长处理文本
服务端接收数据时,若遇见“#”代表接收结束,本次代码对文本名字进行单个字符的接收,若遇见“#”也表示接收文件名结束。
服务端:
#include "stdio.h"
//#include "windows.h"
#include "ws2tcpip.h"
#include "winsock2.h"
#pragma comment(lib,"Ws2_32.lib")
#define default_port "4444"
//定长数据
int recvn(SOCKET s,char *recvbuf,unsigned int fixedlen)
{
int iResult;
int cnt;
cnt = fixedlen;
int count=0;
while(cnt>0)
{
iResult = recv(s,recvbuf,cnt,0);
count++;
if(iResult>0)
{
printf("%d--接收到的字节数:%d\n",count,iResult);
for(int i=0;i<iResult;i++)
if( recvbuf[iResult-1] != '#')
printf("%c",recvbuf[i]);
else
exit(0);
printf("\n");
recvbuf += iResult;
cnt -= iResult;
}
else if(iResult==0)
{
//printf("连接关闭5\n");
return fixedlen-cnt;
}
else
{
printf("连接发生错误1\n");
return -1;
}
}
return fixedlen;
}
//recvnfile
int recvnfile(SOCKET s,char *recvbuf,unsigned int fixedlen,FILE *fp)
{
int iResult;
int cnt;
cnt = fixedlen;
int count=0;
while(cnt>0)
{
iResult = recv(s,recvbuf,cnt,0);
count++;
if(iResult>0)
{
fwrite(recvbuf,sizeof(char),iResult,fp);
recvbuf += iResult;
cnt -= iResult;
}
else if(iResult==0)
{
//printf("连接关闭5\n");
return fixedlen-cnt;
}
else
{
printf("连接发生错误1\n");
return -1;
}
}
return fixedlen;
}
//变长数据接收
int recvvl(SOCKET s,char *recvbuf, unsigned int recvbuflen)
{
int iResult;//存储单次recv操作的返回值
unsigned int reclen; //用于存储消息首部存储的长度信息
iResult = recvn(s,(char *)&reclen,sizeof(unsigned int));
if(iResult != sizeof(unsigned int))
{
if(iResult == -1)
{
printf("接收发生错误2");
return -1;
}
else
{
printf("连接关闭4");
r