#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;
}
#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 и с помошью массивов не получаеться, очень прошу помочь
А при чем тут C#?
Код:
#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);
}
}
}
}
#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