Exemplo de sockets: um client e um server bem simples

Publicado por Andre Luiz da Silva 14/05/2004

[ Hits: 29.405 ]

Homepage: http://localhost

Download sockets.tar.gz




Eh isso ae... acabei de ver um comentario de um amigo em que ele tava querendo um exemplo de client e server para aprender sobre sockets em C, então resolvi mandar esse aqui que eu tenho que eh bem basico mas de grande utilidade... falowz...


obs: eu não escrevi o codigo :-)

  



Esconder código-fonte

/* server.c */

#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<unistd.h>
#include<stdlib.h>
#include<stdio.h>

main()
{
   int cont,create_socket,new_socket,addrlen;
   int bufsize = 1024;
   char *buffer = malloc(bufsize);
   struct sockaddr_in address;
   
   printf("\x1B[2J");
   if ((create_socket = socket(AF_INET,SOCK_STREAM,0)) > 0)
     printf("The socket was created\n");
   address.sin_family = AF_INET;
   address.sin_addr.s_addr = INADDR_ANY;
   address.sin_port = htons(15000);
   if (bind(create_socket,(struct sockaddr *)&address,sizeof(address)) == 0)
     printf("Binding Socket\n");
   listen(create_socket,3);
   addrlen = sizeof(struct sockaddr_in);
   new_socket = accept(create_socket,(struct sockaddr *)&address,&addrlen);
   if (new_socket > 0){
      printf("The Client %s is connected...\n",inet_ntoa(address.sin_addr));
      for(cont=1;cont<5000;cont++)
   printf("\x7");
   }
   do{
      printf("Message to send: ");
      gets(buffer);
      send(new_socket,buffer,bufsize,0);
      recv(new_socket,buffer,bufsize,0);
      printf("Message recieved: %s\n",buffer);
   }while(strcmp(buffer,"/q")); //user ‘q’ to quit
   close(new_socket);
   close(create_socket);
}


/* client.c */

#include<sys/socket.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<unistd.h>
#include<stdlib.h>
#include<stdio.h>

main(int argc,char *argv[])
{
   int create_socket;
   int bufsize = 1024;
   char *buffer = malloc(bufsize);
   struct sockaddr_in address;
   
   printf("\x1B[2J");
   if ((create_socket = socket(AF_INET,SOCK_STREAM,0)) > 0)
     printf("The Socket was created\n");
   address.sin_family = AF_INET;
   address.sin_port = htons(15000);
   inet_pton(AF_INET,argv[1],&address.sin_addr);
   
   if (connect(create_socket,(struct sockaddr *)&address,sizeof(address)) == 0)
     printf("The connection was accepted with the server %s...\n",inet_ntoa(address.sin_addr));
   do{
      recv(create_socket,buffer,bufsize,0);
      printf("Message recieved: %s\n",buffer);
      if (strcmp(buffer,"/q")){
    printf("Message to send: ");
    gets(buffer);
    send(cria_socket,buffer,bufsize,0);
      }
   }while (strcmp(buffer,"/q"));
   close(create_socket);
}

Scripts recomendados

Ruby

Acha IP

Encontrar IP

Fractal

Simulação de controle de fluxo usando sockets


  

Comentários
[1] Comentário enviado por y2h4ck em 14/05/2004 - 08:51h

Bem simples poream ja aborda todos os principais topicos de como montar uma pequena seção em C usando sockets...
:)
Creio que ajudará muita gente a ter uma pequena noção do Assunto:)

Tks
[]s

[2] Comentário enviado por birilo em 14/05/2004 - 10:40h

Tive alguns erros, poderia me dar uma ajuda?

em server.c foram estes (e mais alguns outros do mesmo tipo)
---------------------------------------------------------------------------
server.c:1: error: parse error before '.' token
In file included from /usr/include/sys/types.h:266,
from server.c:3:
/usr/include/bits/pthreadtypes.h:50: error: parse error before "size_t"
/usr/include/bits/pthreadtypes.h:53: error: parse error before "__stacksize"
In file included from /usr/include/sys/uio.h:29,
from /usr/include/sys/socket.h:27,
from server.c:4:
/usr/include/bits/uio.h:45: error: parse error before "size_t"
In file included from /usr/include/sys/socket.h:35,
--------------------------------------------------------------------------
Em client.c foram estes.
==============================================
client.c: In function `main':
client.c:32: error: `cria_socket' undeclared (first use in this function)
client.c:32: error: (Each undeclared identifier is reported only once
client.c:32: error: for each function it appears in.)
==============================================

