c中的客户端 - 服务器通信失败

时间:2016-03-22 10:03:22

标签: c arrays winsock

我正在尝试用于客户端和服务器之间通信的C程序。我希望我的服务器随机生成一个数组,将其发送到客户端并从客户端到服务器返回已排序的数组。但是,当我打印服务器发送的数组时,客户端只显示零。我想在服务器中发送功能或在客户端接收/读取功能都有问题。这是我的代码:

服务器端: 1-创建一个随机数组

    //int ip[255];
    void GenIpArray()//generate random values and store in ip[]
        {
            for(int i=0;i<255;i++)
                {
                    ip[i]= rand()%100 + 100;
                }
        }

2-将数组发送到客户端

void write(LPVOID sock_fd)//int sock_fd=socket(AF_INET,SOCK_STREAM,0);
    {
        while(1)
            {
                send((int)sock_fd,(char*)&ip,255,0);
                //let int ip[255] = {123, 109, 240, 150};
            }
    }

客户端: 1-从服务器接收

void read(LPVOID sock_fd)
    {
        while(1)
            {
                if(recv((unsigned int)sock_fd,(char*)&arr,255,0)>0)
                {
                    printf("recevied: ");
                    strcpy((char*)x, (char*)arr);
                    printf("%c",(char *)&x);//this statement prints @       
                    printArray();//function to print array  
                    break;
               }
           }
    }

2-打印数组的功能

    void printArray()
        {
            printf("\n\n Printing the array:\n");
            for(int k=0;k<255;k++)
                printf("\n %d",x[k]);
        }

2 个答案:

答案 0 :(得分:2)

首先,您需要send正确的尺寸:

send((int)sock_fd, (char *)ip, 255 * sizeof(int), 0);

然后,您需要recv正确的尺寸,直接将其读入x

size_t bytes_received = recv((int)sock_fd, (char *)x, 255 * sizeof(int), 0);

现在x包含bytes_received / sizeof(int)个数字:

size_t ints_received = bytes_received / sizeof(int);

所以你可以使用这个数字来循环和打印它们:

for (unsigned int k = 0; k < ints_received; k++) {
    printf("%d\n", x[k]);
}

为了便于移植,您应该在发送int之前将htons转换为网络字节顺序,然后在收到它们之后将其转换回主机字节顺序ntohs

答案 1 :(得分:1)

错误只是使用strcpy!它会在第一个空值上停止复制,并且您在100到200之间发送整数。因此,最好只有第一个字节将以x结束,而所有其他字节将是开头的那个(静态持续时间数组为0) )。

永远不要将strcpy 用于二进制数据,但只能使用memcpy

并非全部:

  • 你应该总是控制发送和接收的返回值。
  • printf("%c",(char *)&x);没有意义:您打印地址的第一个字节或x数组
  • 如果iparr真正的数组(不是指针),请直接使用sizeof(ip)sizeof(arr)

    send((int)sock_fd,(char*)ip,sizeof(ip),0);
    recv((unsigned int)sock_fd,(char*)arr,sizeof(arr),0)