Linux Socket - dongyeoplee87/DYLee GitHub Wiki
- Serverμμ
struct sockaddr_inνμ©νμ¬ bind(...) μ€ν - Clientμμ
struct sockaddr_inνμ©νμ¬ sendto(...) μ€ν - Serverμμ
recvfrom(...)μ€ννμ¬ data read
Server.cpp
#include <iostream>
#include <sys/socket.h>
#include <string.h>
#include <arpa/inet.h>
int main() {
printf("START TEST SERVER\n");
int sockfd = socket(AF_INET, SOCK_DGRAM, 0); // SOCK_DGRAM : UDP
if (sockfd < 0)
printf("ERROR opening socket\n");
int optval = 1;
if(setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (const void *)&optval , sizeof(int)) == -1) {
printf("ERROR setsockopt\n");
}
struct sockaddr_in serveraddr;
unsigned short portno = 32500;
memset((char *) &serveraddr, 0x00, sizeof(serveraddr));
serveraddr.sin_family = AF_INET;
serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);
serveraddr.sin_port = htons(portno);
if (bind(sockfd, (struct sockaddr *) &serveraddr, sizeof(serveraddr)) < 0)
printf("ERROR on binding\n");
struct sockaddr_in clientaddr;
socklen_t clientlen = sizeof(clientaddr);
char buf[100000];
while (1) {
printf("[%s] Wait data from Client(PORT : %d)\n", __FUNCTION__, portno);
memset(buf, 0x00, sizeof(buf));
int n = recvfrom(sockfd, buf, sizeof(buf), 0, (struct sockaddr *) &clientaddr, &clientlen);
if (n < 0)
printf("ERROR in recvfrom\n");
printf("GET MESSAGE from fd:%d, port:%d ip:%lu : %.20s\n", sockfd, clientaddr.sin_port, clientaddr.sin_addr.s_addr, buf);
}
}Client.cpp
#include <iostream>
#include <fstream>
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#define TESTMSG_LENGTH 1000
int main() {
int sockfd;
struct sockaddr_in serv;
char buffer[TESTMSG_LENGTH] = {0,};
pid_t pid = fork();
sockfd = socket(AF_INET,SOCK_DGRAM,0);
serv.sin_family = AF_INET;
serv.sin_port = htons(32500);
serv.sin_addr.s_addr = inet_addr("127.0.0.1");
socklen_t m = sizeof(serv);
if (pid == 0) { // child process
printf("this is child process. FD:%d\n", sockfd);
memset(buffer,'-',sizeof(buffer));
} else if (pid > 0) {
printf("this is parent process. FD:%d\n", sockfd);
memset(buffer,'+',sizeof(buffer));
} else {
printf("fork FAIL\n");
close(sockfd);
return 0;
}
for(int i=0;i<10;i++) {
sendto(sockfd, buffer, strlen(buffer), 0, (struct sockaddr *)&serv, m);
if (pid > 0)
usleep(1); // make race condition
}
close(sockfd);
return 0;
}