歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

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);                                    //!> 關閉套接字
}
Copyright © Linux教程網 All Rights Reserved