=-O Seems that's my problem. Thanks Alex!

On Mon, Jun 20, 2011 at 2:03 PM, Alex Leone <[email protected]> wrote:

> Do you ever call listen() on the server socket?
>
>  - Alex
>
> On Mon, Jun 20, 2011 at 10:08 AM, Cong <[email protected]> wrote:
>
>> Thanks Pierre-Yves!
>>
>> I modified my code setting non-blocking socket using the way you
>> described. The problem is still the same. The function "setupServerSocket"
>> has been used before and seems working, still I pasted related functions as
>> below:
>>
>> int setupSocket(int theType)
>> {
>>     int fd = 0;
>>     if ((fd = socket(PF_INET, theType, 0)) == -1)
>>     {
>>         perror("setupSocket:socket");
>>         return -1;
>>     }
>>
>>     int yes = 1;
>>     if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes)) < 0) {
>>         perror("setsockopt");
>>         close(fd);
>>         return -1;
>>     }
>>     return fd;
>> }
>>
>>
>> void setServerSockAddr(sockaddr_in& theSockAddr, string theServerIp, ui16
>> theServerPort)
>> {
>>     theSockAddr.sin_family = AF_INET;
>>     theSockAddr.sin_port = htons(theServerPort);
>>     theSockAddr.sin_addr.s_addr = inet_addr(theServerIp.c_str());
>>     memset(theSockAddr.sin_zero, '\0', sizeof theSockAddr.sin_zero);
>> }
>>
>> int setupServerSocket(int theType, string theServerIp, ui16 theServerPort)
>> {
>>     int fd = setupSocket(theType);
>>     if (fd < 0) {
>>         exit(1);
>>     }
>>
>>     sockaddr_in serverAddr;
>>     setServerSockAddr(serverAddr, theServerIp, theServerPort);
>>     if (bind(fd, (sockaddr *)&serverAddr, sizeof serverAddr) == -1)
>>     {
>>         perror("setupServerSocket:bind");
>>         exit(1);
>>     }
>>     return fd;
>> }
>>
>> And now I call the function setNonblocking at the previous line calling
>> fcntl.
>> int setNonblocking(int fd)
>> {
>>     int flags;
>> #if defined(O_NONBLOCK)
>>     if ((flags = fcntl(fd, F_GETFL, 0)) == -1) {
>>         flags = 0;
>>     }
>>     return fcntl(fd, F_SETFL, flags | O_NONBLOCK);
>> #else
>>     flags = 1;
>>     return ioctl(fd, FIONBIO, &flags);
>> #endif
>>
>> }
>>
>>
>>
>> On Fri, Jun 17, 2011 at 5:20 PM, Pierre-Yves Kerembellec <
>> [email protected]> wrote:
>>
>>> Hi Cong,
>>>
>>> > I'm a newbie to libev. I wrote a TCP server with libev. My program has
>>> a relatively simple structure, with accept_cb, read_cb, write_cb and
>>> timeout_cb defined. However, when I started it, I found the accept call back
>>> is called right away and being called about 60K+ times per second. Each
>>> "accept()" call sets the errno to EINVAL, since there's no connection. The
>>> program uses more than 50% CPU time.
>>>
>>> Do you properly bind the listening socket in the setupServerSocket ?
>>> Could you reproduce the content of the setServerSocket() function ?
>>>
>>> Also, instead of:
>>>
>>> fcntl(svrSockFd, F_SETFL, O_NONBLOCK);
>>>
>>> you should use:
>>>
>>> fcntl(svrSockFd, F_SETFL, fcntl(svrSockFd, F_GETFL, 0) | O_NONBLOCK);
>>>
>>> or even better (one less system call):
>>>
>>> int flag = 1;
>>> ioctl(svrSockFd, FIONBIO, &flag);
>>>
>>> > My question is that if this is correct? Or there could be something
>>> wrong with my program? If this is expected, then do I need to let the
>>> accept_cb to sleep to avoid making the CPU too busy? But wouldn't sleeping
>>> affect the performance of the server?
>>> >
>>> > Thanks for your attention!
>>> >
>>> > Shawn
>>> >
>>> > Part of my source code:
>>> > In main(),
>>> > ===============
>>> >
>>> >       int svrSockFd = setupServerSocket(SOCK_STREAM, g->m_ip,
>>> g->m_port);
>>> >
>>> >       // Make socket non-blocking.
>>> >       fcntl(svrSockFd, F_SETFL, O_NONBLOCK);
>>> >
>>> >       ev_io* acceptWatcher = (ev_io*)malloc(sizeof(ev_io));
>>> >
>>> >       // Init watcher
>>> >       ev_io_init(acceptWatcher, accept_cb, svrSockFd, EV_READ);
>>> >
>>> >       // Start watcher
>>> >       struct ev_loop* loop = EV_DEFAULT;
>>> >       ev_io_start(loop, acceptWatcher);
>>> >
>>> >       // Wait for events to arrive
>>> >       ev_run(loop, 0);
>>> >
>>> > The accept_cb:
>>> > =====================
>>> > static void accept_cb(struct ev_loop* loop, ev_io* w, int revents)
>>> > {
>>> >       Log::debug("serverSocket received data");
>>> >       int svrSockFd = w->fd;
>>> >
>>> >       // accept
>>> >       sockaddr_in clientAddress;
>>> >       socklen_t sin_size = (socklen_t)sizeof(clientAddress);
>>> >       int newSockFd = accept(svrSockFd, (sockaddr *)&clientAddress,
>>> &sin_size);
>>> >       if (newSockFd < 0) {    // -1, EAGAIN??
>>> >               if (errno == EINVAL) {
>>> >                       //cout << "no connection" << endl;
>>> >               } else {
>>> >                       perror("accept");
>>> >               }
>>> >       } else {
>>> >               // Handle the connection
>>> >                 ...
>>> >       }
>>> > }
>>>
>>>
>>> Regards,
>>> Pierre-Yves
>>>
>>>
>>
>> _______________________________________________
>> libev mailing list
>> [email protected]
>> http://lists.schmorp.de/cgi-bin/mailman/listinfo/libev
>>
>
>
_______________________________________________
libev mailing list
[email protected]
http://lists.schmorp.de/cgi-bin/mailman/listinfo/libev

Reply via email to