1、單向通信:又稱為單工通信,即只能有一個方向的通信而沒有反方向的交互。無線電廣播或有線電廣播以及電視廣播就屬於這種類型。
單向通信只需要一條信道,而雙向交替通信或雙向同時通信則都需要兩條信道(每個方向各一條)。顯然,雙向同時通信的傳輸效率最高。不過應當指出,雖然電信局為打電話的用戶提供了雙向同時通信的信道,但有效的電話交談一般都還是雙方交替通信。當雙方發生爭吵時往往就是采用雙向同時通信的方式。
2、半雙工通信,是指數據可以沿兩個方向傳送.但同一時刻一個信道只允許單方向傳送,因此義被稱為雙向交替通信,如圖中(b)所示。例如,無線對講機就是一種半雙工設備,在同一時間內只允許一方講話。
3、全雙工通信,是指同時發生在兩個方向上的一種數據傳輸方式,如圖中(c)所示。電話機就是一種全雙工設備,其通話雙方可以同時進行對話。計算機之間的高速數據通信也是這種方式。
雙向交替通信又稱為半雙工通信,即通信的雙方都可以發送信息,但不能雙方同時發送(當然也就不能同時接收)。這種通信方式是一方發送另一方接收,過一段時間后再反過來。
udp_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_DGRAM,0);//創建套接字 if(sid < 0) printf("socket error"); //創建服務器和端口號 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]);//獲取地址 //綁定套接字和地址變量 int res = bind(sid,(struct sockaddr *)&addr,sizeof(struct sockaddr)); if(res<0) printf("bind error"); else printf("bind res = %d\n",res); char recvbuf[128] = {0}; char sendbuf[128] = {0}; int len,cid; len=sizeof(addr);//地址長度 while(1) { bzero(recvbuf,sizeof(recvbuf));//將recvbuf數組置0 recvfrom(sid,recvbuf,sizeof(recvbuf),0,(struct sockaddr *)&addr, &len);//接收來自客戶端的信息 //recvfrom(int sock, void *buf, size_t len,int flags,struct sockaddr *from, socklen_t *fromlen(地址長度)) printf("客戶端說:%s",recvbuf); bzero(sendbuf,sizeof(sendbuf));//將sendbuf數組置0 printf("你說:"); fgets(sendbuf,sizeof(sendbuf),stdin);//輸入 sendto(sid,sendbuf,sizeof(sendbuf),0,(struct sockaddr *)&addr,len);//向客戶端發送信息 //sendto(socket s, const char FAR* buf, int len, int flags,const struct sockaddr FAR* to, int tolen(所指地址的長度)) printf("\n"); } close(sid); }
udp_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_DGRAM,0);//創建套接字 if(cid < 0) printf("socket error"); //創建服務器和端口並設置 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]); //獲取地址 //綁定套接字和地址變量 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; len=sizeof(saddr); while(strncmp(sendbuf,"quit",4)) { bzero(sendbuf,sizeof(sendbuf));//將sendbuf數組置0 printf("你說:"); fgets(sendbuf,sizeof(sendbuf),stdin);//輸入 sendto(cid,sendbuf,sizeof(sendbuf),0,(struct sockaddr *)&saddr,len);//向服務端發送信息 //sendto(socket s, const char FAR* buf, int len, int flags,const struct sockaddr FAR* to, int tolen(所指地址的長度)) bzero(recvbuf,sizeof(recvbuf)); recvfrom(cid,recvbuf,sizeof(recvbuf),0,(struct sockaddr *)&saddr, &len);//接收來自服務端的信息 //recvfrom(int sock, void *buf, size_t len,int flags,struct sockaddr *from, socklen_t *fromlen(地址長度)) printf("服務端說:%s\n",recvbuf); } close(cid); }
