Однократного и многократного обмена сообщениямиSql скрипты
SELECT вид_растения.название, Count(растение.название) AS [Count-название] FROM вид_растения INNER JOIN растение ON вид_растения.код = растение.код_вид_растения GROUP BY вид_растения.название;
SELECT договор_работа.код, физическое_лицо.фамилия, физическое_лицо.имя, физическое_лицо.отчество, физическое_лицо.телефон, договор_работа.номер_договора, договор_работа.дата_начала, договор_работа.дата_окончания, договор_работа.ставка, договор_работа.код_должность FROM физическое_лицо INNER JOIN договор_работа ON физическое_лицо.код = договор_работа.код_физическое_лицо; Лабораторная работа №1 Изучение возможностей протокола TCP/IP при организации однократного и многократного обмена сообщениями Цель работы: ознакомиться с работой протокола TCP/IP.(Transmission Control Protocol/Internet Protocol – Протокол управления передачей/Интернет протокол). Задание на выполнение работы: 1. Смоделировать с помощью протокола TCP/IP однократный обмен данными между клиентом и сервером. 2. Смоделировать обмен несколькими сообщениями между клиентом и сервером. Ход работы: Листинг серверной части: #define WIN #include <stdio.h> #include <string.h> #include <conio.h> #ifdef WIN #include <winsock.h> #endif #define PORT_NUM 1050 #define MAX_LISTEN 3 void main() { #ifdef WIN WORD wVersionRequested = MAKEWORD(1,1); WSADATA wsaData; #endif
unsigned int server_s; struct sockaddr_in local; unsigned int client_s; struct sockaddr_in client_addr; struct in_addr client_ip_addr; int addr_len; char out_buf[100]; char in_buf[100]; int r; char x[]="bay"; local.sin_family = AF_INET; local.sin_port = htons(PORT_NUM); local.sin_addr.s_addr = htonl(INADDR_ANY); #ifdef WIN WSAStartup(wVersionRequested, &wsaData); #endif server_s =socket(AF_INET, SOCK_STREAM, 0); bind (server_s, (const sockaddr *)&local, sizeof(sockaddr_in)); listen (server_s, MAX_LISTEN); client_s = accept(server_s, NULL,NULL); memcpy((void *)&client_ip_addr,(const void*)&client_addr.sin_addr,sizeof(client_addr.sin_addr)); client_ip_addr=client_addr.sin_addr; printf("IP address of client = %s port = %d \n",inet_ntoa(client_ip_addr), ntohs(client_addr.sin_port)); recv(client_s, in_buf, sizeof(in_buf), 0); printf("Received from client... data = '%s' \n", in_buf); strcpy(out_buf, "Message -- server to client"); send(client_s, out_buf, (strlen(out_buf) + 1), 0);
while(*out_buf!=*x) { printf("<-"); recv(client_s,in_buf,sizeof(in_buf),0); puts(in_buf); printf("->"); gets(out_buf); send(client_s,out_buf,(strlen(out_buf)+1),0); printf("\n"); } closesocket(server_s); closesocket(client_s); #ifdef WIN WSACleanup(); #endif getch(); }
Листинг клиентской части: #define WIN #include <stdio.h> #include <string.h> #include <conio.h> #ifdef WIN #include <windows.h> #endif #define PORT_NUM 1050 #define IP_ADDR "127.0.0.1"
void main() { #ifdef WIN WORD wVersionRequested = MAKEWORD(1,1); WSADATA wsaData; #endif
unsigned int server_s; struct sockaddr_in server_addr; char out_buf[100]; char in_buf[100]; char src[100]; int r; char x[]="bay";
server_addr.sin_family = AF_INET; server_addr.sin_port = htons(1050); server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
int con;
#ifdef WIN WSAStartup(wVersionRequested, &wsaData); #endif
server_s = socket (AF_INET, SOCK_STREAM, 0); con = connect(server_s,(const sockaddr *)&server_addr, sizeof(server_addr));
if(con==0) { strcpy(out_buf,"I am second in this dialog"); send(server_s, out_buf,sizeof(out_buf), 0); recv(server_s,in_buf,sizeof(in_buf), 0); printf("Recieved from server data = '%s' \n",in_buf);
while(*out_buf!=*x)
{ printf("->"); gets(out_buf); send(server_s,out_buf,(strlen(out_buf)+1),0); //printf("\n <- "); //recv(server_s,in_buf,sizeof(in_buf),0); //puts(in_buf); }
#ifdef WIN closesocket(server_s); #endif #ifdef WIN WSACleanup(); #endif
} else puts("connection faild. run SERVER first");
getch(); }
Рисунок 1.1 Организация однократного обмена данными между клиентом и сервером с помощью протокола TCP/IP Часть 2: Листинг серверной части: #define WIN #include <stdio.h> #include <string.h> #include <conio.h> #ifdef WIN #include <winsock.h> #endif #define PORT_NUM 1050 #define MAX_LISTEN 3
void main() { #ifdef WIN WORD wVersionRequested = MAKEWORD(1,1); WSADATA wsaData; #endif
unsigned int server_s; struct sockaddr_in local; unsigned int client_s; struct sockaddr_in client_addr; struct in_addr client_ip_addr; int addr_len; char out_buf[100]; char in_buf[100]; int r; char x[]="bay";
local.sin_family = AF_INET; local.sin_port = htons(PORT_NUM); local.sin_addr.s_addr = htonl(INADDR_ANY);
#ifdef WIN WSAStartup(wVersionRequested, &wsaData); #endif
server_s =socket(AF_INET, SOCK_STREAM, 0); bind (server_s, (const sockaddr *)&local, sizeof(sockaddr_in)); listen (server_s, MAX_LISTEN); client_s = accept(server_s, NULL,NULL);
memcpy((void *)&client_ip_addr,(const void*)&client_addr.sin_addr,sizeof(client_addr.sin_addr)); client_ip_addr=client_addr.sin_addr; printf("IP address of client = %s port = %d \n",inet_ntoa(client_ip_addr), ntohs(client_addr.sin_port)); recv(client_s, in_buf, sizeof(in_buf), 0); printf("Received from client... data = '%s' \n", in_buf); strcpy(out_buf, "Message -- server to client"); send(client_s, out_buf, (strlen(out_buf) + 1), 0);
while(*out_buf!=*x) { printf("<-"); recv(client_s,in_buf,sizeof(in_buf),0); puts(in_buf); printf("->"); gets(out_buf); send(client_s,out_buf,(strlen(out_buf)+1),0); printf("\n"); } closesocket(server_s); closesocket(client_s); #ifdef WIN WSACleanup(); #endif getch(); }
Листинг клиентской части: #define WIN #include <stdio.h> #include <string.h> #include <conio.h> #ifdef WIN #include <windows.h> #endif #define PORT_NUM 1050 #define IP_ADDR "127.0.0.1"
void main() { #ifdef WIN WORD wVersionRequested = MAKEWORD(1,1); WSADATA wsaData; #endif
unsigned int server_s; struct sockaddr_in server_addr; char out_buf[100]; char in_buf[100]; char src[100]; int r; char x[]="bay";
server_addr.sin_family = AF_INET; server_addr.sin_port = htons(1050); server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
int con;
#ifdef WIN WSAStartup(wVersionRequested, &wsaData); #endif
server_s = socket (AF_INET, SOCK_STREAM, 0); con = connect(server_s,(const sockaddr *)&server_addr, sizeof(server_addr));
if(con==0) { strcpy(out_buf,"I am second"); send(server_s, out_buf,sizeof(out_buf), 0); recv(server_s,in_buf,sizeof(in_buf), 0); printf("Recieved from server data = '%s' \n",in_buf);
while(*out_buf!=*x)
{ printf("->"); gets(out_buf); send(server_s,out_buf,(strlen(out_buf)+1),0); printf("\n <- "); recv(server_s,in_buf,sizeof(in_buf),0); puts(in_buf); }
#ifdef WIN closesocket(server_s); #endif #ifdef WIN WSACleanup(); #endif
} else puts("connection faild. run SERVER first");
getch(); }
Рисунок 1.2 Организация диалога клиент-сервер с помощью протокола TCP/IP Контрольные вопросы: 1. Опишите порядок установления соединения «клиент-сервер» по протоколу TCP/IP Рис. 5 Порядок установления соединения “клиент-сервер” 2. Как меняется листинг программы в случае многократного обмена сообщениями между клиентом и сервером по протоколу TCP/IP? - При организации обмена многими сообщениями между клиентом и сервером можно организовать закрытие сокетов и окончание сеанса связи при передаче определенного набора символов, например, команды ‘bay’.
|