UNIX系统下的基于TCP协议的网络通信程序

1、包含头文件

2、NETCLASEE定义

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/stat.h>

ypedef struct netmessage
{
    int successFlag;  //是否成功
    int clientSocket; //客户端套接字
    int serverSocket; //服务端套接字
    struct sockaddr_in clientAddr;  //客户端地址
    struct sockaddr_in serverAddr;  //服务端地址
} NETMS;

typedef class netclass
{
 public:
    //服务端初始化  只需要port
    void NetInitS(int port);
    void NetAceptS();
    //客户端初始化  需要ip port
    void NetInitC();
    void NetConnectC(char ipaddress[] , int port);
    //网络收发
    int NetSend(char *buff,  int bufflen);   //成功返回0,失败返回-1
    int NetRecv(char *buff,  int bufflen);   //成功返回接收数据的长度,失败返回-1
    //网络关闭
    void  NetClose();    
protected:
    NETMS  netms;
}NETC;

void NETC::NetInitS(int port)
{
    //服务端初始化创建socket
    if((netms.serverSocket=socket(AF_INET, SOCK_STREAM,0))<0)
    {
        perror("tcp socket error");
        netms.successFlag = 0;  //套接字创建失败
    }
    else netms.successFlag = 1;  //成功
    if(netms.successFlag == 1)
    {
        int reuseflag = 1;
        if((setsockopt(netms.serverSocket,      SOL_SOCKET, SO_REUSEADDR, 
                (char*)&reuseflag, sizeof(reuseflag)))==-1)
        {
            perror("tcp setsockopt error");
            netms.successFlag = 0;
         }
         else netms.successFlag = 1;
     }
     if(netms.successFlag == 1)   //复用设置成功
     {
        bzero(&netms.serverAddr,  sizeof(netms.serverAddr));
        netms.serverAddr.sin_family = AF_INET;
        netms.serverAddr.sin_port = htons(port);
        netms.serverAddr.sin_addr.s_addr = INADDR_ANY;
        //服务端初始化绑定
        if(bind(netms.serverSocket, 
        (struct sockaddr*) &netms.serverAddr, 
        sizeof(netms.serverAddr))==-1)   
        {
           perror("tcp bind error");
           netms.successFlag = 0;         //绑定失败
        }
        else netms.successFlag = 1;        //绑定成功
      }
      if(netms.successFlag == 1)  //绑定成功
      {
        if(listen(netms.serverSocket, 30)<0)
         {
            perror("tcp listen error");
            netms.successFlag = 0;        //监听失败
         }
         else netms.successFlag = 1;        //监听成功
      }
}
void NETC::NetAceptS()    //服务端用于初始化的程序
{
    socklen_t addr_len = sizeof(struct sockaddr);
    if((netms.clientSocket=accept(netms.serverSocket,
            (struct sockaddr*)&(netms.clientAddr),    &addr_len))<0)
     {
        perror("tcp accept error");
        netms.successFlag  = 0;
     }
     else
     {
        printf("server:connection client ip is %s, client port is %d.\n",                          inet_ntoa(netms.clientAddr.sin_addr),                             ntohs(netms.clientAddr.sin_port));
           netms.successFlag = 1;
     }
}
void NETC::NetInitC()  //客户端初始化程序
{
   if((netms.clientSocket=socket(AF_INET, SOCK_STREAM, 0))<0)
   {
       perror("tcp socket error");
       netms.successFlag = 0;
    }
   else netms.successFlag = 1;
   if(netms.successFlag == 1)
   {
      int reuseflag = 1;
      if(setsockopt(netms.clientSocket, SOL_SOCKET, SO_REUSEADDR, (char*)&reuseflag, sizeof(reuseflag))==-1)
      {
         perror("tcp setsockopt error");
         netms.successFlag = 0;
       }
       else netms.successFlag = 1;
    }
}
void NETC::NetConnectC(char ipaddress[], int port)
{
   netms.serverAddr.sin_family=AF_INET;
   netms.serverAddr.sin_port = htons(port);        netms.serverAddr.sin_addr.s_addr=inet_addr(ipaddress);
   if(connect(netms.clientSocket, 
   (struct sockaddr*)&netms.serverAddr, 
             sizeof(struct sockaddr))<0)
   {
       perror("tcp connect error");
       netms.successFlag = 0;
   }
   else
   {
       printf("client:connection from server ip is %s, server port is %d.\n",                       inet_ntoa(netms.serverAddr.sin_addr),                   ntohs(netms.serverAddr.sin_port));
       netms.successFlag = 1;
  }
}
int NETC::NetSend(char *buff, int bufflen)//成功返回发送数据的长度,否则返回-1
{
    return send(netms.clientSocket, buff, bufflen, 0);
}
int NETC::NetRecv(char *buff, int bufflen)//成功返回发送数据的长度,否则返回-1
{
    return recv(netms.clientSocket, buff , bufflen, 0);
}
void NETC::NetClose()
{
    close(netms.clientSocket);
    close(netms.serverSocket);
    netms.clientSocket = 0;
    netms.serverSocket = 0;
    netms.successFlag = 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值