连接到Redis时无法读取任何数据

时间:2011-12-13 19:42:13

标签: linux sockets redis

我有以下代码连接到端口6379本地运行的Redis。问题是无法读取任何输出,读取器线程只是阻塞recvfrom()。例如,使用echo服务器,一切正常,但Redis没有。

#include <stdio.h>     
#include <sys/socket.h> 
#include <arpa/inet.h>  
#include <stdlib.h>    
#include <string.h>    
#include <unistd.h>     
#include <pthread.h>

struct sockaddr_in servAddr;

int sock;

/* Reader loop */
void *readerf(void *n) {
   char buffer[128]; 
   int bytesRcvd;   
   while((bytesRcvd = recvfrom(sock, buffer, 127, 0, NULL, 0)) > 0) {
        printf("[%s]",buffer);        
   }
}

char *getk = "GET key\n";
char *setk = "SET key \"test\"\n";

void sendd(char *str) {
    if (send(sock, str, strlen(str), 0) != strlen(str))
        perror("Send error");
    send(sock, "\0", 1, 0);
    //printf("sent: [%s]",str);
}

int main(int argc, char *argv[]) {
    int i = 1;  

    if ((sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
        return 1;

    /* Construct the server address structure */
    memset(&servAddr, 0, sizeof(servAddr));     /* Zero out structure */
    servAddr.sin_family      = AF_INET;             /* Internet address family */
    servAddr.sin_addr.s_addr = inet_addr("127.0.0.1");   /* Server IP address */
    servAddr.sin_port        = htons(6379); /* Server port */
    if (connect(sock, (struct sockaddr *) &servAddr, sizeof(servAddr))<0)
        perror("Could not connect");    

    sendd(getk);
    sendd(setk);
    sendd(getk);    

    pthread_t reader;
    pthread_create(&reader, NULL, readerf, &i);

    sleep(5);
    close(sock);

    return 0;
}

1 个答案:

答案 0 :(得分:1)

您似乎没有正确实施Redis的协议:http://redis.io/topics/protocol

如果您正在认真对客户进行编码,而不仅仅是调查/玩得开心,请考虑使用hiredis:https://github.com/antirez/hiredis/