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