/*************很简单的一个发送接收***********************************/
SOCKET sListen = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(sListen == INVALID_SOCKET)
{
printf("Failed socket() \n");
return 0;
}

// 填充sockaddr_in结构
sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port = htons(4567);
sin.sin_addr.S_un.S_addr = INADDR_ANY;

// 绑定这个套节字到一个本地地址
if(::bind(sListen, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR)
{
printf("Failed bind() \n");
return 0;
}

// 进入监听模式
if(::listen(sListen, 2) == SOCKET_ERROR)
{
printf("Failed listen() \n");
return 0;
}
/********************************************************************************/
// 循环接受客户的连接请求
sockaddr_in remoteAddr; 
int nAddrLen = sizeof(remoteAddr);
SOCKET sClient;
    
    /*****************************************************************************/
while(TRUE)
{
// 接受一个新连接
sClient = ::accept(sListen, (SOCKADDR*)&remoteAddr, &nAddrLen);
if(sClient == INVALID_SOCKET)
{
printf("Failed accept()");
continue;
}

printf(" 接受到一个连接:%s \r\n", inet_ntoa(remoteAddr.sin_addr));
break; }
    
       char buffer[1024];
     char temp[1024];
 char *pBuffer;
     memset(buffer,0,sizeof(buffer));
      memset(temp,0,sizeof(temp));
     int rcv = recv(sClient,buffer, 1024, 0);
 int i=0;
     for (; buffer[i]!='*'; i++)
 {
     temp[i] = buffer[i];
 }      temp[i++] = '\0';
         long lFileSize = atol(temp);
         printf("%ld",lFileSize);         pBuffer=new char[lFileSize+1];
 pBuffer[0]='\0';
 char* pBuf = pBuffer;
 long iTemp = 0;
 for (int j=i; j<rcv; j++)
 {
  pBuf[iTemp++] = buffer[j];
 }
 while (1)
 {
rcv = recv(sClient, buffer, 1024, 0);
  if (rcv == -1) 
  { 
                              //链路异常断开了 
                                     break; 
  } 
                          else if(rcv == 0) 
   { 
                             //这种情况就是lFileSize计算错了有可能出现。 
                                   break; 
   } 
for (int ij=0; ij<=rcv; ij++)
{
pBuf[ij+iTemp] = buffer[ij];
}
iTemp += rcv;
if (iTemp >= lFileSize)
{
break;
}
}
        FILE *file = fopen("c:\\nn15.bmp","wb");
        
                fwrite(pBuf,1,lFileSize,file); 
                fclose(file); /******************************************************************************************/发送方
/*******************************************************************************************/     SOCKET s = NULL ;
     s = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(s == INVALID_SOCKET)
{
printf(" Failed socket() \n");
return ;
}

// 填写远程地址信息
sockaddr_in servAddr; 
servAddr.sin_family = AF_INET;
servAddr.sin_port = htons(4567);
        servAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
while(1)
{
     if(::connect(s, (sockaddr*)&servAddr, sizeof(servAddr)) == 0)
 break;
 ::Sleep(1000);
}
        FILE *pFile;    //原文件流
         FILE *pFileSave;//目标文件流
          int iTmp = 0;
//打开源文件 ,只读方式
         pFile = fopen("c:\\lpFileName.bmp","rb");
if(pFile == NULL){ 
          printf("%s : No such file or directory.\nFailed to open file for reading.\n"); 
} fseek(pFile,0L,2);        long lenbuf = ftell(pFile);
rewind(pFile);
char *buffpic = new char[lenbuf+1];//开辟长度缓冲区
memset(buffpic,0,sizeof(buffpic));//清0        fread(buffpic, lenbuf+1, 1,pFile);//读入输入流
char temp[260];
memset(temp,0,sizeof(temp));//缓冲区清0
        ltoa(lenbuf, temp, 10);//文件长度
int templen = strlen(temp);//转整形
char *filebuff = new char[templen+lenbuf+2]; //将数据存入缓冲区
         memcpy(filebuff, temp, templen); 
        *(filebuff + templen) = '*';
        memcpy(filebuff+templen+1, temp, templen); iTmp =::send(s,filebuff,templen+lenbuf+1,0);