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

Posted

技术标签:

【中文标题】c中客户端-服务器通信失败【英文标题】:failure in client-server communication in c 【发布时间】:2016-03-22 10:03:22 【问题描述】:

我正在尝试使用 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]);
        

【问题讨论】:

iparr是如何定义的? 我尝试删除 & 但输出没有变化。我将 arr 声明为 int arr[255];和 ip 作为 int ip[255]; x 是 int x[255]; 你发的不够多:见***.com/help/mcve sizeof(ip) 不是 255,而是 sizeof(int)*255,尝试在 send()/recv() 中使用它作为 size 你需要捕获/打印/调试recvsend的实际返回值。 【参考方案1】:

首先,你需要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]);

为了可移植性,您确实应该在发送之前将ints 转换为htons 的网络字节顺序,然后在收到它们后将它们转换回ntohs 的主机字节顺序。

【讨论】:

我已将 ip 和 x 分配为 'int ip[255];'和'int x [255]; ',VS 2010 显示错误,说:“int * is incompatible with parameters of type const char*” 啊,Windows。好的,进行转换,但不要将其视为 char*,在其上使用 strcpy() 或类似内容。【参考方案2】:

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

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

这还不是全部:

您应该始终控制发送和接收的返回值。 printf("%c",(char *)&amp;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)

【讨论】:

以上是关于c中客户端-服务器通信失败的主要内容,如果未能解决你的问题,请参考以下文章

C# 服务器客户端在连接 UWP 时失败

HTTPS 通信失败,jdk 1.6(32 位客户端)与 jdk 1.8(64 位)服务器:读取:未知 3.3 警报,长度 = 2

这在 C/C++ 套接字通信中是不是合理?

客户端服务器通信c ++中收到的垃圾值

使用 openjdk 1.8 的 Java SSL 通信握手失败

C语言中的套接字通信。发送文件内容