我正在学习用winsock API写程序客户端 发送 本机机器名、本机IP、一个文件名、文件长度
服务器 接收 以上四项内容可是我每次只收到 机器名 ,其它的都收不到, 请各位指点------------服务器端 //sockRecv 已经建好 unsigned long cmd = 0;
if(ioctlsocket(sockRecv, FIONBIO, &cmd) == SOCKET_ERROR)
{
Log("%s Error in setting block, %d", WSAGetLastError());
return FALSE;
} int iReceiveCount = -1;
char buffer[1024]; //接收缓冲区 memset(buffer, 0, sizeof(buffer));
iReceiveCount = recv(sockRecv, buffer, sizeof(buffer), 0);//接收发送方机器名称
if(iReceiveCount < 0)
{
Log("%s Error in receiving data, %d", WSAGetLastError());
return false;
}
CString strClientName;
strClientName.Format("%s", buffer); memset(buffer, 0, sizeof(buffer));
iReceiveCount = recv(sockRecv, buffer, sizeof(buffer), 0);//接收发送方机器IP
if(iReceiveCount < 0)
{
Log("%s Error in receiving data, %d", WSAGetLastError());
return false;
}
CString strClientIP;
strClientIP.Format("%s", buffer); memset(buffer, 0, sizeof(buffer));
iReceiveCount = recv(sockRecv, buffer, sizeof(buffer), 0);//接收发送的文件名
if(iReceiveCount < 0)
{
Log("%s Error in receiving data, %d", WSAGetLastError());
return false;
}
CString strFileFullName;
strFileFullName.Format("g:\\data\\%s", buffer);
-------------客户端
char buffer[1024]; memset(buffer, 0, sizeof(buffer));
strcpy(buffer, m_strHostName);
sockSend.Send(buffer, m_strHostName.GetLength()+1); //发送主机名
memset(buffer, 0, sizeof(buffer));
strcpy(buffer, m_strHostIP);
sockSend.Send(buffer, m_strHostIP.GetLength()+1); //发送主机IP
const CString strFileName = file.GetFileName();
memset(buffer, 0, sizeof(buffer));
strcpy(buffer, strFileName);
sockSend.Send(buffer, strFileName.GetLength()+1); //发送文件名
long lLength = file.GetLength(); 
sockSend.Send(&lLength, sizeof(long)); //发送文件大小到接收方

解决方案 »

  1.   

    1. 收到了,都在机器名里,看内存,因为你发送时候带了null,所以string看不到机器名结束后的东西。看buffer就知道了。
    2. windows发送出去的东西都组合在一起了,分几次接收没有用,一次就收完了。
      

  2.   

    strcpy(buffer, m_strHostName);
             strcat(buffer, ",");
    sockSend.Send(buffer, m_strHostName.GetLength()+1); //发送主机名
      

  3.   

    用一个结构,简单些。
    struct host
    {
        本机机器名;
    本机IP、一个文件名、文件长度
      

  4.   

    to: pclili(黑客天使)请问,我应该怎样写这段代码呢?或者说,怎样发送一个结构,怎样接收一个结构
      

  5.   

    把结构强制转换为char*就可以了,
    typedef struct struct_send
    {
     CString strServerName;
     int     nIP;
     CString strFileName;
     CString strFileLength;
    };struct_send sendBuf;
    sockSend.Send((char*)sendBuf, sizeof(struct_send));
    接收的时候把接收到的buf用(struct_send*)buf就可以转换回来了
      

  6.   

    这样不太好吧,用sizeof()时,字符串长度能计算出来吗