LINUX.ORG.RU

Сокеты в Си (продолжене)


0

0

Что у меня за косяк на этот раз? %(
Уже замучился... Блин, сервер разрывает 
соединение =(.

#include <stdio.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <resolv.h>
int main()
{
  char *adres="192.168.50.1";
  int sock;
  struct sockaddr_in addr;
  sock=socket(PF_INET, SOCK_STREAM, 0);
  char in_letter, out_letter;
    bzero(&addr, sizeof(addr));
    addr.sin_family = AF_INET;
    inet_aton(adres, &addr.sin_addr);
    addr.sin_port=htons(2000);
 
  bind(sock, &addr, sizeof(addr));
  printf("bind OK\n");
  
  listen(sock,20);
  printf("Listen OK\n");
  
  for (;;)
   {
    int clientsd;
    clientsd=accept(sock, &addr, sizeof(addr));
    if (clientsd>0)
     {
      char buffer[1024];
      int nbytes;
     
      do 
       {
        nbytes = recv(clientsd, buffer, sizeof(buffer), 0);
	if (nbytes>0) send(clientsd, buffer, nbytes,0);
       } while (nbytes>0 && strncmp("bye\r",buffer,4)!=0);  	

      close(clientsd);
     }
    } 
   close(sock);
 return(0);
}

> Блин, сервер разрывает соединение =(.

а поточнее нельзя формулировать? сервер - это приведенная
программа? что значит разрывает?

> nbytes = recv(clientsd, buffer, sizeof(buffer), 0);
> ...
> while (nbytes>0 && strncmp("bye\r",buffer,4)!=0;

непонятно, как это может работать. если peer сделает:
      send("Hello\r");
      ....
      send("bye\r");

то вы вполне можете получить строку "hello\rbye\r",
и результат strncmp() != 0.

idle ★★★★★
()

В accept у тебя черт знает что. Второй аргумент - ? почему туда пихаешь серверную структуру ? Третий - надо указатель пихать, чтобы ядро туда записало длину клиентского адреса.
что-то типа:
socklen_t z;
struct sockaddr_in ddd; // <- Новая структура
z = sizeof(ddd);
accept(sock,(struct sockaddr *)ddd,&z);

Chumka ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.