11bc8a9dfSShuo Chen // Copyright 2010, Shuo Chen.  All rights reserved.
21bc8a9dfSShuo Chen // http://code.google.com/p/muduo/
31bc8a9dfSShuo Chen //
41bc8a9dfSShuo Chen // Use of this source code is governed by a BSD-style license
51bc8a9dfSShuo Chen // that can be found in the License file.
61bc8a9dfSShuo Chen 
71bc8a9dfSShuo Chen // Author: Shuo Chen (chenshuo at chenshuo dot com)
81bc8a9dfSShuo Chen //
91bc8a9dfSShuo Chen // This is an internal header file, you should not include this.
101bc8a9dfSShuo Chen 
111bc8a9dfSShuo Chen #ifndef MUDUO_NET_SOCKET_H
121bc8a9dfSShuo Chen #define MUDUO_NET_SOCKET_H
131bc8a9dfSShuo Chen 
141bc8a9dfSShuo Chen #include <boost/noncopyable.hpp>
151bc8a9dfSShuo Chen 
161bc8a9dfSShuo Chen namespace muduo
171bc8a9dfSShuo Chen {
181bc8a9dfSShuo Chen 
191bc8a9dfSShuo Chen class InetAddress;
201bc8a9dfSShuo Chen 
211bc8a9dfSShuo Chen ///
221bc8a9dfSShuo Chen /// Wrapper of socket file descriptor.
231bc8a9dfSShuo Chen ///
241bc8a9dfSShuo Chen /// It closes the sockfd when desctructs.
251bc8a9dfSShuo Chen /// It's thread safe, all operations are delagated to OS.
261bc8a9dfSShuo Chen class Socket : boost::noncopyable
271bc8a9dfSShuo Chen {
281bc8a9dfSShuo Chen  public:
291bc8a9dfSShuo Chen   explicit Socket(int sockfd)
301bc8a9dfSShuo Chen     : sockfd_(sockfd)
311bc8a9dfSShuo Chen   { }
321bc8a9dfSShuo Chen 
331bc8a9dfSShuo Chen   ~Socket();
341bc8a9dfSShuo Chen 
351bc8a9dfSShuo Chen   int fd() const { return sockfd_; }
361bc8a9dfSShuo Chen 
371bc8a9dfSShuo Chen   /// abort if address in use
381bc8a9dfSShuo Chen   void bindAddress(const InetAddress& localaddr);
391bc8a9dfSShuo Chen   /// abort if address in use
401bc8a9dfSShuo Chen   void listen();
411bc8a9dfSShuo Chen 
421bc8a9dfSShuo Chen   /// On success, returns a non-negative integer that is
431bc8a9dfSShuo Chen   /// a descriptor for the accepted socket, which has been
441bc8a9dfSShuo Chen   /// set to non-blocking and close-on-exec. *peeraddr is assigned.
451bc8a9dfSShuo Chen   /// On error, -1 is returned, and *peeraddr is untouched.
461bc8a9dfSShuo Chen   int accept(InetAddress* peeraddr);
471bc8a9dfSShuo Chen 
481bc8a9dfSShuo Chen   ///
491bc8a9dfSShuo Chen   /// Enable/disable SO_REUSEADDR
501bc8a9dfSShuo Chen   ///
511bc8a9dfSShuo Chen   void setReuseAddr(bool on);
521bc8a9dfSShuo Chen 
531bc8a9dfSShuo Chen+  void shutdownWrite();
541bc8a9dfSShuo Chen+
551bc8a9dfSShuo Chen  private:
561bc8a9dfSShuo Chen   const int sockfd_;
571bc8a9dfSShuo Chen };
581bc8a9dfSShuo Chen 
591bc8a9dfSShuo Chen }
601bc8a9dfSShuo Chen #endif  // MUDUO_NET_SOCKET_H
61