코드

int main(int argc, char *argv[])
{
 int sockid, nread, addrlen;
 struct sockaddr_in my_addr, client_addr; // 주소
 char msg[50];
 if(argc != 2) {
 printf("%s myportid\n", argv[0]);
 return 0;
 }
 printf("Server: creating socket\n");
 if ( (sockid = socket(AF_INET, SOCK_DGRAM, 0)) < 0) // Creating UDP
socket
 { printf("Server: socket error: %d\n",errno); exit(0); }
printf("Server: binding my local socket\n");
memset((char *) &my_addr, 0, sizeof(my_addr)); // my addr 주소 0으로 초기화
my_addr.sin_family = AF_INET;
my_addr.sin_addr.s_addr = htonl(INADDR_ANY);
my_addr.sin_port = htons(atoi(argv[1]));
if ( (bind(sockid, (struct sockaddr *) &my_addr, // Bind UDP socket and
address
sizeof(my_addr)) < 0) )
{ printf("Server: bind fail: %d\n",errno); exit(0); }
printf("Server: starting blocking message read\n");
nread = recvfrom(sockid,msg,sizeof(msg),0, // Read data from client
(struct sockaddr *) &client_addr, ((socklen_t *)&addrlen); // 메시지를 누가 보냈나?
msg[nread] = '\0';
printf("Server: retrun code from read is %d\n",nread);
if (nread >0) printf("Server: message is: %s\n",msg);
close(sockid);
}

소켓 관련 함수

• recv, recvfrom, recvmsg - receive a message from a socket
 #include <sys/types.h>
 #include <sys/socket.h>
 ssize_t recv(int sockfd, void *buf, size_t len, int flags);
 ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
 struct sockaddr *src_addr, socklen_t *addrlen);
 ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags);

UDP 클라이언트

코드

int main(int argc, char *argv[])
{
 int sockid, retcode; // 소켓 디스크립터 , 리턴코드
 struct sockaddr_in my_addr, server_addr; // 내주소 , 서버주소
 char msg[128]; // 버퍼사이즈
 if(argc != 4) {
 printf("%s myport serveraddr serverport\n", argv[0]); // 내 주소, 서버주소, 서버포트넘버
 return 0;
 }
 printf("Client: creating socket\n");
 if ( (sockid = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
 { printf("Client: socket failed: %d\n",errno); exit(0); }
printf("Client: binding my local socket\n");
memset((char *) &my_addr, 0, sizeof(my_addr));
my_addr.sin_family = AF_INET;
my_addr.sin_addr.s_addr = htonl(INADDR_ANY);
my_addr.sin_port = htons(atoi(argv[1]));
if ( (bind(sockid, (struct sockaddr *) &my_addr, // Bind UDP socket and
address
sizeof(my_addr)) < 0) )
{ printf("Client: bind fail: %d\n",errno); exit(0); }
- 데이터 보냄
printf("Client: creating addr structure for server\n");
bzero((char *) &server_addr, sizeof(server_addr)); // memset이나 bzero로 초기화
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = inet_addr(argv[2]); // 2번째 파라미터로 숫자로된 스트링이 넘어옴. 
server_addr.sin_port = htons(atoi(argv[3]));
printf("Client: initializing message and sending\n");
sprintf(msg, "Hello world");
retcode = sendto(sockid,msg,strlen(msg),0,(struct sockaddr *) &server_addr,
sizeof(server_addr)); // Send message to, 서버의주소,크기 로 보내달라
server

소켓 관련 함수

send, sendto, sendmsg - send a message on a socket
#include <sys/types.h>
#include <sys/socket.h>
ssize_t send(int sockfd, const void buf, size_t len, int flags);
ssize_t sendto(int sockfd, const void
buf, size_t len, int flags,
const struct sockaddr dest_addr, socklen_t addrlen);
ssize_t sendmsg(int sockfd, const struct msghdr
msg, int flags);

0개의 댓글