天天看點

linux網絡通信程式設計基礎實作

作者:三山春文

實作步驟:

1.引用網絡程式設計的相關頭檔案
2.建立socket對象
3.初始化網絡位址及綁定網絡位址
4.監聽用戶端的連接配接
5.進行資料的發送與接收
6.關閉socket連接配接           
//1.引用網絡程式設計的相關頭檔案
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>           
//2.建立socket對象
sockfd= socket(AF_INET,SOCK_STREAM,0);//建立socket           
//3.初始化網絡位址及綁定網絡位址

//初始化位址結構
struct sockaddr_in _addr;
bzero(&_addr,sizeof (_addr));
_addr.sin_family=AF_INET;//UDP,TCP
_addr.sin_port= htons(port);//端口
_addr.sin_addr.s_addr= htons(INADDR_ANY);//任何位址

//綁定
int err_log= bind(sockfd,(struct sockaddr*)&_addr,sizeof (_addr));           
//監聽
err_log= listen(sockfd,10);           
//接受用戶端連接配接
connfd= accept(sockfd,(struct sockaddr*)&cliAddr,&cliLen);           
//接收資料
recv(connfd,recvBuf,sizeof (recvBuf),0)           
//發送資料
send(connfd,sendBuf, len,0);           
close(connfd);//關閉連接配接           

完整源碼:

//1.引用網絡程式設計的相關頭檔案
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>

//1.引用網絡程式設計的相關頭檔案
//2.建立socket對象
//3.初始化網絡位址及綁定網絡位址
//4.監聽用戶端的連接配接
//5.進行資料的發送與接收
//6.關閉socket連接配接
int main(int argc,char* argv[]) {
    std::cout << "網絡服務端:" << std::endl;
    unsigned short port = 8000;//服務監聽端口
    //如果指令行傳入參數
    if (argc>1)
    {
        port = atoi(argv[1]);//使用參數端口
    }

    pid_t pid;
    pid = fork();
    if (pid<0)
    {
        perror("fork error\n");
    }
    else if(pid==0)
    {
        printf("子程序\n");
    }
    else
    {
        printf("父程序\n");
    }

    int sockfd=0;
    //2.建立socket對象
    sockfd= socket(AF_INET,SOCK_STREAM,0);//建立socket

    if(sockfd<0)
    {
        perror("create socket fail\n");
        exit(-1);
    }

    //3.初始化網絡位址及綁定網絡位址

    //初始化位址結構
    struct sockaddr_in _addr;
    bzero(&_addr,sizeof (_addr));
    _addr.sin_family=AF_INET;//UDP,TCP
    _addr.sin_port= htons(port);//端口
    _addr.sin_addr.s_addr= htons(INADDR_ANY);//任何位址

    //綁定
    int err_log= bind(sockfd,(struct sockaddr*)&_addr,sizeof (_addr));
    if (err_log!=0){
        perror("bind socket fail\n");
        close(sockfd);
        exit(-1);
    }

    //監聽
    err_log= listen(sockfd,10);
    if (err_log!=0){
        perror("socket listen fail\n");
        close(sockfd);
        exit(-1);
    }

    printf("server is listening in port:%d\n",port);

    struct sockaddr_in cliAddr;
    char cliIP[INET_ADDRSTRLEN]="";
    socklen_t cliLen = sizeof (cliAddr);
    int connfd;
    //接受用戶端連接配接
    connfd= accept(sockfd,(struct sockaddr*)&cliAddr,&cliLen);
    if (connfd<0){
        perror("accept client socket connect fail\n");
        exit(-1);
    }
    //轉換并儲存用戶端IP位址字元串
    inet_ntop(AF_INET,&cliAddr.sin_addr.s_addr,cliIP,INET_ADDRSTRLEN);
    printf("the client ip:%s,port=%d\n",cliIP, ntohs(cliAddr.sin_port));

    //循環接收發送資料
    while (true)
    {
        char recvBuf[2048]={0};
        //接收資料
        if (recv(connfd,recvBuf,sizeof (recvBuf),0)>0)
        {
            printf("recv data from client:\r\n");
            printf("%s\r\n",recvBuf);
            //發送資料
            char sendBuf[512]={0};
            printf("send:");
            fgets(sendBuf,sizeof (sendBuf),stdin);
            int len = strlen(sendBuf);
            sendBuf[len-1]=0;
            send(connfd,sendBuf, len,0);
        }
    }
    close(connfd);
    printf("client closed!\r\n");
    close(sockfd);
    return 0;
}
           

繼續閱讀