Министерство образования и науки Российской Федерации
Федеральное агентство по образованию
Государственное образовательное учреждение высшего профессионального образования
Российский государственный гидрометеорологический университет
Cистемы и сети передачи информации
Отчет по лабораторным работам
Выполнила: студентка группы ИБ-440
Рябова Е.Е.
Проверила: Чернецова Е. А.
Санкт-Петербург
2015
Лабораторная работа №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();
}