Abraços

[3] Comentário enviado por andrack em 14/05/2004 - 19:20h

Amigão.... primeiro eu peço desculpas pela minha sacangem de mandar o código sem nem ao menos dar uma corrigida... ops! Bom, quanto ao client.c dei uma olhada e jah te mandei um patch pra corrigir isso ae. ;-) , mas
os erros em server.c estão me deixando meio "encabulado", tipow.... na minha máquina compilou normal, sem problemas... creio que isso deva ser algum problema com a localização de alguns headers que estão fora de lugar.

Eh issoo.... falowz!

[4] Comentário enviado por andrack em 14/05/2004 - 19:23h

Segue a correção... para aplicar o patch faça:

$ patch -b -p0 client.c < client.patch

Primeiro tu copia isso para um arquivo txt , é claro! ;-)

--- client.c 2004-05-14 19:06:50.000000000 -0800
+++ client_corr.c 2004-05-14 19:06:04.000000000 -0800
@@ -7,6 +7,8 @@
#include<stdlib.h>
#include<stdio.h>

+#define BUFF 1024
+
main(int argc,char *argv[])
{
int create_socket;
@@ -28,8 +30,8 @@
printf("Message recieved: %s\n",buffer);
if (strcmp(buffer,"/q")){
printf("Message to send: ");
- gets (buffer);
- send(cria_socket,buffer,bufsize,0);
+ fgets (buffer, BUFF-1, stdin);
+ send(create_socket,buffer,bufsize,0);
}
}while (strcmp(buffer,"/q"));
close(create_socket);

[5] Comentário enviado por jllucca em 14/05/2004 - 22:58h

Aqui rodou os dois arquivos bem.. a unica coisa que deu foi warnings no gets, depois de aplicar a correção no client.c... :)

[6] Comentário enviado por andrack em 15/05/2004 - 00:04h

Eehheheeh.... esses gets são fods! ;-)

Falowz...

[7] Comentário enviado por birilo em 15/05/2004 - 12:37h

Essas coisa de headers são um saco.... Mas tudo bem, vo dá uma pesquisada pra vê se arrumo...

agora, uma pergunta... Esse comando patch. não coinsegui usar.
Ele retorna o seguinte erro
-----------------------------------------------------------
patching file client.c
patch: **** malformed patch at line 9: main(int argc,char *argv[])
-----------------------------------------------------------
Copiei o que estava escrito na mensagem para dentro de um client.patch, e executei o comando.
$ patch -b -p0 client.c < client.patch

Aguardo uma resposta...
Valeu..


[8] Comentário enviado por andrack em 15/05/2004 - 17:25h

Vixi kra.... eu não esperava que o comando patch fosse tão rígido no que diz respeito a sintaxe do arquivo de correção, eu acho que o problema foi causado devido a falta de espaços no começo das linhas.... mas o que basicamente eu corrigi foi trocar a função gets pela fgets para evitar aquelas mensagens de warnnings do compilador e "traduzir" a variável cria_socket por create_socket..... qualquer coisa, dá uma olhada na fonte original... belê?

http://www.linuxgazette.com/issue47/misc/bueno/client.c
http://www.linuxgazette.com/issue47/misc/bueno/server.c

Prometo postar um exemplo de sockets de minha autoria que FUNCIONE sem problemas... eheheh ;-)

Falow ae galera!

[9] Comentário enviado por gvescovi em 17/03/2005 - 09:15h

Ae... da proxima vez que vc copiar um artigo, pelo menos mantenha os créditos de quem o fez, e mantenha a bendita indetação.. ctrl+c ctrl+v puro nao rola... até parece um usuario chipanze do windows... zuei...

[10] Comentário enviado por Wivia em 27/07/2012 - 09:25h

Alguém tem como me explicar melhor como faço a comunicação o send() e o recv()

Não entendi o por que do if de todas as informações que vem no recv comparar com -1?
está confuso isso pra mim.

if (recv(sd_current, msg, sizeof(msg), 0) == -1) {
perror("recv");
exit(1);
}

[11] Comentário enviado por klebervianna em 13/11/2014 - 16:41h

Dá erro de compilação logo na primeira linha.
Pode dar uma a de como resolver?
[Error] sys/socket.h: No such file or directory


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts