包括TCP 和UDP 以及客户端的 简单socket通讯实现。
#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
函数实现:
}
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;