HLFX.Ru Forum
профиль •  правила •  регистрация •  календарь •  народ •  FAQ •  поиск •  новое •  сутки •  главная •  выход  
HLFX.Ru Forum HLFX.Ru Forum > Наш форум > Технические вопросы > Для тех кто знаком с Winsock
Вопросик
  Предыдущая тема   Следующая тема
Автор
Тема Новая тема    Ответить
ToMMuK
SmallHabit'at

Дата регистрации: Jun 2006
Проживает: Рига
Сообщений: 634
Возраст: 32

Рейтинг



Question Для тех кто знаком с Winsock

Собственно нашёл исходник сервера и клиента, которые передаю сообщения. Задумка заключаеться в том что сервер стоит на удалённом компьютере, а клиент запускаеться на любом другом, В общем нужно зделать так чтобы сервер закрывал соединение по порту например 44405 если нету связи с клиентом но ИП коннектиться на этот ИП, а если связь есть с клиентом то разрешал...

Код клиента :


C++ Source Code:
1
#include <windows.h>
2
#include <winsock.h>
3
#include <stdio.h>
4
#include <iostream.h>
5
#include <conio.h>
6
#include <signal.h>
7
#include <stdio.h>
8
 
9
//DECLARATIONS
10
//error trapping signals
11
#define SIGINT 2
12
#define SIGKILL 9
13
#define SIGQUIT 3
14
// SOCKETS
15
SOCKET sock,client;
16
 
17
void s_handle(int s)
18
{
19
  if(sock)
20
    closesocket(sock);
21
  if(client)
22
    closesocket(client);
23
  WSACleanup();
24
  Sleep(1000);
25
  cout<<"EXIT SIGNAL :"<<s;
26
  exit(0);
27
}
28
 
29
 
30
void s_cl(char *a, int x)
31
{
32
  cout<<a;
33
  s_handle(x+1000);
34
}
35
 
36
 
37
int main()
38
{
39
  SetConsoleTitle(".:: Basic Echo Client By KOrUPt 07 ::. ");
40
 
41
 
42
  //Declarations
43
  //DWORD poll;
44
  char RecvdData[100] = "";
45
  int ret;
46
  int res,i=1,port=999;
47
  char buf[100];
48
  char msg[100] = "";
49
  WSADATA data;
50
 
51
  signal(SIGINT,s_handle);
52
  signal(SIGKILL,s_handle);
53
  signal(SIGQUIT,s_handle);
54
 
55
  sockaddr_in ser;
56
  sockaddr addr;
57
 
58
 
59
  ser.sin_family=AF_INET;
60
  ser.sin_port=htons(55902);                    //Set the port
61
  ser.sin_addr.s_addr=inet_addr("83.99.185.51");        //Set the address we want to connect to
62
 
63
  memcpy(&addr,&ser,sizeof(SOCKADDR_IN));
64
 
65
  res = WSAStartup(MAKEWORD(1,1),&data);        //Start Winsock
66
 
67
  if(res != 0)
68
    s_cl("WSAStarup failed",WSAGetLastError());
69
 
70
  sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);        //Create the socket
71
  if(sock==INVALID_SOCKET )
72
    s_cl("Invalid Socket ",WSAGetLastError());
73
  else if(sock==SOCKET_ERROR)
74
    s_cl("Socket Error)",WSAGetLastError());
75
  else
76
    cout<<"Socket Established"<<endl;
77
 
78
 
79
 
80
  res=connect(sock,&addr,sizeof(addr));                //Connect to the server
81
  if(res !=0 )
82
  {
83
    s_cl("SERVER UNAVAILABLE",res);
84
  }
85
  else
86
  {
87
    memcpy(&ser,&addr,sizeof(SOCKADDR));
88
  }
89
 
90
  strcpy(buf,"hello");
91
  res = send(sock,buf,sizeof(buf),0);
92
 
93
  ret = recv(sock,RecvdData,sizeof(RecvdData),0);
94
  if(ret > 0)
95
  {
96
    cout<<RecvdData;
97
    strcpy(RecvdData,"");
98
  }
99
 
100
  cout << RecvdData << endl;
101
 
102
 
103
  while(true)
104
  {
105
    strcpy(buf,"hello");
106
    cout<<"\nEnter message to send ->\n";
107
    fgets(buf,sizeof(buf),stdin);
108
 
109
 
110
    Sleep(5);
111
    //res = send(sock,buf,sizeof(buf),0);
112
 
113
    if(res==0)
114
    {
115
      //0==other side terminated conn
116
      printf("\nSERVER terminated connection\n");
117
      Sleep(40);
118
      closesocket(client);
119
      client = 0;
120
      break;
121
    }
122
    else if(res==SOCKET_ERROR)
123
    {
124
      //-1 == send error
125
      printf("Socket error\n");
126
      Sleep(40);
127
      s_handle(res);
128
      break;
129
    }
130
 
131
    ret = recv(sock,RecvdData,sizeof(RecvdData),0);
132
    if(ret > 0)
133
    {
134
      cout<<endl<<RecvdData;
135
      strcpy(RecvdData,"");
136
    }
137
  }
138
 
139
  closesocket(client);
140
  WSACleanup();
141
 
142
  return 0;
143
}


Код сервера :

C++ Source Code:
1
#include <windows.h>
2
#include  <stdlib.h>
3
#include <stdio.h>
4
#include <winsock.h>
5
#include <iostream>
6
using namespace std;
7
 
