编程实例:
CSocket.h
#include <iostream>
#include<sys/socket.h>
#include<sys/un.h>
#include<netinet/in.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#include <errno.h>
#include <arpa/inet.h>
#include <fcntl.h>
#include <netdb.h>
#include <stdio.h>
#include <netinet/tcp.h>
class CServSocket
{
public:
CServSocket();
virtual ~CServSocket();
std::string getLocalAddr();
std::string getCliAddr();
int getAcceptSock();
bool Accept();
bool Listen(int port);
bool Send(char* sendbuf, int len);
bool Recv(char* recvbuf, int len, int timeout);
private:
bool Close();
bool setSoLinger(bool dolinger, int seconds);
bool setIntOptions(int option, int value);
bool setTimeout(int option, int milliseconds);
bool setNonBlock(bool isnonsocket);
bool setNoDelay(bool nodelay);
private:
char ip[20];
int port;
int sockfd;
int connsockfd;
struct sockaddr_in servAddr, cliAddr;
};
CServSocket::CServSocket():port(0),sockfd(-1),connsockfd(-1)
{
memset(ip, 0, 20);
}
CServSocket::~CServSocket()
{
if(!Close())
{
std::cout << "close err\n";
}
}
bool CServSocket::Close()
{
if(sockfd)
close(sockfd);
else
return false;
if(connsockfd)
close(connsockfd);
else
return false;
sockfd = connsockfd = port = -1;
return true;
}
bool CServSocket::Listen(int port)
{
if(port < 0)
{
std::cout <<"the port err\n";
return false;
}
sockfd = ::socket(AF_INET, SOCK_STREAM, 0);
if(sockfd < 0)
{
std::cout << "create socket err\n";
return false;
}
getLocalAddr();
servAddr.sin_family = AF_INET;
if(ip)
servAddr.sin_addr.s_addr = inet_addr(ip);
else
servAddr.sin_addr.s_addr = htonl(INADDR_ANY);
servA