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

来源:互联网 发布:mac library文件夹在哪 编辑:程序博客网 时间:2024/06/05 01:55

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;}
原创粉丝点击