728x90
클라이언트에서 입력값을 받아와 서버에 전달해준다(구조체)
servertcp.c
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define PORT 9999
typedef struct {
int a;
char b[10];
}Form;
// servertcp.c
int main(void){
int sock, client_sock;
struct sockaddr_in addr, client_addr;
int len, addr_len, recv_len;
Form form;
if((sock = socket(AF_INET, SOCK_STREAM, 0))<0) // UDP는 SOCK_STREAM -> SOCK_DGRAM
{
perror("socket ");
return 1;
}
memset(&addr, 0x00, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = htonl(INADDR_ANY); // 모든 IP에서 받을 수 있다.
addr.sin_port = htons(PORT);
if(bind(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0){
perror("bind ");
return 1;
}
if(listen(sock, 5) < 0) // udp랑 다른점 -> 접속연결 대기
{
perror("listen ");
return 1;
}
addr_len = sizeof(client_addr);
printf("waiting for client..\n");
while((client_sock = accept(sock, (struct sockaddr *)&client_addr, &addr_len)) > 0) // client 접속을 받아들임 -> 받고난후도 계속 돈다.
{
printf("client ip : %s\n", inet_ntoa(client_addr.sin_addr));
if((recv_len = recv(client_sock, &form, sizeof(form), 0)) < 0) // client의 접속을 허가하면 client로부터 받는다.
{
perror("recv ");
return 1;
break;
}
printf("received data : %d, %s\n", form.a, form.b);
send(client_sock, &form, sizeof(form), 0); // 보내주고 종료
close(client_sock);
}
close(sock);
return 0;
}
clienttcp.c
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define PORT 9999
typedef struct {
int a;
char b[10];
}Form;
// clienttcp.c
int main(int argc, char** argv){
int sock;
struct sockaddr_in addr;
int recv_len;
Form form;
if((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) // socket 생성
{
perror("socket ");
return 1;
}
memset(&addr, 0x00, sizeof(addr)); // 초기화
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr("127.0.0.1");
addr.sin_port = htons(PORT);
if(connect(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0){ // server에 접속
perror("connect ");
return 1;
}
form.a = argc;
memcpy(form.b, argv[1],sizeof(form.b));
if(send (sock, &form, sizeof(form), 0) < 0) // 연결수신 받으면 server로 send
{
perror("send ");
return 1;
}
if((recv_len = recv(sock, &form, sizeof(form), 0)) < 0) // server로부터 받는다.
{
perror("recv ");
return 1;
}
printf("recevied data : %d, %s\n", form.a, form.b);
close(sock);
return 0;
}
https://nroses-taek.tistory.com/88?category=744219
728x90
'개발 업무(코딩)-개발자였을때 썼던..' 카테고리의 다른 글
c언어 리눅스(linux) shared memory 간단 예제 (0) | 2023.01.08 |
---|---|
c언어 리눅스(linux) fork를 이용한 프로세스 생성 예제 (0) | 2023.01.08 |
쉘 스크립트(shell script) - 업뎃ing (0) | 2023.01.08 |
c언어 리눅스(linux) UDP 예제 (0) | 2023.01.08 |
c언어 파일입출력 중 읽기 (0) | 2023.01.08 |