Войти
ПрограммированиеФорумСеть

Полное руководство по сетевому программированию для разработчиков игр. Часть 4. TCP (Комментарии к статье) (3 стр)

Страницы: 1 2 3
#30
11:07, 9 ноя. 2007

Методом проверки ошибок выяснил, что ошибка ещё в bind, причём непонятно какая, в man 2 bind её нет.


#31
11:22, 9 ноя. 2007

Mike Nerevarin
не знаю как в линухе.. не кодил сокеты... но в винде надо бы зделать инициализацию сокетов WSAStartup();

#32
11:52, 9 ноя. 2007

unsigned
Для Линукса это делать не надо, и тогда он ругался бы на сокет, а не на привязку. тут или что-то в моей системе не то, или с addr напортачил, как-то не так...

Но в общем случае статья фиговая, ибо нихрена из неё не работает.

#33
18:35, 12 янв. 2008

У меня вот какая проблема: вот частичный листинг сервера-
...
  WORD    winsock_version;                     
  WSADATA  winsock_data;                       
  int    winsock_error;                       
  SOCKET TCPsd;                             
  winsock_version=MAKEWORD(2, 0);                   
  winsock_error=WSAStartup(winsock_version,&winsock_data);
  if(winsock_error!=0)
  {
    printf("Could not initialize winsock");
    exit(1);
  }
  else
  {
    TCPsd=socket(PF_INET,SOCK_STREAM,0);
    if(TCPsd==INVALID_SOCKET)
    {   
      winsock_error=WSAGetLastError();
      printf("Could not create a socket. Error code: %d\n",winsock_error);
      exit(1); 
    }
  }
  printf("Server is up\n");
  printf("TCP Socket Descriptor: %d \n",TCPsd);
  int error,ncon=10;                         
  error=(listen(TCPsd,ncon));
  if(error!=0)
    printf("TCP Socket [SD: %d] listening filed.\n",TCPsd);
...
Так вот. Проблема в том, что listen(TCPsd,ncon) постоянно возвращает ошибку=(( Никак не могу понять в чем проблема.

#34
19:15, 12 янв. 2008

n0klin
bind - RTFM

#35
23:27, 12 янв. 2008

??? не понял=)

#36
0:37, 13 янв. 2008

Кстати, а после 4-ой части продолжения не было?

#37
3:21, 13 янв. 2008

n0klin
The following example demonstrates the use of the listen function.

#include <stdio.h>
#include "winsock2.h"

void main() {

  //----------------------
  // Initialize Winsock
  WSADATA wsaData;
  int iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
  if (iResult != NO_ERROR)
    printf("Error at WSAStartup()\n");

  //----------------------
  // Create a SOCKET for listening for
  // incoming connection requests.
  SOCKET ListenSocket;
  ListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  if (ListenSocket == INVALID_SOCKET) {
    printf("Error at socket(): %ld\n", WSAGetLastError());
    WSACleanup();
    return;
  }

  //----------------------
  // The sockaddr_in structure specifies the address family,
  // IP address, and port for the socket that is being bound.
  sockaddr_in service;
  service.sin_family = AF_INET;
  service.sin_addr.s_addr = inet_addr("127.0.0.1");
  service.sin_port = htons(27015);

  if (bind( ListenSocket, 
    (SOCKADDR*) &service, 
    sizeof(service)) == SOCKET_ERROR) {
    printf("bind() failed.\n");
    closesocket(ListenSocket);
    return;
  }

  //----------------------
  // Listen for incoming connection requests 
  // on the created socket
  if (listen( ListenSocket, SOMAXCONN ) == SOCKET_ERROR)
    printf("Error listening on socket.\n");

  printf("Listening on socket...\n");
  WSACleanup();
  return;
}
Прошло более 1 года
#38
3:15, 1 сен. 2009

Отличный гид, всё понятно, но есть один недостаток - он не доделан. Очевидно, что автор упоминал о пятой части, но вот найти её не могу...
Автор хоть и классно изложил материал, но один критический момент он всегда упускал и откладывал... Блокирующие функции, ставящие программу "на обе лопатки" пока не дойдет ответ, вот собственно и прошу у добрых, знающих людей помощи, как обойти эту проблему?...

#39
0:35, 25 янв. 2010

Занялся работой с сетью(на данный момент полный нуб в этой сфере). В статье описывается только "начало" работы - блокирующие сокеты не очень то юзабельны.

От сети мне требуется:
- нужно написать простенькую оболочку над функциями чтобы получилось примерно следующее: сетевай код постоянно принимает данные из сети и пишет их буферы (у каждого сокета свой буфер в котором храниться пришедшая информация). Получаю информацию из буферов с помощью функций похожих на `getNext4bytes()` `getNextByte()`
- сервер в состоянии работать с большим кол-вом клиентов (ММО, 2к+ клиентов)

посоветуйте пожалуйста статейки или информацию (технологии) с помощбю которых можно реализовать вышеизложеное. Муторно немножко написано, надеюсь поймете )))

Прошло более 11 месяцев
#40
16:43, 8 янв. 2011

Как получить свой адрес для бинда? Я раньше писал сетевые vcl проги, так там серверу достаточно было позаботиться только о номере порта, а клиенту нужен был адрес только серверного сокета, но не своего. А на API какой адрес в бинд пихать, если меня не устраивает случайный номер порта?

Страницы: 1 2 3
ПрограммированиеФорумСеть

Тема в архиве.