linux에서udp 기반의 간단한 채팅창

채팅창을 만들기 전에 우리는 먼저 몇 가지 문제를 분명히 해야 한다
1.udp란 무엇인가?그는 무슨 작용을 합니까?그는 tcp와 어떤 차이가 있습니까?
udp는 사용자 데이터 보고 프로토콜입니다. 그는 데이터 보고를 위한 것입니다. 연결이 없고 신뢰할 수 없습니다.
tcp는 전송 제어 프로토콜입니다. 그는 바이트 흐름을 향하고 연결을 향하여 신뢰성을 확보합니다
2. 채팅창인 만큼 클라이언트(udp_client), 서버(udp_server)가 필요합니다.
그러면 클라이언트와 서버 포트를 어떻게 만듭니까?
vim udp_client.c
  1 #include                                                                                                                                        
  2 #include
  3 #include
  4 #include
  5 #include
  6 #include
  7 #include
  8 int main(int argc,char*argv[])// : ./udp_client+ip + 
  9 {
 10     if(argc!=3)
 11     {
 12         printf("Usage:%s [ip][port]
",argv[0]); 13 return 1; 14 } 15 int sock=socket(AF_INET,SOCK_DGRAM,0);// 16 if(sock<0) 17 { 18 printf("socket error!"); 19 return 2; 20 } 21 char buf[128]; 22 struct sockaddr_in server; 23 server.sin_family=AF_INET; 24 server.sin_port=htons(atoi(argv[2]));//atoi 25 server.sin_addr.s_addr=inet_addr(argv[1]); 26 socklen_t len=sizeof(server); 27 for(;;) 28 { 29 buf[0]=0; 30 ssize_t s=read(0,buf,sizeof(buf)-1); //0 ,1 ,2 31 if(s>0) 32 { 33 buf[s-1]=0;// 34 sendto(sock,buf,strlen(buf),0,(struct sockaddr*)&server,len); 35 s=recvfrom(sock,buf,sizeof(buf)-1,0,NULL,NULL); 36 if(s>0) 37 { 38 buf[s]=0; 39 printf("server echo# %s
",buf); 40 } 41 } 42 } 43 close(sock); 44 return 0; 45 }

vim udp_server.c
  #include                                                                                                                                        
  2 #include
  3 #include
  4 #include
  5 #include
  6 #include
  7 #include
  8 #define SIZE 128
  9 void service(int sock)
 10 {
 11     char buf[SIZE];
 12     for(;;)
 13     {
 14         buf[0]=0;
 15         struct sockaddr_in peer;
 16         socklen_t len=sizeof(peer);
 17         ssize_t s=recvfrom(sock,buf,sizeof(buf)-1,0,(struct sockaddr*)&peer,&len);//buf ,sockaddr* 
 18         {
 19             if(s>0)
 20             {
 21                 buf[s]=0;
 22                 printf("[%s : %d]#%s
",inet_ntoa(peer.sin_addr),ntohs(peer.sin_port),buf); 23 sendto(sock,buf,strlen(buf),0,(struct sockaddr*)&peer,len); 24 } 25 } 26 } 27 } 28 int main(int argc,char*argv[]) 29 { 30 if(argc!=3) 31 { 32 printf("Usage:%s [ip] [port]
",argv[0]); 33 return 3; 34 } 35 int sock=socket(AF_INET,SOCK_DGRAM,0); 36 if(sock<0) 37 { 38 printf("socket error!"); 39 return 1; 40 } 41 struct sockaddr_in local; 42 local.sin_family=AF_INET; 43 local.sin_port=htons(atoi (argv[2])); 44 local.sin_addr.s_addr=inet_addr(argv[1]); 45 if(bind(sock,(struct sockaddr*)&local,sizeof(local))<0)// ,local sockaddr 46 { 47 printf("bind error"); 48 return 2; 49 } 50 service(sock); 51 close(sock);// 52 }

vim Makefile 컴파일
 1 .PHONY:all
  2 all:udp_client udp_server
  3 udp_client:udp_client.c
  4     gcc -o $@ $^
  5 udp_server:udp_server.c
  6     gcc -o $@ $^
  7 .PHONY:clean
  8     clean:
  9     rm -f udp_client udp_server     

서버와 클라이언트의 생성을 완료하면 우리는 같은 IP 주소를 방문하여 통신할 수 있습니다.테스트에 사용하면 로컬 링 주소를 사용하도록 권장합니다.

좋은 웹페이지 즐겨찾기