linux系統中半雙工通信功能——TCP


1、單向通信:又稱為單工通信,即只能有一個方向的通信而沒有反方向的交互。無線電廣播或有線電廣播以及電視廣播就屬於這種類型。

單向通信只需要一條信道,而雙向交替通信或雙向同時通信則都需要兩條信道(每個方向各一條)。顯然,雙向同時通信的傳輸效率最高。不過應當指出,雖然電信局為打電話的用戶提供了雙向同時通信的信道,但有效的電話交談一般都還是雙方交替通信。當雙方發生爭吵時往往就是采用雙向同時通信的方式。

2、半雙工通信,是指數據可以沿兩個方向傳送.但同一時刻一個信道只允許單方向傳送,因此義被稱為雙向交替通信,如圖中(b)所示。例如,無線對講機就是一種半雙工設備,在同一時間內只允許一方講話。

3、全雙工通信,是指同時發生在兩個方向上的一種數據傳輸方式,如圖中(c)所示。電話機就是一種全雙工設備,其通話雙方可以同時進行對話。計算機之間的高速數據通信也是這種方式。

雙向交替通信又稱為半雙工通信,即通信的雙方都可以發送信息,但不能雙方同時發送(當然也就不能同時接收)。這種通信方式是一方發送另一方接收,過一段時間后再反過來。

tcp_server.c

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <stdio.h>

int main( int argc, char **argv )
{
    int sid = socket(AF_INET,SOCK_STREAM,0);//創建套接字
    struct sockaddr_in addr = {0};
    addr.sin_family = AF_INET;//設置地址類型為IP
    addr.sin_port = htons(atoi(argv[2]));//設置端口
    
    addr.sin_addr.s_addr = inet_addr(argv[1]);//獲取IP地址
    int res = bind(sid,(struct sockaddr *)&addr,sizeof(struct sockaddr));//綁定套接字和地址
    printf("bind res = %d\n",res);
    listen(sid,10);
    
    char recvbuf[128] = {0};
    char sendbuf[128] = {0};
    int len,cid;
    
    while(1)
    {
        cid = accept(sid,NULL,NULL);//等待客戶端連接
        bzero(recvbuf,sizeof(recvbuf));
        while(strncmp(sendbuf,"quit",4))
        {
            bzero(recvbuf,sizeof(recvbuf));//數組清0
            read(cid,recvbuf,sizeof(recvbuf) - 1);//接受客戶端信息
            printf("客戶端說:%s",recvbuf);

            bzero(recvbuf,sizeof(recvbuf));
            printf("你回:");
            fgets(sendbuf,sizeof(sendbuf),stdin);//服務端輸入
            write(cid,sendbuf,strlen(sendbuf));//向客戶端傳信息
            printf("\n");
        }
        close(cid);
    }
    close(sid);    
}

 

tcp_client.c

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <stdio.h>

int main(int argc,char **argv)
{
    if(argc < 3)
    {
        perror("param must >= 3");
        return -1;
    }

    int cid = socket(AF_INET,SOCK_STREAM,0);//創建套接字
    struct sockaddr_in saddr = {0};
    saddr.sin_family = AF_INET;//設置地址類型為IP
    saddr.sin_port = htons(atoi(argv[2]));//設置端口
    saddr.sin_addr.s_addr = inet_addr(argv[1]);//獲取IP地址

    int res = connect(cid,(struct sockaddr *)&saddr,sizeof(struct sockaddr));//綁定套接字和地址
    printf("connect res = %d\n",res);

    char sendbuf[128] = {0};
    char recvbuf[128] = {0};
    int len;
    while(strncmp(sendbuf,"quit",4))
    {
        bzero(sendbuf,sizeof(sendbuf));//數組清0
        printf("你說:");
        fgets(sendbuf,sizeof(sendbuf),stdin);//輸入信息
        send(cid,sendbuf,strlen(sendbuf),0);//向服務端發送信息
        //len = send(cid,sendbuf,strlen(sendbuf),0);
        //printf("client send: len = %d\n",len);
        
        bzero(recvbuf,sizeof(recvbuf));
        recv(cid,recvbuf,sizeof(recvbuf) - 1,0);//接受服務端信息
        printf("服務端說:%s\n",recvbuf);
    }
    close(cid);
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM