c中客户端-服务器通信失败
failure in client-server communication in c
我正在尝试使用 C 程序在客户端和服务器之间进行通信。我希望我的服务器随机生成一个数组,将其发送到客户端,然后将排序后的数组从客户端返回到服务器。但是,当我打印服务器发送的数组时,客户端只显示零。我猜服务器中的发送函数或客户端中的 receive/read 函数有问题。这是我的代码:
服务器端:
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]);
}
首先,您需要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]);
}
为了便携性,您真的应该在发送之前使用 htons
将 int
转换为网络字节顺序,然后在发送之后使用 ntohs
将它们转换回主机字节顺序收到他们。
错误只是使用了strcpy
!它在第一个 null 时停止复制,并且您发送的是 100 到 200 之间的整数。因此充其量只有第一个字节以 x
结尾,所有其他字节将是开头的内容(静态持续时间数组为 0 ).
永远不要对二进制数据使用 strcpy
,但只能使用 memcpy
这还不是全部:
- 您应该始终控制发送和接收的 return 值。
printf("%c",(char *)&x);
是无意义的:您打印地址的第一个字节或 x
数组
如果ip
和arr
是真正的数组(不是指针)直接使用sizeof(ip)
和sizeof(arr)
send((int)sock_fd,(char*)ip,sizeof(ip),0);
recv((unsigned int)sock_fd,(char*)arr,sizeof(arr),0)
我正在尝试使用 C 程序在客户端和服务器之间进行通信。我希望我的服务器随机生成一个数组,将其发送到客户端,然后将排序后的数组从客户端返回到服务器。但是,当我打印服务器发送的数组时,客户端只显示零。我猜服务器中的发送函数或客户端中的 receive/read 函数有问题。这是我的代码:
服务器端: 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]);
}
首先,您需要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]);
}
为了便携性,您真的应该在发送之前使用 htons
将 int
转换为网络字节顺序,然后在发送之后使用 ntohs
将它们转换回主机字节顺序收到他们。
错误只是使用了strcpy
!它在第一个 null 时停止复制,并且您发送的是 100 到 200 之间的整数。因此充其量只有第一个字节以 x
结尾,所有其他字节将是开头的内容(静态持续时间数组为 0 ).
永远不要对二进制数据使用 strcpy
,但只能使用 memcpy
这还不是全部:
- 您应该始终控制发送和接收的 return 值。
printf("%c",(char *)&x);
是无意义的:您打印地址的第一个字节或x
数组如果
ip
和arr
是真正的数组(不是指针)直接使用sizeof(ip)
和sizeof(arr)
send((int)sock_fd,(char*)ip,sizeof(ip),0); recv((unsigned int)sock_fd,(char*)arr,sizeof(arr),0)