8
// our thread for recving commands
9
DWORD WINAPI receive_cmds(LPVOID lpParam)
10
{
11
  printf("AntiHack -> server -> thread created\r\n");
12
 
13
  // set our socket to the socket passed in as a parameter
14
  SOCKET current_client = (SOCKET)lpParam;
15
 
16
  // buffer to hold our recived data
17
  char buf[100];
18
  // buffer to hold our sent data
19
  char sendData[100];
20
  // for error checking
21
    int res;
22
 
23
  // our recv loop
24
  while(true)
25
  {
26
    res = recv(current_client,buf,sizeof(buf),0); // recv cmds
27
 
28
    Sleep(10);
29
 
30
    if(res == 0)
31
    {
32
      MessageBox(0,"error","error",MB_OK);
33
      closesocket(current_client);
34
      ExitThread(0);
35
    }
36
 
37
    if(strstr(buf,"hello"))
38
    { // greet this user
39
    printf("\nAntiHack -> recieved -> %s",buf);
40
 
41
    strcpy(sendData,"\nAntiHack -> recieved -> O.K\n");
42
    Sleep(10);
43
    send(current_client,sendData,sizeof(sendData),0);
44
    printf("\nAntiHack -> sended -> O.K\n");
45
    cout << endl;
46
  }
47
  else if(strstr(buf,"1384748973"))
48
  {
49
    printf("\nAntiHack -> recieved -> %s",buf);
50
 
51
    strcpy(sendData,"\nAntiHack -> recieved -> O.K\n");
52
    Sleep(10);
53
    send(current_client,sendData,sizeof(sendData),0);
54
    printf("\nAntiHack -> sended -> O.K\n");
55
    cout << endl;
56
  }
57
  else
58
  {
59
    //printf("\nTest\n");
60
    strcpy(sendData,"Invalid cmd\n");
61
    Sleep(10);
62
    send(current_client,sendData,sizeof(sendData),0);
63
  }
64
 
65
  // clear buffers
66
  strcpy(sendData,"");
67
  strcpy(buf,"");
68
}
69
}
70
 
71
int main()
72
{
73
  printf("AntiHack -> server -> starting\r\n");
74
 
75
  // our masterSocket(socket that listens for connections)
76
  SOCKET sock;
77
 
78
  // for our thread
79
    DWORD thread;
80
 
81
  WSADATA wsaData;
82
  sockaddr_in server;
83
 
84
  // start winsock
85
  int ret = WSAStartup(0x101,&wsaData); // use highest version of winsock avalible
86
 
87
  if(ret != 0)
88
  {
89
    return 0;
90
  }
91
 
92
  // fill in winsock struct ...
93
  server.sin_family=AF_INET;
94
  server.sin_addr.s_addr=INADDR_ANY;
95
  server.sin_port=htons(55902); // listen on telnet port 55902
96
 
97
  printf("AntiHack -> listening port # : 55902\r\n");
98
  cout << endl;
99
 
100
  // create our socket
101
  sock=socket(AF_INET,SOCK_STREAM,0);
102
 
103
  if(sock == INVALID_SOCKET)
104
  {
105
    return 0;
106
  }
107
 
108
  // bind our socket to a port(port 55902)
109
  if( bind(sock,(sockaddr*)&server,sizeof(server)) !=0 )
110
  {
111
    return 0;
112
  }
113
 
114
  // listen for a connection
115
  if(listen(sock,5) != 0)
116
  {
117
    return 0;
118
  }
119
 
120
  // socket that we snedzrecv data on
121
  SOCKET client;
122
 
123
  sockaddr_in from;
124
  int fromlen = sizeof(from);
125
 
126
  int schit;
127
  schit=0;
128
 
129
  // loop forever
130
  while(true)
131
  {
132
 
133
    // accept connections
134
    client = accept(sock,(struct sockaddr*)&from,&fromlen);
135
    printf("AntiHack -> client -> connected\r\n");
136
    schit++;
137
    printf("AntiHack -> client -> # : %d\n",schit);
138
 
139
    // create our recv_cmds thread and parse client socket as a parameter
140
    CreateThread(NULL, 0,receive_cmds,(LPVOID)client, 0, &thread);
141
  }
142
 
143
  // shutdown winsock
144
  closesocket(sock);
145
  WSACleanup();
146
 
147
  // exit
148
  return 0;
149
}


Гугля не дал никаких результатов.

__________________
Сайт латвийского мода

Игроки в халф лайф делятся на две больше группы - те, кто не доехал на поезде и те, кто прошел несколько раз.

Сообщить модератору | | IP: Записан
Сообщение: 38801

Старое сообщение 28-10-2008 17:30
- За что?
Тема: (Опционально)
Ваш ответ:



Переводчик транслита


[проверить длину сообщения]
Опции: Автоматическое формирование ссылок: автоматически добавлять [url] и [/url] вокруг интернет адресов.
Уведомление по E-Mail: отправить вам уведомление, если кто-то ответил в тему (только для зарегистрированных пользователей).
Отключить смайлики в сообщении: не преобразовывать текстовые смайлики в картинки.
Показать подпись: добавить вашу подпись в конец сообщения (только зарегистрированные пользователи могут иметь подписи).

Временная зона GMT. Текущее время 11:19. Новая тема    Ответить
  Предыдущая тема   Следующая тема
HLFX.Ru Forum HLFX.Ru Forum > Наш форум > Технические вопросы > Для тех кто знаком с Winsock
Вопросик
Версия для печати | Отправить тему по E-Mail | Подписаться на эту тему

Быстрый переход:
Оцените эту тему:

Правила Форума:
Вы not можете создавать новые темы
Вы not можете отвечать в темы
Вы not можете прикреплять вложения
Вы not можете редактировать ваши сообщения
HTML Код ВЫКЛ
vB Код ВКЛ
Смайлики ВКЛ
[IMG] Код ВКЛ
 

< Обратная связь - HLFX.ru >

На основе vBulletin
Авторское право © 2000 - 2002, Jelsoft Enterprises Limited.
Дизайн и программирование: Crystice Softworks © 2005 - 2024