0

I am a newbie in libevent, my program below is quite simple. I want to call bubufferevent_write several times, but is seems that it works only for the 1st time.

int main(int argc, char const *argv[])
{
    struct sockaddr_in serv_addr;
    struct hostent *server;

    int portno = atoi(argv[2]);

    server = gethostbyname(argv[1]);
    if (server == NULL) {
        fprintf(stderr,"ERROR, no such host\n");
    }

    bzero((char *) &serv_addr, sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;
    bcopy((char *)server->h_addr, (char *)&serv_addr.sin_addr.s_addr, server->h_length);
    serv_addr.sin_port = htons(portno);

    struct event_base* base = event_base_new();

    evutil_socket_t fd;
    fd = socket(AF_INET, SOCK_STREAM, 0);
    struct bufferevent* con_conn = bufferevent_socket_new(base,fd,BEV_OPT_CLOSE_ON_FREE);

    bufferevent_setcb(con_conn,NULL,NULL,NULL,NULL);
    bufferevent_enable(con_conn,EV_READ|EV_WRITE|EV_PERSIST);
    bufferevent_socket_connect(con_conn,(struct sockaddr*)&serv_addr,sizeof(struct sockaddr_in));
    int enable = 1;
    if(setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, (void*)&enable, sizeof(enable)) < 0)
        printf("TCP_NODELAY SETTING ERROR!\n");

    char data[5] = "sss";
    int i;
    for (i = 0; i < 2; ++i)
    {
        int rc = bufferevent_write(con_conn,data,5);
        printf("rc is %d\n", rc);
    }
    event_base_dispatch(base);  

    return 0;
}

My server side:

void error(char *msg)
{
    perror(msg);
    exit(1);
}

int main(int argc, char *argv[])
{
     int sockfd, newsockfd, portno, clilen;
     char buffer[256];
     struct sockaddr_in serv_addr, cli_addr;
     int n;
     if (argc < 2) {
         fprintf(stderr,"ERROR, no port provided\n");
         //exit(1);
     }
     sockfd = socket(AF_INET, SOCK_STREAM, 0);
     if (sockfd < 0) 
        error("ERROR opening socket");
     bzero((char *) &serv_addr, sizeof(serv_addr));
     portno = atoi(argv[1]);
     serv_addr.sin_family = AF_INET;
     serv_addr.sin_addr.s_addr = INADDR_ANY;
     serv_addr.sin_port = htons(portno);
     if (bind(sockfd, (struct sockaddr *) &serv_addr,
              sizeof(serv_addr)) < 0) 
              error("ERROR on binding");
     listen(sockfd,5);
     clilen = sizeof(cli_addr);
     printf("waiting...\n");
     newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
     sleep(5);
     bzero(buffer,256);
     n = read(newsockfd,buffer,255);
     if (n < 0) error("ERROR reading from socket");
     printf("Here is the message: %s\n",buffer);

     return 0; 
}
HuangJie
  • 1,488
  • 1
  • 16
  • 33
  • How do you know it only works one time? – user253751 Apr 05 '16 at 03:39
  • @immibis Thanks for your reply. I called bufferevent_write two times, and every time it returns 0. But on the server side, it only receives "sss" instead of "ssssss" – HuangJie Apr 05 '16 at 03:49
  • @immibis Hi, I have attached the code of server side. Thanks for your time. – HuangJie Apr 05 '16 at 03:53
  • 1
    I'm going to bet that the server *does* receive 10 bytes: 's', 's', 's', 0, 0, 's', 's', 's', 0, 0. You know that a 0 byte marks the end of a C string, and you're printing the received data as a C string? – user253751 Apr 05 '16 at 05:17

0 Answers0