cookie(儲存在使用者本地終端上的資料) 需要藉助於(phpstudy_pro軟體)
阿新 • • 發佈:2022-05-31
基於華為鯤鵬雲伺服器CentOS中(或Ubuntu),使用Linux Socket實現:
1. time伺服器的客戶端伺服器,提交程式執行截圖
2. echo伺服器的客戶端伺服器,提交程式執行截圖,伺服器把客戶端傳進來的內容加入“伺服器程序pid 你的學號 姓名 echo :”返回給客戶端
3. 伺服器部署到華為雲伺服器,客戶端用Ubuntu虛擬機器。
4. 要用多執行緒或者多程序實現,至少連線兩個客戶端。
5. 把伺服器部署到試驗箱。(加分項)
客戶端client程式碼:
#include<stdio.h> #include<stdlib.h> #include<string.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netinet/ip.h> #include <arpa/inet.h> #include<unistd.h> #include<errno.h> #include<pthread.h> #define BUFFSIZE 1024 #define ERRORCODE -1 static void *thread_send(void *arg) { char buf[BUFFSIZE]; int sd = *(int *) arg; while (1) { memset(buf, 0, sizeof(buf)); //printf("客戶端向伺服器端傳送內容:"); read(STDIN_FILENO, buf, sizeof(buf)); if (send(sd, buf, strlen(buf), 0) == -1) { printf("send error:%s \n", strerror(errno)); break; } } return NULL; } static void *thread_recv(void *arg) { char buf[BUFFSIZE]; int sd = *(int *) arg; while (1) { memset(buf, 0, sizeof(buf)); int rv = recv(sd, buf, sizeof(buf), 0); if (rv <= 0) { if(rv == 0) //server socket關閉情況 { printf("server have already full !\n"); exit(0);//退出整個客服端 } printf("recv error:%s \n", strerror(errno)); break; } printf("\n客戶端受到來自伺服器端傳送的內容:\n%s", buf);//輸出接收到的內容 } return NULL; } int run_client(char *ip_str, int port) { int client_sd; int con_rv; pthread_t thrd1, thrd2; struct sockaddr_in client_sockaddr; //定義IP地址結構 client_sd = socket(AF_INET, SOCK_STREAM, 0); if (client_sd == -1) { printf("socket create error:%s \n", strerror(errno)); return ERRORCODE; } memset(&client_sockaddr, 0, sizeof(client_sockaddr)); client_sockaddr.sin_port = htons(port); //指定一個埠號並將hosts位元組型傳化成Inet型位元組型(大端或或者小端問題) client_sockaddr.sin_family = AF_INET; //設定結構型別為TCP/IP client_sockaddr.sin_addr.s_addr = inet_addr(ip_str);//將字串的ip地址轉換成int型,客服端要連線的ip地址 con_rv = connect(client_sd, (struct sockaddr*) &client_sockaddr, sizeof(client_sockaddr)); //呼叫connect連線到指定的ip地址和埠號,建立連線後通過socket描述符通訊 if (con_rv == -1) { printf("connect error:%s \n", strerror(errno)); return ERRORCODE; } if (pthread_create(&thrd1, NULL, thread_send, &client_sd) != 0) { printf("thread error:%s \n", strerror(errno)); return ERRORCODE; } if (pthread_create(&thrd2, NULL, thread_recv, &client_sd) != 0) { printf("thread error:%s \n", strerror(errno)); return ERRORCODE; } pthread_join(thrd2, NULL);// 等待執行緒退出 pthread_join(thrd1, NULL); close(client_sd); return 0; } int main(int argc, char *argv[]) { if (argc < 3) { printf("Usage:ip port,example:127.0.0.1 8080 \n"); return ERRORCODE; } int port = atoi(argv[2]); char *ip_str = argv[1]; run_client(ip_str,port); return 0; }
伺服器server程式碼:
#include<stdio.h> #include<stdlib.h> #include<string.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netinet/ip.h> #include <arpa/inet.h> #include<unistd.h> #include<errno.h> #include<pthread.h> #define BUFFSIZE 1024 #define ERRORCODE -1 static void *thread_send(void *arg) { char buf[BUFFSIZE]; int sd = *(int *) arg; while (1) { memset(buf, 0, sizeof(buf)); //printf("客戶端向伺服器端傳送內容:"); read(STDIN_FILENO, buf, sizeof(buf)); if (send(sd, buf, strlen(buf), 0) == -1) { printf("send error:%s \n", strerror(errno)); break; } } return NULL; } static void *thread_recv(void *arg) { char buf[BUFFSIZE]; int sd = *(int *) arg; while (1) { memset(buf, 0, sizeof(buf)); int rv = recv(sd, buf, sizeof(buf), 0); if (rv <= 0) { if(rv == 0) //server socket關閉情況 { printf("server have already full !\n"); exit(0);//退出整個客服端 } printf("recv error:%s \n", strerror(errno)); break; } printf("\n客戶端受到來自伺服器端傳送的內容:\n%s", buf);//輸出接收到的內容 } return NULL; } int run_client(char *ip_str, int port) { int client_sd; int con_rv; pthread_t thrd1, thrd2; struct sockaddr_in client_sockaddr; //定義IP地址結構 client_sd = socket(AF_INET, SOCK_STREAM, 0); if (client_sd == -1) { printf("socket create error:%s \n", strerror(errno)); return ERRORCODE; } memset(&client_sockaddr, 0, sizeof(client_sockaddr)); client_sockaddr.sin_port = htons(port); //指定一個埠號並將hosts位元組型傳化成Inet型位元組型(大端或或者小端問題) client_sockaddr.sin_family = AF_INET; //設定結構型別為TCP/IP client_sockaddr.sin_addr.s_addr = inet_addr(ip_str);//將字串的ip地址轉換成int型,客服端要連線的ip地址 con_rv = connect(client_sd, (struct sockaddr*) &client_sockaddr, sizeof(client_sockaddr)); //呼叫connect連線到指定的ip地址和埠號,建立連線後通過socket描述符通訊 if (con_rv == -1) { printf("connect error:%s \n", strerror(errno)); return ERRORCODE; } if (pthread_create(&thrd1, NULL, thread_send, &client_sd) != 0) { printf("thread error:%s \n", strerror(errno)); return ERRORCODE; } if (pthread_create(&thrd2, NULL, thread_recv, &client_sd) != 0) { printf("thread error:%s \n", strerror(errno)); return ERRORCODE; } pthread_join(thrd2, NULL);// 等待執行緒退出 pthread_join(thrd1, NULL); close(client_sd); return 0; } int main(int argc, char *argv[]) { if (argc < 3) { printf("Usage:ip port,example:127.0.0.1 8080 \n"); return ERRORCODE; } int port = atoi(argv[2]); char *ip_str = argv[1]; run_client(ip_str,port); return 0; }
執行
客戶端向伺服器傳送資訊,伺服器收到後加上學號姓名將其返回以及程序號,伺服器支援多執行緒,可以多個客戶端同時連線
1.同一臺電腦,兩個Ubuntu