네트워크
중간 과제) socket 프로그래밍
gaelim
2021. 5. 15. 01:02
반응형
한양대 이석복 교수님의 커리큘럼에 따라 중간고사 시기에 맞추어 중간 과제를 수행하여 포스트한다.
중간고사 까지의 내용 정리 포스트는 이전에 업로드된 포스트들로 대체하며 별도의 추가 포스트는 하지 않음.
Layer : App (2주) - Transport (3주) 중간고사 - Network - Link - Physical ...
출처: https://ingyeoking13.tistory.com/266 [welcome!]
````
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <arpa/inet.h>
#include <signal.h>
#define PORT 3003
#define BACKLOG 10 /* how many pending connection queue will hold */
void cleanExit(int o){ exit(0); };
int main()
{
signal(SIGTERM, cleanExit);
signal(SIGINT, cleanExit);
int sockfd, newfd; /* listen on sockfd, new connection on newfd */
struct sockaddr_in serverAddr; /* my addr */
struct sockaddr_in clientAddr; /* client addr */
// socket()
if ((sockfd = socket(PF_INET, SOCK_STREAM, 0))== -1)
{
perror("socket");
exit(1);
}
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(PORT);
/* INADDR_ANY allows clients to connect to any one of the host's IP address */
serverAddr.sin_addr.s_addr = htonl(INADDR_ANY);
// bind()
if (bind(sockfd, (struct sockaddr *)&serverAddr, sizeof(struct sockaddr)) == -1)
{
perror("bind");
exit(1);
};
if (listen(sockfd, BACKLOG) == -1)
{
perror("listen");
exit(1);
}
while(1)
{
socklen_t sz = sizeof(struct sockaddr_in);
if ((newfd = accept(sockfd, (struct sockaddr*)&clientAddr, &sz)) ==-1)
{
perror("accept");
continue;
}
printf("server: got connection from %s\n", inet_ntoa(clientAddr.sin_addr));
const char *header = "HTTP/1.0 200 OK\r\n\r\nHELLO";
char readbuf[10000];
int n;
while((n=read(newfd, readbuf, sizeof(readbuf))) > 0)
{
printf("reading.... : %d\n", n);
if (readbuf[n-1]=='\n') break;
memset(readbuf, 0, sizeof(readbuf));
};
printf("server: got read from %s\n", inet_ntoa(clientAddr.sin_addr));
printf("data:%s\n", readbuf);
write(newfd, header, strlen(header));
close(newfd);
printf("closed\n");
}
}
반응형