包括TCP 和UDP 以及客户端的 简单socket通讯实现。 #ifndef SERVERSOCKET__H #define SERVERSOCKET__H #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <unistd.h> #include <sys/uio.h> #include <sys/socket.h> #include <arpa/inet.h> #include <iostream> #include <string.h> #include <stdlib.h> #include <sys/wait.h> #include <cstdio> #include <fcntl.h> #include <ext/stdio_filebuf.h> #include <netdb.h> #include <wait.h> using namespace std; class ServerSocket { protected: int sin_size; int sockfd,new_fd; unsigned short port; struct sockaddr_in my_addr,their_addr,get_addr; public: ServerSocket(); virtual ~ServerSocket(); virtual int Socket(); void SetPort(unsigned short in_port); bool Bind(); void SetRemotePort(unsigned short in_port); unsigned short GetRemotePort(); // void GetRemoteAddrees(char *addrees); bool Connect(); void Listen(); void Accept(); int Send(const char *buf,int len); int Sendto(const char *buf,int len); int Recv(char *buf,int len); int Recvfrom(char *buf,int len); void Close(); }; class TCPserver:public ServerSocket { public: int Socket(); }; class UDPserver:public ServerSocket { public: int Socket(); }; class UDPclient:public UDPserver { public: int SetServer(char* server_addr, unsigned short in_port); }; #endif 函数实现: #include "server.h" ServerSocket::ServerSocket(){ } ServerSocket::~ServerSocket(){ Close(); } int UDPserver::Socket(){ sockfd = socket(AF_INET ,SOCK_DGRAM, 0); return sockfd; } int TCPserver::Socket(){ sockfd = socket(AF_INET,SOCK_STREAM, 0); return sockfd; } int ServerSocket::Socket(){ int i; i= sockfd = socket(AF_INET,SOCK_STREAM, 0); return sockfd; } void ServerSocket::SetPort(unsigned short in_port){ struct hostent *host; host=gethostbyname("192.168.1.135"); my_addr.sin_family = AF_INET; port = in_port; my_addr.sin_port = htons(port); my_addr.sin_addr = *((struct in_addr *)host->h_addr); // my_addr.sin_addr.s_addr=INADDR_ANY; bzero(&(my_addr.sin_zero),8); } void ServerSocket::SetRemotePort(unsigned short in_port){ their_addr.sin_port=htons(in_port); } unsigned short ServerSocket::GetRemotePort(){ return ntohs(get_addr.sin_port); } bool ServerSocket::Bind(){ cout<<my_addr.sin_addr.s_addr<<endl; if(bind(sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr))==-1) { perror("bind err/n"); return false; } return true; } int ServerSocket::Recvfrom(char *buf,int len){ char str[24] ; int numbytes; socklen_t addr_len = sizeof(their_addr); numbytes = recvfrom(sockfd,buf,len,0,(struct sockaddr *)&their_addr,&addr_len); printf("you ip is %s at port %d:%s/n", inet_ntop(AF_INET, &their_addr.sin_addr,str,24), ntohs(their_addr.sin_port),buf); cout<<strlen(buf)<<endl; if(numbytes == -1) { return false; } buf[numbytes] = '/0'; return numbytes; } int ServerSocket::Sendto(const char *buf,int len){ return sendto(sockfd,buf,len,0,(struct sockaddr *)&their_addr,sizeof(struct sockaddr)); } void ServerSocket::Close(){ close(sockfd); close(new_fd); } void ServerSocket::Listen(){ if(listen(sockfd,10)==-1) cout<<"listen err!/n"; } void ServerSocket::Accept(){ socklen_t size = sizeof(struct sockaddr_in); new_fd = accept(sockfd,(struct sockaddr *)&get_addr,&size); if(new_fd==-1){ perror("accept err!/n"); exit(1); } } int ServerSocket::Recv(char *buf,int len){ return recv(new_fd,buf,len,0); } int ServerSocket::Send(const char * buf, int len){ return send(new_fd,buf,len,0); } bool ServerSocket::Connect(){ if(connect(sockfd,(struct sockaddr *)&their_addr, sizeof(struct sockaddr))==-1) return false; return true; } int UDPclient::SetServer(char* server_addr, unsigned short in_port) { struct hostent *host; host=gethostbyname(server_addr); their_addr.sin_family = AF_INET; port = in_port; their_addr.sin_port = htons(port); their_addr.sin_addr = *((struct in_addr *)host->h_addr); bzero(&(their_addr.sin_zero),8); return 0;