區域網實現linux伺服器端和客戶端通訊
阿新 • • 發佈:2019-02-11
一、配置兩臺電腦的網路
1.檢視物理機ip地址
(1)Win+R開啟執行,輸入cmd
(2)在cmd下輸入ipconfig得到本機ip為192.168.3.2
2.配置虛擬機器ip
(1)開啟虛擬機器設定
(2)設定網路連線模式
(3)在Ubuntu下設定ip
注意:物理機和虛擬機器的IP不能一樣,但必須處於同一網段。
我測試的時候物理機IP是192.168.3.2,虛擬機器IP設定的是192.168.3.190。
(4)測試兩臺電腦是否連通
在終端下輸入ping 192.168.3.X
二、編寫伺服器端和客戶端程式
1.伺服器端程式碼
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <sys/types.h> #include <sys/socket.h> #include <sys/un.h> #include <arpa/inet.h> #include <netinet/in.h> const int port = 8888; const char* ip = "192.168.64.190"; //伺服器端IP int main() { int ser_sock = socket(AF_INET, SOCK_STREAM, 0); //建立套接字,即建立socket if(ser_sock < 0) { perror("socket"); return 1; } struct sockaddr_in addr; //繫結資訊,即命名socket addr.sin_family = AF_INET; addr.sin_port = htons(port); addr.sin_addr.s_addr = inet_addr(ip); /*inet_addr函式將用點分十進位制字串表示的 IPv4地址轉化為用網路位元組序整數表示的IPv4地址 */ if(bind(ser_sock, (struct sockaddr*)&addr, sizeof(addr)) < 0) { perror("bind"); return 2; } int listen_sock = listen(ser_sock, 5); //監聽socket if(listen_sock < 0) { perror("listen"); return 3; } /*接受連線*/ struct sockaddr_in peer; socklen_t peer_len; char buf[1024]; int accept_fd = accept(ser_sock, (struct sockaddr*)&peer, &peer_len); if(accept_fd < 0) { perror("accept"); return 4; } else { printf("connect from %s, port %d \n", inet_ntop(AF_INET,&peer.sin_addr, buf, 1024), ntohs(peer.sin_port)); } while(1) { memset(buf, '\0', sizeof(buf)); ssize_t size = read(accept_fd, buf, sizeof(buf) - 1); if(size > 0) { printf("client: %s\n", buf); } else if(size == 0) { printf("read is done...\n"); break; } else { perror("read"); break; } printf("server:"); fflush(stdout); size = read(0, buf, sizeof(buf) - 1); if(size > 0) { buf[size - 1] = '\0'; } else if(size == 0) { printf("read is done...\n"); break; } else { perror("read"); break; } write(accept_fd, buf, strlen(buf)); } close(ser_sock); return 0; }
2.客戶端程式碼
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <sys/types.h> #include <sys/socket.h> #include <sys/un.h> #include <arpa/inet.h> #include <netinet/in.h> const int port = 8888; const char* ip = "192.168.64.190"; //伺服器IP int main() { int clt_sock = socket(AF_INET, SOCK_STREAM, 0); //建立套接字,即建立socket if(clt_sock < 0) { perror("socket"); return 1; } struct sockaddr_in addr; //繫結資訊,即命名socket addr.sin_family = AF_INET; addr.sin_port = htons(port); addr.sin_addr.s_addr = inet_addr(ip); /*inet_addr函式將用點分十進位制字串表示的 IPv4地址轉化為用網路位元組序整數表示的IPv4地址 */ //發起連線 socklen_t addr_len = sizeof(addr); int connect_fd = connect(clt_sock, (struct sockaddr*)&addr, addr_len); if(connect_fd < 0) { perror("connect"); return 2; } char buf[1024]; while(1) { memset(buf, '\0', sizeof(buf)); printf("client please enter: "); fflush(stdout); ssize_t size = read(0, buf, sizeof(buf) - 1); if(size > 0) { buf[size - 1] = '\0'; } else if(size == 0) { printf("read is done...\n"); break; } else { perror("read"); return 4; } // printf("client: %s\n", buf); write(clt_sock, buf, strlen(buf)); size = read(clt_sock, buf, sizeof(buf)); if(size > 0) { buf[size] = '\0'; } else if(size == 0) { printf("read is done...\n"); break; } else { perror("read"); return 5; } printf("server: %s\n", buf); } close(clt_sock); return 0; }