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);                                    //!> 关闭套接字
}
  • 1
  • 2
  • 下一页

相关内容