Hi All ,

I'm trying to use nonblock socket with epoll.
I wonder why I sometimes get stuck in socket function when I use VCL .
Code as following:
printf ("before socket\n");
if ((c_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
perror("create socket fail.\n");
exit(0);
}
printf ("after socket\n");
The only output is "before socket",socket function even dosen't return.
Thank you very much

complete code is in attachments

 
#include <cstdlib>
#include <string>
#include <string.h>
#include <iostream>
#include <unistd.h> 
 
#include <sys/epoll.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <sys/select.h>
#include <error.h>
#include <errno.h>
#include <fcntl.h>
#include <netinet/in.h>
#include <arpa/inet.h>
 
#include <pthread.h>
 
 
using namespace std;

int ep = -1;
 
void* epoll_loop(void* arg) {
    ep = epoll_create(1024);
    struct epoll_event eventArr[1000];
    int status, err;
    socklen_t len;
    len = sizeof (err);
    while (1){
        int n = epoll_wait(ep, eventArr, 20, -1);
        printf ("%d\n", n);
        for (int i = 0; i < n; i++) {
            epoll_event ev = eventArr[i];
            int events = ev.events;
            int c_fd = ev.data.fd;
            printf ("fd:%d\n", c_fd);
            if (events & EPOLLERR) {
                printf ("EPOLLERR\n");
                status = getsockopt(c_fd, SOL_SOCKET, SO_ERROR, &err, &len);
                cout << status << "," << err << endl;
            }
            if (events & EPOLLIN) {
                printf ("EPOLLIN\n");
                status = getsockopt(c_fd, SOL_SOCKET, SO_ERROR, &err, &len);
                cout << status << "," << err << endl;
            }
            if (events & EPOLLOUT) {
                printf ("EPOLLOUT\n");
            }
        }
    }
}
 
void* test_epoll (void* arg) {
    string ip = "192.168.216.1";
    int port = 5201;
    int c_fd, flags, ret;
    struct sockaddr_in s_addr;
    memset(&s_addr, 0, sizeof (s_addr));
    s_addr.sin_family = AF_INET;
    s_addr.sin_port = htons(port);
    s_addr.sin_addr.s_addr = inet_addr(ip.c_str());
 
 
    printf ("before socket\n");
    if ((c_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
        perror("create socket fail.\n");
        exit(0);
    }
    printf ("after socket\n");
    flags = fcntl(c_fd, F_GETFL, 0);
    if (flags < 0) {
        perror("get socket flags fail.\n");
        exit (-1);
    }
 
    if (fcntl(c_fd, F_SETFL, flags | O_NONBLOCK) < 0) {
        perror("set socket O_NONBLOCK fail.\n");
        exit (-1);
    }
    struct epoll_event event;
    event.events = EPOLLIN | EPOLLOUT | EPOLLET;
    event.data.fd = c_fd;
    epoll_ctl(ep, EPOLL_CTL_ADD, c_fd, &event);

    ret = connect(c_fd, (struct sockaddr*) &s_addr, sizeof (struct sockaddr));

    if (ret < 0) {
        if (errno == EINPROGRESS) {
            return 0;
        } else {
            perror("connect remote server fail.\n");
            printf("%d\n", errno);
            exit(0);
        }
    }
    return 0;
}


int main(int argc, char** argv) {
    pthread_t tid1, tid2, tid3;
    int rc1 = 0, rc2 = 0, rc3 = 0;
        rc1 = pthread_create(&tid1, NULL, epoll_loop, NULL);
        if(rc1 != 0)
                printf("%s: %s\n",__func__, strerror(rc1));

    sleep (1);
        rc2 = pthread_create(&tid2, NULL, test_epoll, NULL);
        if(rc2 != 0)
                printf("%s: %s\n",__func__, strerror(rc2));
    sleep (1);
    rc3 = pthread_create(&tid3, NULL, test_epoll, NULL);
        if(rc3 != 0)
                printf("%s: %s\n",__func__, strerror(rc3));
    while (1)
    {
        sleep(1);
    }
    
    return 0;
}
-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.
View/Reply Online (#21282): https://lists.fd.io/g/vpp-dev/message/21282
Mute This Topic: https://lists.fd.io/mt/90680910/21656
Mute #socket-api:https://lists.fd.io/g/vpp-dev/mutehashtag/socket-api
Group Owner: vpp-dev+ow...@lists.fd.io
Unsubscribe: https://lists.fd.io/g/vpp-dev/unsub [arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to