Linux 網路程式設計之一個簡單的客戶端伺服器程式
阿新 • • 發佈:2019-02-04
1、服務端
#include "includes.h" #include <sys/types.h> #include <sys/socket.h> #include <linux/in.h> #define SERVER_PORT 8888 //監聽的埠號 #define MAX_BUFFER_LEN (256) //最大的buffer長度 void process_conn_server(int sock) { char buf[MAX_BUFFER_LEN] = {0}; int iRet = 0; printf("%s Enter\n", __func__); iRet = read(sock, buf, sizeof(buf)); if (0 > iRet) { printf("read buf error\n"); return ; } printf("read buf from client.\r\n"); //讀取到的資訊寫到標準輸出 write(1, buf, sizeof(buf)); printf("%s Exit\n", __func__); return ; } int startServer() { int iRet = ERROR; int sock_server = 0; int sock_client = 0; struct sockaddr_in server_addr; struct sockaddr_in client_addr; pid_t pid = 0; //1、建立一個socket sock_server = socket(AF_INET, SOCK_STREAM, 0); if (0 > sock_server) { printf("create socket error!\n"); return ERROR; } //2、設定伺服器的地址 bzero(&server_addr, sizeof(struct sockaddr_in)); server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = htonl(INADDR_ANY); server_addr.sin_port = SERVER_PORT; //3、繫結地址到套接字描述符 iRet = bind(sock_server, (const struct sockaddr *)&server_addr, sizeof(struct sockaddr)); if( 0 > iRet) { printf("bind sock_server error\n"); return iRet; } //4、設定監聽佇列 iRet = listen(sock_server, 5); if(0 > iRet) { printf("sock_server listen error\n"); return iRet; } //5、主迴圈處理客戶端請求 while(1) { sock_client = accept(sock_server, (struct sockaddr *)&(client_addr), sizeof(client_addr) ); if (0 > sock_client) { continue; //繼續監聽客戶端 } // 6、建立一個新的程序處理client資料 printf("recive the client DATA.\n"); pid = fork(); if (0 > pid) { printf("create process error\n"); close(sock_client); continue; } else if(0 == pid)//子程序 { close(sock_server); //處理 process_conn_server(sock_client); } else // 父程序 { close(sock_client); } } return iRet; } int main(int argc, char const *argv[]) { /* code */ printf("come in server\n"); startServer(); return 0; }
2、客戶端
#include "includes.h" #include <sys/types.h> #include <sys/socket.h> #include <linux/in.h> #define SERVER_PORT 8888 //監聽的埠號 #define MAX_BUFFER_LEN (256) void process_conn_client(int sock) { int size = 0; char buffer[MAX_BUFFER_LEN] = {0}; while(1) { //從標準輸入讀取使用者輸入的資料 size = read(0, buffer, sizeof(buffer)); if (0 < size) { //將讀到的資訊傳送到伺服器 printf("client read from output buffer:%s\n", buffer); write(sock, buffer, sizeof(buffer)); } } } void startClient() { int iRet = ERROR; int sock_server = 0; int sock_client = 0; struct sockaddr_in server_addr; struct sockaddr_in client_addr; printf("%s Enter\n", __func__); //1、建立一個socket sock_client = socket(AF_INET, SOCK_STREAM, 0); if(0 > sock_client) { printf("create client socket error\n"); return; } //2、設定客戶端地址 bzero(&server_addr, sizeof(struct sockaddr_in)); server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = htonl(INADDR_ANY); server_addr.sin_port = SERVER_PORT; inet_pton(AF_INET, "127.0.0.1", &server_addr.sin_addr); //3、連線伺服器 connect(sock_client, (const struct sockaddr *)&server_addr, sizeof(struct sockaddr)); //4、客戶端與伺服器進行通訊 process_conn_client(sock_client); //5、關閉連線 close(sock_client); printf("%s Exit\n", __func__); return; } int main(int argc, char const *argv[]) { /* code */ printf("come in client\n"); startClient(); return 0; }