장석용의 TCP/IP 소켓 프로그래밍
이라는 책을 보고 네트워크 과제를 해볼거야!!
교재가 2009년에 만들어져서 그런지 교재 코드 그대로 실행하면 오류난다.
대부분 여러 라이브러리 함수들을 사용하기 위해 필요한 헤더 파일을 인클루드하지 않아서 나는 오류였다.
아래는 수정된 코드다!!
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <netinet/in.h>
#include <sys/socket.h>
#define PORT 9000
char buffer[BUFSIZ] = "hello, world";
int main() {
int c_socket, s_socket;
struct sockaddr_in s_addr, c_addr;
socklen_t len; // Changed the type of len variable
s_socket = socket(PF_INET, SOCK_STREAM, 0);
memset(&s_addr, 0, sizeof(s_addr));
s_addr.sin_addr.s_addr = htonl(INADDR_ANY);
s_addr.sin_family = AF_INET;
s_addr.sin_port = htons(PORT);
if (bind(s_socket, (struct sockaddr *)&s_addr, sizeof(s_addr)) == -1) {
printf("Can not Bind\n");
return -1;
}
if (listen(s_socket, 5) == -1) {
printf("listen Fail\n");
return -1;
}
while (1) {
len = sizeof(c_addr);
c_socket = accept(s_socket, (struct sockaddr *)&c_addr, &len); // Passing &len with correct type
int n = strlen(buffer);
write(c_socket, buffer, n);
close(c_socket);
}
close(s_socket);
return 0;
}
#include <netinet/in.h>
#include <sys/socket.h>
#include <string.h>
#include <arpa/inet.h>
#include <unistd.h>
#define PORT 9000
#define IPADDR "127.0.0.1"
int main() {
int c_socket;
struct sockaddr_in c_addr;
int len;
int n;
char rcvBuffer[BUFSIZ];
c_socket = socket(PF_INET, SOCK_STREAM, 0);
memset(&c_addr, 0, sizeof(c_addr));
c_addr.sin_addr.s_addr = inet_addr(IPADDR);
c_addr.sin_family = AF_INET;
c_addr.sin_port = htons(PORT);
if(connect(c_socket, (struct sockaddr *) &c_addr, sizeof(c_addr)) == -1) {
printf("Can not connect\n");
close(c_socket);
return -1;
}
if((n = read(c_socket, rcvBuffer, sizeof(rcvBuffer))) < 0) {
return (-1);
}
rcvBuffer[n] = '\0';
printf("received Data : %s\n", rcvBuffer);
close(c_socket);
return 0;
}
gcc -o hello_server hello_server.c ./hello_server
이렇게 서버를 실행시키고
gcc -o hello_client hello_client.c ./hello_client
이렇게 클라이언트에서도 실행하면 서버측에서 전송한 문자열 hello, world 데이터를 받을 수 있다!!
<과정>
1. 연결 요청 (client -> server)
2. print 요청 (client -> server 로 print 전송)
3. 문자열 전송 (server -> client)
4. 화면 출력
#include <netinet/in.h>
#include <sys/socket.h>
#include <string.h>
#include <unistd.h>
#define PORT 9000
#define BUFSIZE 1024
char buffer[BUFSIZE] = "hello, world";
int main() {
int c_socket, s_socket;
struct sockaddr_in s_addr, c_addr;
int len;
int n;
s_socket = socket(PF_INET, SOCK_STREAM, 0);
memset(&s_addr, 0, sizeof(s_addr));
s_addr.sin_addr.s_addr = htonl(INADDR_ANY);
s_addr.sin_family = AF_INET;
s_addr.sin_port = htons(PORT);
if (bind(s_socket, (struct sockaddr *)&s_addr, sizeof(s_addr)) == -1) {
printf("Can not Bind\n");
return -1;
}
if (listen(s_socket, 5) == -1) {
printf("listen Fail\n");
return -1;
}
while (1) {
len = sizeof(c_addr);
c_socket = accept(s_socket, (struct sockaddr *)&c_addr, &len);
char rBuffer[BUFSIZE];
int length = 0;
char *temp = rBuffer;
while ((n = read(c_socket, temp, 1)) > 0) {
if (*temp == '\r') continue;
if (*temp == '\n') break;
if (*temp == '\0') break;
if (length == BUFSIZE) break;
temp++;
length++;
}
rBuffer[length] = '\0';
if (!strcmp(rBuffer, "print")) {
n = strlen(buffer);
write(c_socket, buffer, n);
}
close(c_socket);
}
close(s_socket);
return 0;
}
#include <netinet/in.h>
#include <sys/socket.h>
#include <string.h>
#include <arpa/inet.h>
#include <unistd.h>
#define PORT 9000
#define IPADDR "127.0.0.1"
char buffer[BUFSIZ];
int main() {
int c_socket;
struct sockaddr_in c_addr;
int len;
char rcvBuffer[BUFSIZ];
int n;
c_socket = socket(PF_INET, SOCK_STREAM, 0);
memset(&c_addr, 0, sizeof(c_addr));
c_addr.sin_addr.s_addr = inet_addr(IPADDR);
c_addr.sin_family = AF_INET;
c_addr.sin_port = htons(PORT);
if (connect(c_socket, (struct sockaddr *)&c_addr, sizeof(c_addr)) == -1) {
printf("Can not connect\n");
close(c_socket);
return -1;
}
printf("Enter a message: ");
scanf("%s", buffer);
buffer[sizeof(buffer) - 1] = '\0'; // Ensure null-termination and prevent buffer overflow
write(c_socket, buffer, strlen(buffer) + 1);
if ((n = read(c_socket, rcvBuffer, sizeof(rcvBuffer))) < 0) {
return -1;
}
rcvBuffer[n] = '\0';
printf("received Data : %s\n", rcvBuffer);
close(c_socket);
return 0;
}