Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Помогите решить проблему с чатом на С#

48K
11 мая 2009 года
neskin
2 / / 11.05.2009
Привет, есть чат на си, сервер:
Код:
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#define MAXBUF 1024
#include<time.h>
char* date(){
time_t t=time(NULL);
char *s=ctime(&t);
return s;
}



int main(int argc, char **argv)
{
  int lh_sd, ch_sd;  // ??????????? ???????
  // ????????? ????????? ?????????? ?????? (????????? ??????????, ????, ?????)
  struct sockaddr_in lh_addr;
  // ????????? ????????? ?????????? ?????? (????????? ??????????, ????, ?????)
  struct sockaddr_in rh_addr;
  struct in_addr *local_addr;
  socklen_t lh_addr_len, rh_addr_len; // ????? ????????
  int msg_len; // ?????????? ??????????? ????
  int buf_sz = 1024;  // ?????? ??????
  char buf[buf_sz];
  uint16_t port;  

  if(argc < 2){
    fprintf(stderr, "Usage\n %10s port\n", argv[0]);
    exit(1);
  }

  // ??????? ?????????? ??????, ??? ?????? ?? ????????? TCP
  if((lh_sd = socket(PF_INET, SOCK_STREAM, 0)) == -1){
    fprintf(stderr, "%10s: Create socket error: %s\n", argv[0], strerror(errno));
    exit(errno);
  }

  // ?????????????? ????????? ?????????? ?????? (????????? ??????????, ????, ?????)
  lh_addr.sin_family = AF_INET;
  port = htons(strtol(argv[1], 0, 0));
  lh_addr.sin_port = port;               // ????? ??????? ???? ????
  // ????? ????????? ?????? ?? ???? ????????? ???????????
  lh_addr.sin_addr.s_addr = INADDR_ANY;  

  // ?????????? ?????? ??? (?????? ????????? ?????????: ????? ? ????)
  if(bind(lh_sd, (struct sockaddr *)&lh_addr, sizeof(lh_addr)) == -1){
    fprintf(stderr, "%10s: Bind socket error: %s\n", argv[0], strerror(errno));
    exit(errno);
  }

  // ????????? ????? ? ????? ????????????? ??????????
  if(listen(lh_sd, 1) == -1){
    fprintf(stderr, "%10s: Listen socket error: %s\n", argv[0], strerror(errno));
    exit(errno);
  }
  printf("Listen...\n");
  rh_addr_len = sizeof(struct sockaddr_in);

  while(1){     // ???????? ???? ?? ?????
    // ????????? ??????????
    // rh_addr ??????????? ??????????? ?????????? ??????
    if((ch_sd = accept(lh_sd, (struct sockaddr*) &rh_addr,
        &rh_addr_len)) == -1){
      fprintf(stderr, "%10s: Accept connection error: %s\n", argv[0],  
              strerror(errno));
      exit(errno);
    }
    printf("Establish connection with: %s\n", inet_ntoa(rh_addr.sin_addr));
    // ????????? ?????? ?? ??????? ? ????? ?? ?? ??????????? ?????
    msg_len = 1;
    while(msg_len){
    if((msg_len = read(ch_sd, buf, buf_sz)) == -1){
          fprintf(stderr, "%10s: Read incoming data error: %s\n", argv[0],
                   strerror(errno));

exit(errno);
 
}

char *s=date();

send(ch_sd,s,strlen(s),0);
//send(ch_sd,buf,buf_sz,0);

write(1, buf, msg_len);


printf("Stoping server");  
 }
    // ????? ???????? ?????? ?????????? ? ????????? ?????????? ? ????????  
   
close(ch_sd);
    }
  //}

  return 0;
}


Клиент:
Код:
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include<netdb.h>
int main(int argc, char **argv)
{
  int sh_sd,portno; // ?????????? ??????
  // ????????? ????????? ?????????? ??????  (????????? ??????????, ????, ?????)
  struct sockaddr_in sh_addr;
struct hostent *server;
  int msg_len;  // ?????????? ??????????? ????
  int buf_sz = 1024; // ?????? ??????
  char buf[buf_sz];

  // ??????? ?????????? ?????? ??? ?????? ?? ????????? TCP
  if((sh_sd = socket(PF_INET, SOCK_STREAM, 0)) == -1){
    fprintf(stderr, "%10s: Create socket error: %s\n", argv[0], strerror(errno));
    exit(errno);
  }

  // ?????????????? ????????? ?????????? ?????? (????????? ??????????, ????, ?????)
  sh_addr.sin_family = AF_INET;
  sh_addr.sin_port = htons(strtol(argv[2], 0, 0));
portno=atoi(argv[2]);
server=gethostbyname(argv[1]);
if(server==NULL){fprintf(stderr,"ERROR,no such sost\n");exit(errno);}
//if(inet_aton(argv[1], &(sh_addr.sin_addr)) == 0){
  // fprintf(stderr, "%10s: IP not valid: %s\n", argv[0], strerror(errno));
   //exit(errno);
//}
bzero((char *) &sh_addr,sizeof(sh_addr));
sh_addr.sin_family=AF_INET;
bcopy((char *)server->h_addr,(char *)&sh_addr.sin_addr.s_addr,server->h_length);
sh_addr.sin_port=htons(portno);

  // ????????????? ?????????? ? ????????? ???????
  if(connect(sh_sd, (struct sockaddr *)&sh_addr, sizeof(sh_addr)) == -1){
    fprintf(stderr, "%10s: Connect error: %s\n", argv[0], strerror(errno));
    exit(errno);
  }


  printf("Establish connection with: %s\n", inet_ntoa(sh_addr.sin_addr));


  // ?????? ??????????? ???? ? ???????? ?? ??????
  msg_len = 1;
  while(msg_len){
    msg_len = read(0, buf, buf_sz);
    write(sh_sd, buf, msg_len);

recv(sh_sd,buf,sizeof(buf),0);
printf("%s \r",buf);

}



  close(sh_sd);

  return 0;
}

