udp 메시지 전송 서버 클라이언트 프로그램입니다.
글쓴이: shs0917 / 작성시간: 월, 2004/08/16 - 5:35오후
서버는 소켓을 하나 열고 클라이언트에서 메시지가 오기를 기다립니다.
클라이언트에서 메시지를 보내면 그걸 화면에 출력하고 다시 클라이언트로
전송하게 됩니다.. 그러면 클라이언트도 메시지를 화면에 찍게 됩니다.
그런데.. 클라이언트에서 메시지를 보내면 그뒤로 먹통입니다.
제 생각에는 서버가 메시지를 수신을 못해서.. 출력도 안해주고 그대로 대기
상태인거 같고, 클라이언트는 메시지 돌아오길 기다리느라.. 그런식으로
잠자고 있는거 같은데... 소스를 아무리 봐도 문제점을 찾기가 어렵습니다...
그럼 고수님들의 많은 조언 부탁 드립니다.
서버 소스입니다.
#include <stdio.h> #include <string.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #define PORT 1234 #define BUF_SIZE 1024 int main(void){ int sockfd; struct sockaddr_in ser_addr, cli_addr; char recv_buf[BUF_SIZE]; int cli_len, recv_len; if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1){ fprintf(stderr, "socket error\n"); exit(1); } memset(&ser_addr, 0, sizeof(ser_addr)); ser_addr.sin_family = AF_INET; ser_addr.sin_addr.s_addr = htonl(INADDR_ANY); ser_addr.sin_port = htonl(PORT); if(bind(sockfd, (struct sockaddr *)&ser_addr, sizeof(ser_addr)) == -1){ fprintf(stderr, "bind error\n"); exit(1); } while(1){ cli_len = sizeof(cli_addr); if((recv_len = recvfrom(sockfd, recv_buf, BUF_SIZE - 1, 0, (struct sockaddr *)&cli_addr, &cli_len)) == -1){ fprintf(stderr, "recvfrom error\n"); exit(1); } printf("received success\n"); recv_buf[recv_len] = '\0'; printf("Server received : %s\n", recv_buf); if(sendto(sockfd, recv_buf, recv_len, 0, (struct sockaddr *) &cli_addr, sizeof(cli_addr)) != recv_len){ fprintf(stderr, "sendto error\n"); exit(1); } } return 0; }
클라이언트 소스입니다.
#include <stdio.h> #include <string.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #define PORT 1234 #define BUF_SIZE 1024 int main(int argc, char *argv[]){ int sockfd; struct sockaddr_in ser_addr; char send_buf[BUF_SIZE], recv_buf[BUF_SIZE]; int recv_len, ser_len; if(argc != 2){ fprintf(stderr, "usage : %s IP Address\n", argv[0]); exit(1); } if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1){ fprintf(stderr, "socket error\n"); exit(1); } memset(&ser_addr, 0, sizeof(ser_addr)); ser_addr.sin_family = AF_INET; ser_addr.sin_addr.s_addr = inet_addr(argv[1]); ser_addr.sin_port = htons(PORT); while(1){ printf("Input sending msg : "); fgets(send_buf, BUF_SIZE, stdin); if(!strncmp(send_buf, "quit", 4)) break; if(sendto(sockfd, send_buf, strlen(send_buf), 0, (struct sockaddr *)&ser_addr, sizeof(ser_addr)) != strlen(send_buf)){ fprintf(stderr, "sendto error\n"); exit(1); } printf("send success\n"); ser_len = sizeof(ser_len); if((recv_len = recvfrom(sockfd, recv_buf, BUF_SIZE - 1, 0, (struct sockaddr *)&ser_addr, &ser_len)) != strlen(send_buf)){ fprintf(stderr, "recvfrom error\n"); exit(1); } recv_buf[recv_len] = '\0'; printf("Client receive: %s\n", recv_buf); } close(sockfd); return 0; }
File attachments:
첨부 | 파일 크기 |
---|---|
![]() | 1.18 KB |
![]() | 1.33 KB |
Forums:
udp 서버 소스코드에서 [code:1]ser_addr.sin
udp 서버 소스코드에서
htonl -> htons 로 고치세요.
허허허~
from saibi
답변 감사합니다.. 어처구니 없는 실수였네요..
답변 감사합니다.. 어처구니 없는 실수였네요..
컴퓨터가 이해할수 있는 코드는 어느 바보나 다 작성할 수 있다. 좋은 프로그래머는 사람이 이해할 수 있는 코드를 짠다 - 마틴파울러
댓글 달기