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

c中的客户机-服务器通信失败,c,arrays,winsock,C,Arrays,Winsock,我正在尝试一个C程序,用于客户端和服务器之间的通信。我希望我的服务器随机生成一个数组,将其发送到客户端,并从客户端到服务器返回排序后的数组。但是,当我打印服务器发送的数组时,客户端只显示零。我猜服务器中的发送函数或客户端中的接收/读取函数都有问题。这是我的密码: 服务器端: 1-创建随机数组 //int ip[255]; void GenIpArray()//generate random values and store in ip[] {

我正在尝试一个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;
                }
        }
客户端: 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]);
        }
void printary()
{
printf(“\n\n打印数组:\n”);

对于(int k=0;k首先,您需要
发送
正确的大小:

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
包含
接收的字节数/sizeof(int)
数字:

size_t ints_received = bytes_received / sizeof(int);
因此,您可以使用此编号循环并打印它们:

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

为了便于携带,您应该在发送前将
int
s转换为使用
hton
的网络字节顺序,然后在接收后使用
ntohs
将其转换回主机字节顺序。

首先,您需要
发送
正确的大小:

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
包含
接收的字节数/sizeof(int)
数字:

size_t ints_received = bytes_received / sizeof(int);
因此,您可以使用此编号循环并打印它们:

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

为了便于移植,您应该在发送前将
int
s转换为使用
hton
的网络字节顺序,然后在接收后使用
ntohs
将它们转换回主机字节顺序。

错误只是使用了
strcpy
!它在第一个空值时停止复制,您正在发送ts介于100和200之间。因此,充其量只有第一个字节将以
x
结尾,而所有其他字节都将是开头的字节(静态持续时间数组为0)

永远不要对二进制数据使用
strcpy
,而只能使用
memcpy

这还不是全部:

  • 您应该始终控制send和receive的返回值
  • printf(“%c”,(char*)&x);
    是无意义的:打印地址或
    x
    数组的第一个字节
  • 如果
    ip
    arr
    是实数组(不是指针),则直接使用
    sizeof(ip)
    sizeof(arr)


错误仅仅是使用了
strcpy
!它在第一个空值时停止复制,并且您正在发送介于100和200之间的整数。因此,充其量只有第一个字节将以
x
结尾,而所有其他字节都将是开头的字节(静态持续时间数组为0)

永远不要对二进制数据使用
strcpy
,而只能使用
memcpy

这还不是全部:

  • 您应该始终控制send和receive的返回值
  • printf(“%c”,(char*)&x);
    是无意义的:打印地址或
    x
    数组的第一个字节
  • 如果
    ip
    arr
    是实数组(不是指针),则直接使用
    sizeof(ip)
    sizeof(arr)


如何定义
ip
arr
?我尝试删除,但输出没有变化。我声明arr为int-arr[255];ip为int-ip[255];x为int-x[255];您发布的内容不够:请参阅sizeof(ip)不是255,而是sizeof(int)*255,尝试在send()中使用该值作为大小您需要捕获/打印/调试
recv
send
的实际返回值。如何定义
ip
arr
?我尝试删除,但没有改变输出。我声明arr为int-arr[255];ip为int-ip[255];x为int-x[255];您发布的内容不够:请参阅sizeof(ip)不是255,而是sizeof(int)*255,尝试在send()/recv()中使用该值作为大小。您需要捕获/打印/调试
recv
send
的实际返回值。我已将ip和x分配为“int ip[255];”和“int x[255];”,VS 2010显示错误,显示:“int*与const char*类型的参数不兼容”啊,Windows。好的,确实强制转换它,但不要使用
strcpy()
或类似的方法将其视为
char*
。我已将ip和x分配为“int-ip[255];”和“int-x[255];”,VS 2010显示一个错误,显示:“int*与const-char*类型的参数不兼容”啊,Windows。好的,确实要对它进行强制转换,但不要使用strcpy()或类似的方法将其视为
char*