2013-06-26 70 views
0

在server.cpp我有两个int字段发送到client.cpp。我送了这种方式:使用套接字编程从服务器接收int值

if ((bytecount = send(*csock, portstring1, strlen(portstring1), 0)) == -1) { 
    fprintf(stderr, "Error sending data %d\n", errno); 
    goto FINISH; 
    } 

     sprintf(portstring2, "%d", ncount); 
if ((bytecount = send(*csock, portstring2, strlen(portstring2), 0)) == -1) { 
    fprintf(stderr, "Error sending data %d\n", errno); 
    goto FINISH; 
    } 

,并在接收端使用:

if((bytecount = recv(hsock, buffer, buffer_len, 0))== -1){ 
     fprintf(stderr, "Error receiving data %d\n", errno); 
     goto FINISH; 
    } 
    printf("Positive counts are :"); 
    printf(" %s \n",buffer); 

if((bytecount = recv(hsock, buffer2, buffer_len, 0))== -1){ 
     fprintf(stderr, "Error receiving data %d\n", errno); 
     goto FINISH; 
    } 
    printf("Negative count is :"); 
    printf(" %s \n",buffer2); 

但问题是,从服务器发送第一REC()函数捕获两个值,并没有达到第二接收功能。当我打印从第一个rec功能收到的数据时,它会显示从服务器发送的两个值。

我尝试使用数组来发送这两个值togather,但然后转换int数组聊天*成为我头痛。因为send和rec函数只处理char *值。甚至没有字符串。

任何想法,我怎么能在客户端得到两个值在不同的水平?

+1

如果你只想*接收* 4个字节,那么在你的第一次调用时指定,而不是'buffer_len'。但是,不要*忽略* bytecount'。所有你保证的是,你至少得到* 1 *字节。因此,您还需要添加一个循环来跟踪您收到的字节数,并在收到您需要的数字后继续询问更多。 –

+0

除非在每个'recv()'之前的某个地方将缓冲区设置为零,否则不要对%s使用'printf()'。你不会在“整数”字符串后面发送空字符,因为'strlen()'排除了它。 – thuovila

+0

@Damien_The_Unbeliever:字节大小不能被限制,每次可能会有所不同!对于我的案例 – user123

回答

0

接收者没有办法知道您发送2个项目或单个大型项目。您可能需要在此处实施您自己的协议。

如果你知道每个项目的大小,你可以尝试从recv缓冲区只读那么多。如果项目大小不同,您可以先发送大小,然后发送项目,以便在接收端可以先读取整数,然后将缓冲区设置为该大小,然后读取剩余的大小。

在你的情况下,前缀每个发送的字符串的长度(4字节) 在接收端读取4个字节并将其转换为int32,并获得要读取的消息长度。现在您可以将缓冲区大小设置为所需大小并读取。

由于Damien_The_Unbeliever提到你不能确保你一次收到完整的信息,你可能需要循环读取。

+0

字节大小可能每次都很适合后续接收! – user123

+0

感谢好友,读取我想先发送的字节大小,然后在下一步中收集大量数据只能解决我的问题! – user123

相关问题