linux 网络编程简单实例

当然此处仅仅是对于单用户请求的处理,对于多用户的请求后面再说!

对于server处理:
            server要做的就是创建自己的套接字,然后设置一些参数:例如协议类型,IP之类。
            然后就是bind参数,再次就是监听( listen),最后就是accept进入睡眠等待状态,if
            有cilent的请求就会有反应!
      
对于chient的处理:
            建立自己的套接字,然后就是连接到server,发送自己的数据,然后等待server的回送!


server.cpp

#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include<string.h>
#include<sys/types.h>
#include<sys/wait.h>
 

#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
 
#include <iostream>
using namespace std;
 
#define PORT6000                                    //!> 端口
#define MAX_REQ5                              //!> 监听情况下:在请求队列中允许的最大请求数
 
int main()
{
      intlisten_socket,client_socket;                  //!> 监听,客户套接字
      structsockaddr_inlocal_addr;                  //!> server结构
      structsockaddr_inclient_addr;            //!> client结构
      intrecv_len;
       

 
      charbuf[1024];
      charrecv_buf[1024];
 
      //!>      intsocket(int domain, int type, int protocol);参数:协议族;套接字类型;协议,一般为0->TCP/IP
 
      //!> 创建套接字
      //!>
      if((listen_socket = socket(AF_INET,SOCK_STREAM, 0)) ==-1)                  //!> 创建套接字
      {
              cout << "创建server套接字失败~"<< endl;
              exit(1);
      }
 
      //!> 下面设置本地的套接字的参数结构
      //!> 
      local_addr.sin_family =AF_INET;                                                            //!> 代表TCP/IP
      local_addr.sin_port =htons(PORT);                                                      //!> 端口号( 转化成流格式 )
                                                                                                                        //!> if此处写上0,那么系统随机选择一个未被使用的端口号
      local_addr.sin_addr.s_addr =INADDR_ANY;                                          //!> 填入本机IP地址( INADDR_ANY )
      bzero(&(local_addr.sin_zero),8);                                                            //!> 填充0保持大小一致
 
 
      //!> 下面绑定到套接字
      //!> 
      if(bind(listen_socket, (structsockaddr*)&local_addr, sizeof(struct sockaddr)) ==-1)            //!> 将设置好的参数绑定到套接字
      {
              cout << "server套接字绑定参数失败~"<< endl;
              exit(1);
      }
      else
      {
              cout << "绑定成功!"<< endl;
      }
 
      //!> 下面开始监听
      //!>为该socket建立一个输入数据队列,将到达的服务请求保存在此队列中,直到程序处理它们
      //!> 
      if(listen(listen_socket, MAX_REQ) ==-1)                               
      {
              cout << "监听失败!"<< endl;
              exit(1);
      }
      else
      {
              cout << "server开始监听!"<< endl;
      }
       
      int len =sizeof(struct sockaddr_in);
       
      while( 1)
      { 
            //!> 建立好输入队列后,服务器就调用accept函数,然后睡眠并等待客户的连接请求
            //!>accept指出了在哪个套接字口进行监听;获取发送请求的client的套接字地址,为了回送;第三个参数是套接字地址的整形指针
            if((client_socket = accept(listen_socket, (structsockaddr*)&client_addr,(socklen_t*)&(len ))) == -1)
            {
                    cout<< "server等待请求错误!"<< endl;
                          exit(1);
            }
            else
            {
                    cout<< "server正在等待请求!"<< endl;
            }
       
            //!> 收到请求
            cout<<"收到请求来自IP地址:"<<inet_ntoa(client_addr.sin_addr) <<"端口号:" << ntohs(client_addr.sin_port)<< endl;
               
             
              cout<< "准备发送数据:"<<endl;   
               
            strcpy(buf,"");
                  while( 1)
                  {
                    cin >>buf;                                                                              //!> 输入请求
                    int sendlen =strlen(buf);                                                       
                     
                    if((send(client_socket, buf, sendlen, 0)) ==-1)                  //!> 发送回去
                    {
                            cout << "发送错误!"<< endl;
                    }
                     
                    if( strcmp( buf, "quit" ) ==0 || strcmp( buf, "q" ) ==0 || strcmp(buf, "exit" ) ==0 )
                    {
                                cout<< "发送成功!"<< endl;
                                break;
                    }
                  }
      }
       
        close(listen_socket);                                                                        //!> 关闭套接字
}


client.cpp

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<sys/wait.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include <iostream>
using namespace std;
#define PORT 6000
 
int main(  int argc, char **argv  )
{
      intclient_socket;
      structsockaddr_in serv_addr;
 
      charbuf[1024];
      intrecv_len;
 
      if( argc !=2 )
      {
            cout<< "请输入请求信息参数!"<< endl;
      }
 
      //!> 建立套接字
      //!> 
      if((client_socket = socket(AF_INET, SOCK_STREAM, 0)) ==-1)                  //!> 建立套接字
      {
              cout << "client创建套接字失败~"<< endl;
              exit(1);
      }
 
      //!>下面就是server的套接字参数设,为了访问的需要,所以server的套接字必须是公开的信息
      //!> 
      serv_addr.sin_family = AF_INET;
      serv_addr.sin_port = htons(PORT);
      serv_addr.sin_addr.s_addr =inet_addr("10.80.0.195");                        //!> server 的 IP地址
      bzero(&(serv_addr.sin_zero), 8);
 
      //!> 连接到server
      if((connect(client_socket, (structsockaddr*)&serv_addr, sizeof(struct sockaddr))) ==-1)
      {
              cout << "client连接sever失败~"<< endl;
              exit(1);
      }
 
      cout<< "client发送数据:"<< argv[1]<< endl;
       
      //!> 下面就可以接受数据了
     
    strcpy( argv[1], buf);                                          //!> 命令行参数就是请求信息
     
          if((send(client_socket, buf, strlen(buf), 0)) ==-1)                  //!> 发送回去
        {
              cout<< "发送错误!"<< endl;
        }
     
          cout<< "client接受数据:"<< endl;
     
      while(1)
      {
              if((recv_len = recv(client_socket, buf, sizeof(buf), 0)) ==-1)            //!> 接收数据
              {
                      cout << "接收错误! "<< endl;
                      exit(1);
              }
 
              buf[recv_len] = '\0';
                   
                  if( strcmp(buf, "quit" ) ==0 || strcmp( buf, "q" ) ==0 || strcmp( buf, "exit") ==0  )
                  {
                        cout<< "recv finish..."<< endl;
                        exit( 0);
                  }
           
                  cout<< "接收到:"<< buf<< endl;
 
      }
 
      close(client_socket);
}


makefile:

do: server client

server:
      g++ -w-o  server server.cpp

client:
      g++ -w-o  client  client.cpp
     
clean:
      rm -f serverclient     

你可能感兴趣的:(编程,linux,网络,server,socket,struct)