Нужно сделать следующее:
Модифицируйте протокол таким образом, чтобы сигналом для ответа сервера был не запрос на установление соединение, а прием одного пакета, содержащего произвольную строку. Сервер должен вернуть пользователю эту строку, интерпретируя следующие символы:
\w – подстановка дня недели, например Thursday;
\m – подстановка месяца, например February;
\d – подстановка дня месяца (2 цифры), например 09;
\y – подстановка года (4 цифры), например 2006;
\h – подстановка часа (2 цифры), например 19;
\i – подстановка минуты (2 цифры), например 01;
\s – подстановка секунды (2 цифры), например 44;
\ - отменяет подстановку вышеуказанных символов;
\\ - подстановка прямого слеша `\'.
Например, при получении строки
`time is \w, \m \d, \y \h:\i:\s'
сервер должен вернуть дату и время в следующем виде
`time is Monday, February 20, 2006 10:01:23'
Пробывал с помошью scanf и с помошью массивов не получаеться, очень прошу помочь
5
12 мая 2009 года
hardcase
4.5K / / 09.08.2005
А при чем тут C#?
48K
24 мая 2009 года
neskin
2 / / 11.05.2009
Немного подумав, я сделал такую програмку:
Код:
#include <iostream>
#include <cstdlib>
#include <string>
#include <stdio.h>
#include <vector>
#include <time.h>
const size_t BUFFER_SIZE(2048);


void GetTime(const char* str, int& h, int& m, int& s)
{
    char* r = strdup(str);
    strcat(r,":");
    char *b = r;

    int num(0);
    while(char *p = strchr(b,':'))
    {
        *p = 0;
        char *workStr = strdup(b);
        switch(num++)
        {
        case 0: h = atoi(workStr);  break;
        case 1: m = atoi(workStr);  break;
        case 2: s = atoi(workStr);  break;
        }
        b = p+1;
        free(workStr);
    }
}

void datetime(const char* buf, char* resultString)
{
    time_t t = time(NULL);
    char *s  = ctime(&t);
    // printf("%s", s);
    const size_t MAX_ELEMENTS(8);
    const size_t MAX_SYMBOLS(20);
    enum ENUM_ELEMENT
    {
        EE_DAY = 0,
        EE_MONTH,
        EE_DAT,
        EE_TIM,
        EE_YEAR,
        EE_HOUR,
        EE_MIN,
        EE_SEC
    };

    char strings[MAX_ELEMENTS][MAX_SYMBOLS] = {0};

    sscanf(s,"%s%s%s%s%s",strings[EE_DAY],
                              strings[EE_MONTH],
                              strings[EE_DAT],
                              strings[EE_TIM],
                              strings[EE_YEAR]);
    int hour,minutes,seconds;
    GetTime(strings[EE_TIM],hour,minutes,seconds);

    char keys[15] = "wmdyhis";

    for(int i = 0; i < strlen(buf); ++i)
    {
        if('/' == buf)
        {
            for(int j = 0; j < 15; ++j) if (keys[j] == buf[i+1])
            {
                char workStr[32];
                switch (j)
                {
                case 0:     sprintf(workStr,"%s", strings[EE_DAY]);          break;
case 1:     sprintf(workStr,"%s", strings[EE_MONTH]);     break;
case 2:     sprintf(workStr,"%s", strings[EE_DAT]);          break;
case 3:     sprintf(workStr,"%s", strings[EE_YEAR]);          break;
case 4:     sprintf(workStr,"%i", hour);                         break;
case 5:     sprintf(workStr,"%i", minutes);               break;
case 6:     sprintf(workStr,"%i", seconds);                    break;
                }
                strcat(resultString,workStr);
            }
        }
    }
}

а вот когда подключаю в сервер и пытааюсь сендом отослать на клиент посылает какуе-то фигню результат парсинга правильный и храниться в result
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог