1. 程式人生 > 其它 >cookie(儲存在使用者本地終端上的資料) 需要藉助於(phpstudy_pro軟體)

cookie(儲存在使用者本地終端上的資料) 需要藉助於(phpstudy_pro軟體)

基於華為鯤鵬雲伺服器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

2.兩臺電腦