![]() |
|
|
google unix.com
|
|||||||
| Fóruns | Registar | Fórum Regimento | Ligações | Álbuns | FAQ | Lista deputados | Calendário | Pesquisa | Today's Posts | Mark Forums Read |
| Alto Nível de programação Post perguntas sobre C, C + +, Java, SQL, e outras linguagens de programação aqui. |
Mais UNIX e Linux Fórum Tópicos Você pode achar Helpfull
|
||||
| Fio | Thread Starter | Fórum | Respostas | Última postagem |
| Servidor programa cliente | pip3r | Alto Nível de programação | 9 | 04-17-2008 02:15 |
| Cliente e servidor programa gen pelo Makefile | wongalan48 | Alto Nível de programação | 0 | 03-05-2007 01:09 |
| Chat programa cliente-servidor | powermind | Alto Nível de programação | 1 | 09-04-2006 12:19 |
| programa para transferir um ficheiro a partir de máquina cliente para o servidor | nathgopi214 | Alto Nível de programação | 3 | 07-04-2006 07:16 |
| Eu quero um programa que recebe Cliente UDP | Nirmala | IP Networking | 1 | 06-10-2005 04:46 |
![]() |
|
|
Linkback | Thread Tools | Pesquisar este Thread | Rate Thread | Display Modes |
|
|
|
||||
|
Cliente - servidor programa
Eu vim acors esta codificação quando surfin o net.this código funciona perfectly.but como eu sou novo a esta tomada de programação Preciso sm citou comentários sobre ela ou explicação a respeito deste código fonte.
Tenho o entendimento PRB server.ci já postou-o abaixo u guys pode me ajudar! cheerZ O server.c Código:
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <sys/time.h>
#define MAX_CLIENTS 64
struct sockaddr_in servaddr;
int addr_len;
struct sockaddr addr;
struct sockaddr_in *ptr;
int cl_addr_len;
struct sockaddr_in cl_addr;
char in_buf[100], out_buf[100];
char names [10][30];
char message[150];
int num_names = 0;
typedef struct cl_info
{
char cl_id[30];
int cl_status;
}cl_info;
cl_info clients[MAX_CLIENTS];
int main(int argc, char **argv)
{
int newsockfd;
int sockfd;
int nbytes;
int max_fd;
int fd;
short func_num;
fd_set test_set, ready_set;
sockfd = socket(AF_INET, SOCK_STREAM, 0);
servaddr.sin_family - AF_INET;
servaddr.sin_port = 0; /*choose an unused port at random */
servaddr.sin_addr.s_addr = INADDR_ANY; /* auto fill with my IP address */
bind(sockfd,(struct sockaddr*) &servaddr, sizeof(servaddr));
addr_len = sizeof(addr);
getsockname(sockfd, &addr, &addr_len);
ptr = (struct sockaddr_in *)&addr;
printf("\nServer on port# %d\n", ptr->sin_port);
listen(sockfd, 5);
max_fd = sockfd;
FD_ZERO(&test_set); /*clear the listening socket */
FD_SET(sockfd, &test_set);
while(1)
{
memcpy(&ready_set, &test_set, sizeof(test_set));
select(max_fd+1, &ready_set, NULL, NULL, NULL);
if(FD_ISSET(sockfd, &ready_set)) /*if listening sock has data its a call from new client */
{
/*create a new socket */
cl_addr_len = sizeof(cl_addr);
newsockfd = accept(sockfd, (struct sockaddr *)&cl_addr, &cl_addr_len);
printf("\nA new connection has been made to socket %d\n", newsockfd);
FD_SET(newsockfd, &test_set); /* add new socket to list */
if(newsockfd > max_fd)
max_fd = newsockfd; /*update max_fd with new socket file discriptor */
} /*end if*/
for(fd=0; fd <= max_fd; fd++) /*loop through connected socket file discriptors */
{
if((fd !=sockfd) && FD_ISSET(fd, &ready_set))/*bypass listening sock if sock has data*/
if(process_call(fd, max_fd) == 0) /*if socket is closed */
{
printf("\nThe listening socket is now closed\n");
close(newsockfd);
printf("\nClient on socket %d has left the room\n", sockfd);
FD_CLR(fd, &test_set); /*remove socket from list */
/*decrement user count */
} /*end if */
} /* end for loop */
} /*end while loop */
return 0;
} /*end main */
int add_name(int sockfd)
{
int nbytes;
short name_len;
short n_name_len;
printf("\nAdding name .....\n");
nbytes = read(sockfd, (char *)&name_len, sizeof(short));
name_len = ntohs(name_len); /*convert name_len from network to host short */
memset(clients[sockfd].cl_id, 0, 30); /*set all bytes to zero */
nbytes = read(sockfd, clients[sockfd].cl_id, name_len);
num_names ++; /*increment user count */
printf("\n%s has joined the chat room\n", clients[sockfd].cl_id);
/*need to broadcast user has joined plus user id to connected clients here */
} /*end add_name function */
int how_many(int sockfd, int max)
{
int sock;
short user_len;
char username[30];
for(sock = 4; sock <= max; sock++)
{
strcpy(username, clients[sock].cl_id);
user_len = htons(strlen(username));
write(sockfd, (char *)&user_len, sizeof(short));
write(sockfd, username, strlen(username));
send_user_list(sockfd, username);
}
} /*end how_many function */
int send_user_list(int sockfd, char *users)
{
short msg_type;
short user_len;
msg_type = htons(2);
printf("msg_type is : %u\n", msg_type);
write(sockfd, &msg_type, sizeof(short));
user_len = htons(strlen(users));
write(sockfd, (char *)&user_len, sizeof(short));
write(sockfd, users, strlen(users));
}
int find_name(int sockfd, int max)
{
char search_name[30];
int sock;
int found = 0;
short len, name_len;
char sender[30];
short sender_len;
char msg[150];
short msg_len;
memset(search_name, 0, 30); /*set all bytes to zero */
printf("\nReceiving userid......\n");
read(sockfd, (char *)&name_len, sizeof(short));
len = ntohs(name_len);
read(sockfd, search_name, len);
read(sockfd, &msg_len, sizeof(short));
msg_len = ntohs(msg_len);
read(sockfd, msg, msg_len);
msg[msg_len] = '\0';
strcpy(sender, clients[sockfd].cl_id);
for(sock = 4; sock <= max; sock++)
{
printf(" %d is held in max\n", max);
printf("\ncomparing search request for %s with %s username\n",
search_name, clients[sock].cl_id);
if(strcmp(search_name, clients[sock].cl_id) ==0)
{
printf("\nuserid found\n");
found = 1;
send_async_msg(sock, msg,sender);
}/*end if */
} /*end for loop */
if(! found)
{
printf("\nuserid not found\n");
} /*end if */
}/*end find_name function */
int process_call(int newsockfd, int max_fd)
{
int nbytes;
short func_num;
nbytes = read(newsockfd, (char *)&func_num, sizeof(short));
if(nbytes ==0)
return 0;
if (nbytes != sizeof(short))
{
perror("\nUnknown menu option!\n");
exit(1);
} /* end if */
func_num = ntohs(func_num);
switch(func_num)
{
case(1):
add_name(newsockfd);
break;
case(2):
how_many(newsockfd, max_fd);
break;
case(3):
find_name(newsockfd, max_fd);
break;
case(4):
send_global_msg(newsockfd, max_fd);
break;
case(5):
printf("\nShutting down Server...\n");
exit(0);
default:
printf("\nUnknown function number!\n");
break;
} /*end switch */
} /*end process_call function */
int send_async_msg(int sockfd, char * msg, char *sender)
{
short msg_type;
short msg_len;
short sender_len;
msg_type = htons(1);
printf("msg_type is : %u\n", msg_type);
write(sockfd, &msg_type, sizeof(short));
msg_len = htons(strlen(msg));
write(sockfd, (char *)&msg_len, sizeof(short));
write(sockfd, msg, strlen(msg));
sender_len = htons(strlen(sender));
write(sockfd, (char *)&sender_len, sizeof(short));
write(sockfd, sender, strlen(sender));
}/* end of send_async_msg function */
int send_global_msg(int sockfd, int max_fd)
{
int nbytes;
int sock;
short len;
short msg_type;
char msg[150];
char sender[30];
short sender_len;
strcpy(sender, clients[sockfd].cl_id);
msg_type = 1;
memset(in_buf, 0, sizeof(in_buf)); /*set all to zero */
nbytes = read(sockfd, &len, sizeof(short));
len = ntohs(len);
read(sockfd, msg, len);
message[len] = '\0';
for(sock = 4; sock <= max_fd; sock++)
{
send_async_msg(sock, msg, sender);
} /*end for loop */
} /* end of send_global_msg function */
Última edição por reborg; em 09/16/2006 04:51.. |
|
||||
|
leia meu post
Citação:
Obrigado. |
|
||||
|
Olá
Citação:
Olá, obrigado. Está tudo pronto me deu resposta sobre a seqüência e, em seguida, extrair impressão para fora. Eu pensei que ninguém viu. No futuro, eu vou esperar por um longo tempo, antes de pedir novamente. A minha pergunta foi como extrair uma seqüência específica de um arquivo com sscanf () e, em seguida, imprimir-lo. Eu tenho a resposta. Mas agora pergunto-me se é possível extrair mais de uma cadeia de mais de uma linha de um arquivo. Diga-me, temos um arquivo, cat / proc / cpuinfo processador: 0 vendor_id: GenuineIntel cpu family: 15 modelo: 2 Nome do modelo: Intel (R) Celeron (R) CPU 2.60GHz stepping: 9 cpu MHz: 2591.654 cache size: 128 KB fdiv_bug: nenhuma hlt_bug: nenhuma f00f_bug: nenhuma coma_bug: nenhuma FPu: sim fpu_exception: sim CPUID nível: 2 wp: yes flags: FPu VME de pse E eu quero extrair vendor_id: GenuineIntel modelo: 2 Nome do modelo: Intel (R) Celeron (R) CPU 2.60GHz Sei que é possível por wrting o seguinte código três vezes, neste caso, como estamos extraindo três cordas aqui. if (NULL \u003d\u003d (fp \u003d fopen (argv [1], "rt "))){ printf ( "Não é possível abrir% s \ n", argv [1]); exit (1); ) for (; fgets (buf, 255, fp) (if (buf \u003d\u003d strstr (buf, "modelo de nome")) ( if (NULL! \u003d (p \u003d strchr (buf,':'))) printf ( "% s \ n", p + 1); break; ) Mas há um caminho, para que eu possa escrever o código uma vez, mas pode extrair algumas cordas e imprimi-las, de uma só vez uma após a outra. E também, há uma maneira, e que, em um arquivo C posso abrir arquivos mutiple pelo argumento da linha de comandos, um após o outro. Diga-me, depois que eu sou feito com impressão vendor_id, modelo tipo, e nome do modelo, a partir de cpuinfo arquivo do / proc diretório, vou abrir a stat a partir do arquivo / proc Diretório e iniciar extrair algumas cordas específicas e imprimir-los novamente. Será que uma maneira muito compilcated ou muito simples. Por favor, deixe-me saber como fazer isso se você sabe. E também, quando se extrair uma seqüência, digamos, cpu family: 15, 15 é um tipo string. Diga-me, eu quero converter uma cadeia de 15 a inteira, assim, eu uso atoi (), mas, para imprimi-lo, eu tenho que fazer o seguinte certo? int número \u003d atoi (p); printf ( "O valor inteiro é:% d \ n", número); Mas também não posso imprimir o valor inteiro. Então, acho que estou perdendo algo. A ajuda que pode chegar, vou ficar muito agradecido. Obrigado. ![]() |
![]() |
| Marcadores |
| Thread Tools | Pesquisar este Thread |
| Display Modes | Esta taxa Thread |
|
|