Новичок
Профиль
Группа: Участник
Сообщений: 15
Регистрация: 16.10.2009
Репутация: нет Всего: нет
|
Мда...... Складывается такое впечатление, что я общаюсь сам с собой........ Тем не менее я все же сумел доделать свою лабу. Окончательный вариант выглядит следующим образом (может пригодится тем, кто так же не может ни до кого достучаться...  ) Код клиента:Код | #include <stdio.h> #include <string.h> #include <winsock2.h> // Включаем использование сокетов #include <windows.h> #include <memory.h> #include <string.h>
#pragma comment(lib, "WSock32.lib") // Используем эту библиотеку #pragma comment (lib, "mswsock.lib")
#define PORT 15150 #define SERVERADDR "127.0.0.1" #define CLIENT_FILE "example.txt" //файл на клиенте #define Line "File is recivied" int p;
#define Nsize 1024 int main(int argc, char* argv[]) { char buffer[30*Nsize]; char buff[Nsize + 1]; printf("Client start working...\n");
//иницилизация библиотеки Winsocks WSADATA WsaData; if( WSAStartup(0x0202, &WsaData) ) { printf("Winsock cannot be started\r\n"); return false; }
//открытие сокета SOCKET my_sock=socket(AF_INET, SOCK_DGRAM, 0); if (my_sock==INVALID_SOCKET) { printf("socket() error: %d\n",WSAGetLastError()); WSACleanup(); return -1; }
//обмен сообщений с сервером // установка возможности широковещательного адреса int i = 1; if (setsockopt(my_sock, SOL_SOCKET, SO_BROADCAST, (char *)&i, sizeof(i)) == -1) { printf ("Error setting broadcast socket\n"); WSACleanup(); return -1; } HOSTENT *hst; sockaddr_in dest_addr; memset(&dest_addr, 0, sizeof(sockaddr_in)); dest_addr.sin_family=AF_INET; dest_addr.sin_port=htons(PORT);
// определение IP-адреса узла if (inet_addr(SERVERADDR)) dest_addr.sin_addr.s_addr=inet_addr(SERVERADDR); else if (hst=gethostbyname(SERVERADDR)) dest_addr.sin_addr.s_addr=((unsigned long **) hst->h_addr_list)[0][0]; else { printf("Unknown host: %d\n",WSAGetLastError()); closesocket(my_sock); WSACleanup(); return -1; }
while(1) { // чтение сообщения с клавиатуры printf("\nClient=>Server:"); scanf("%s", buff); if (!strcmp(buff,"quit\n")) break;
int N=30; printf("Number of block is:"); scanf("%d", &N); char blockN[3]; sprintf(blockN, "%3d", N); char tBuf[53]; memcpy((void*)tBuf, (void*)blockN, 3); // в первые 3 символа пишем N memcpy((void*)(tBuf+3), (void*)buff, 50); // пишем в tBuf содержимое buff
// Передача сообщений на сервер sendto(my_sock, tBuf, strlen(tBuf), 0, (sockaddr *) &dest_addr,sizeof(sockaddr_in));
// Прием сообщения с сервера sockaddr_in server_addr; int server_addr_size=sizeof(server_addr); char* line = Line; p = 0;
while(*buff!=*line) { memset(buff, 0, Nsize); int n=recvfrom(my_sock,&buff[0],Nsize + 1,0, (sockaddr *) &server_addr, &server_addr_size);
printf("Was recieved bytes %d\n",n); if (n==SOCKET_ERROR) { printf("recvfrom() error:"\ "%d\n",WSAGetLastError()); closesocket(my_sock); WSACleanup(); return -1; } buff[n]=0; if(*buff!=*line) { for(int i=0;i<strlen(buff);i++) { buffer[p+i] = buff[i]; } p+=n; buffer[p]=0; } }
// Вывод принятого с сервера сообщения об успешной операции на экран printf("Client<=Server:%s",&buff[0]);
FILE *file; char* file_name = CLIENT_FILE; file = fopen( file_name, "w" ); fputs(buffer, file ); memset(buffer, 0, 30*Nsize * sizeof(char)); fclose( file ); }
//выход closesocket(my_sock); WSACleanup();
return 0; }
|
Код сервера:Код | #include <stdio.h> #include <winsock2.h> // Включаем использование сокетов #include <windows.h> #include <memory.h> #include <string.h> #pragma comment(lib, "WSock32.lib") // Используем эту библиотеку #pragma comment (lib, "mswsock.lib")
#define PORT 15150 // порт сервера #define Line "File is recivied" #define Nsize 1024
int main(int argc, char* argv[]) { char buff[Nsize];
printf("Server start working...\n");
//подключение библиотеки WSADATA WsaData; if( WSAStartup(0x0202, &WsaData) ) { printf("Winsock cannot be started\r\n"); return false; } //создание сокета SOCKET my_sock; my_sock=socket(AF_INET,SOCK_DGRAM,0); if (my_sock==INVALID_SOCKET) { printf("Socket() error: %d\n",WSAGetLastError()); WSACleanup(); return -1; }
//связывание сокета с локальным адресом sockaddr_in local_addr; memset(&local_addr, 0, sizeof(sockaddr_in)); local_addr.sin_family=AF_INET; local_addr.sin_addr.s_addr=INADDR_ANY; local_addr.sin_port=htons(PORT);
if (bind(my_sock,(sockaddr *) &local_addr, sizeof(local_addr))) { printf("bind error: %d\n",WSAGetLastError()); closesocket(my_sock); WSACleanup(); return -1; }
//обработка пакетов, присланных клиентами while(1) { char tBuf[53]; sockaddr_in client_addr; memset(&client_addr, 0, sizeof(sockaddr_in)); int client_addr_size = sizeof(sockaddr_in); int bsize=recvfrom(my_sock, tBuf, Nsize * sizeof(char), 0, (sockaddr *) &client_addr, &client_addr_size); if (bsize==SOCKET_ERROR) { printf("recvfrom() error: %d\n", WSAGetLastError()); break; }
// Определяем IP-адрес клиента и прочие атрибуты HOSTENT *hst; hst=gethostbyaddr((char *)&client_addr.sin_addr,4,AF_INET); printf("+%s [%s:%d] new DATAGRAM!\n",(hst)?hst->h_name:"Unknown host",inet_ntoa(client_addr.sin_addr),ntohs(client_addr.sin_port));
char blockN[3]; memcpy((void*)blockN, (void*)tBuf, 3); memcpy((void*)buff, (void*)(tBuf+3), 50); //выделztv содержимое buff int N = atoi(blockN); //определяем N printf("\nNumber of block is:%d\n", N);
// добавление завершающего нуля buff[bsize-3]=0;
// Вывод на экран printf("Client=>Server:%s\n",buff);
FILE *file; char* file_name = buff; file = fopen( file_name, "r" ); if( file != 0 ) { char buffer[Nsize + 1]; fseek(file,0,2); int filesize = ftell(file); int filemarker = 0; fseek(file,Nsize*N,0); int szee = Nsize;
while (szee == Nsize) { printf("Recieve file - "); memset(buffer, 0, Nsize); szee = fread(buffer, sizeof(char), Nsize, file);
sendto(my_sock,&buffer[0],szee,0, (sockaddr *)&client_addr, sizeof(client_addr)); printf("filemarker = %d of filesize = %d \n", filemarker, filesize); filemarker += szee; } char* line = Line; sendto(my_sock,&line[0],strlen(&line[0]),0, (sockaddr *)&client_addr, sizeof(client_addr));
fclose(file); } else { printf("File not found !!!"); } } system("PAUSE"); return 0; }
|
|