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); }