udp 메시지 전송 서버 클라이언트 프로그램입니다.

shs0917의 이미지

서버는 소켓을 하나 열고 클라이언트에서 메시지가 오기를 기다립니다.
클라이언트에서 메시지를 보내면 그걸 화면에 출력하고 다시 클라이언트로
전송하게 됩니다.. 그러면 클라이언트도 메시지를 화면에 찍게 됩니다.
그런데.. 클라이언트에서 메시지를 보내면 그뒤로 먹통입니다.
제 생각에는 서버가 메시지를 수신을 못해서.. 출력도 안해주고 그대로 대기
상태인거 같고, 클라이언트는 메시지 돌아오길 기다리느라.. 그런식으로
잠자고 있는거 같은데... 소스를 아무리 봐도 문제점을 찾기가 어렵습니다...
그럼 고수님들의 많은 조언 부탁 드립니다.
서버 소스입니다.

#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: 
첨부파일 크기
파일 udp_server.c1.18 KB
파일 udp_client.c1.33 KB
new5244의 이미지

udp 서버 소스코드에서

ser_addr.sin_port = htonl(PORT);

htonl -> htons 로 고치세요.

허허허~

from saibi

shs0917의 이미지

답변 감사합니다.. 어처구니 없는 실수였네요..

컴퓨터가 이해할수 있는 코드는 어느 바보나 다 작성할 수 있다. 좋은 프로그래머는 사람이 이해할 수 있는 코드를 짠다 - 마틴파울러

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.