TCP에서의 예제를 UDP로 바꾼 프로그램
a.out(서버)
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#define PORT 7777 /* 포트 번호 */
#define BUFSIZE 1024
main()
{
int sockfd;
struct sockaddr_in servAddr;
struct sockaddr_in clntAddr;
char recvBuffer[BUFSIZE];
int clntLen;
int recvLen;
/* 인터넷으로 연결된 프로세스들 간에 통신을 하고 UDP 방법을 이용하는 소켓을 생성 */
if((sockfd=socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
perror("sock failed");
exit(1);
}
/* servAddr를 0으로 초기화 */
memset(&servAddr, 0, sizeof(servAddr));
/* servAddr에 IP 주소와 포트 번호를 저장 */
servAddr.sin_family = AF_INET;
servAddr.sin_addr.s_addr = htonl(INADDR_ANY);
servAddr.sin_port = htons(PORT);
/* sockfd 소켓에 주소 정보 연결 */
if(bind(sockfd, (struct sockaddr*)&servAddr, sizeof(servAddr)) == -1) {
perror("bind failed");
exit(1);
}
/* 무한 반복 */
while(1) {
clntLen = sizeof(clntAddr);
/* sockfd 소켓으로 들어오는 데이터를 받아 recvBuffer에 저장하고
클라이언트 주소 정보를 clntAddr에 저장 */
if((recvLen=recvfrom(sockfd, recvBuffer, BUFSIZE-1, 0, (struct sockaddr*)&clntAddr, &clntLen)) == -1) {
perror("recvfrom failed");
exit(1);
}
recvBuffer[recvLen] = '\0';
/* 받은 데이터를 출력 */
printf("Recevied: %s\n", recvBuffer);
/* 받은 데이터를 클라이언트에게 보냄 */
if(sendto(sockfd, recvBuffer, recvLen, 0, (struct sockaddr*)&clntAddr, sizeof(clntAddr)) != recvLen) {
perror("sendto failed");
exit(1);
}
}
}
b.out
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#define PORT 7777 /* 서버의 포트 번호 */
#define BUFSIZE 1024
/* argv[1]은 수와 점 표기의 IP 주소 */
main(int argc, char *argv[])
{
int sockfd;
struct sockaddr_in servAddr;
char sendBuffer[BUFSIZE], recvBuffer[BUFSIZE];
int recvLen, servLen;
if(argc != 2) {
fprintf(stderr, "Usage: %s IP_address\n", argv[0]);
exit(1);
}
/* 소켓 생성 */
if((sockfd=socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
perror("sock failed");
exit(1);
}
memset(&servAddr, 0, sizeof(servAddr));
/* servAddr에 IP 주소와 포트 번호를 저장 */
servAddr.sin_family = AF_INET;
servAddr.sin_addr.s_addr = inet_addr(argv[1]);
servAddr.sin_port = htons(PORT);
/* quit를 입력 받을 때까지 반복 */
while(1) {
printf("Input sending message ==> ");
fgets(sendBuffer, BUFSIZE, stdin);
if(!strncmp(sendBuffer, "quit", 4))
break;
/* sockfd 소켓을 통해 servAddr을 주소로 갖는 서버에게 데이터를 보냄 */
if(sendto(sockfd, sendBuffer, strlen(sendBuffer), 0, (struct sockaddr*)&servAddr, sizeof(servAddr)) != strlen(sendBuffer)) {
perror("sendto failed");
exit(1);
}
servLen = sizeof(servLen);
/* sockfd 소켓으로 들어오는 데이터를 받아 recvBuffer에 저장 */
if((recvLen=recvfrom(sockfd, recvBuffer, BUFSIZE-1, 0, (struct sockaddr*)&servAddr, &servLen)) != strlen(sendBuffer)) {
perror("recvfrom failed");
exit(1);
}
recvBuffer[recvLen] = '\0';
/* 받은 데이터를 출력 */
printf("Recevied: %s\n", recvBuffer);
}
close(sockfd);
exit(0);
}
서버 터미널
[localhost@local]# a.out
Received : C
Received : JAVA
Received : Programming
클라이언트 터미널
[localhost@local]# b.out 210.xxx.xxx.xxx
Input sending message ===> C
Received : C
Input sending message ===> JAVA
Received : JAVA
Input sending message ===> Programming
Received : Programming
Input sending message ===> quit
'EMBEDDED > SYSTEM Proc' 카테고리의 다른 글
[Network] 일대일 채팅 프로그램 (1) | 2012.07.13 |
---|---|
[Network] 다수의 Client와의 Networking (0) | 2012.07.13 |
[Network] TCP 예제 socket(),bind(),inet_addr(),listen(),connect(),accept(),send(),recv() (0) | 2012.07.13 |
[Network] 기본적인 이론들 (0) | 2012.07.13 |
[Network] semget(),semctl(),semop() (0) | 2012.07.13 |