소켓 통신의 다음과 같은 형식으로 이루어진다.
서버와 클라이언트 측 두 소켓을 생성해주고 bind를 통해 포트번호와 IP를 설정해준다. 그 후 클라이언트는 서버측의 연결을 요청하고 서버는 수락하여 송수신이 이루어지도록 한다.
서버와 클라이언트를 연결시킨 다음, 서버에서 클라이언트로 자신의 학번과 이름을 전송하는 프로그램을 작성하여보자.
Server
//
// Server.c
// socket
//
// Created by Jho on 2020/03/24.
// Copyright © 2020 。 All rights reserved.
//
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/file.h>
#include <fcntl.h>
#include <netinet/in.h>
#include <sys/socket.h>
void ErrorHandling(char* message);
int main()
{
int hServSock, hClntSock;
socklen_t szClntAddr;
struct sockaddr_in servAddr,clntAddr;
char message[]="2014097081 조윤상\n";
hServSock=socket(PF_INET, SOCK_STREAM, 0);//소켓 개통
if(hServSock<0)
ErrorHandling("socket() error");
memset(&servAddr, 0, sizeof(servAddr));
servAddr.sin_family=AF_INET;
servAddr.sin_addr.s_addr=htonl(INADDR_ANY);//IP주소 리드
servAddr.sin_port=htons(35124); //포트 번호
if(bind(hServSock, (struct sockaddr*) &servAddr, sizeof(servAddr))<0) //주소 할당
ErrorHandling("bind() error");
if(listen(hServSock, 5)<0) //대기 큐 5개
ErrorHandling("listen() error");
szClntAddr=sizeof(struct sockaddr_in);
hClntSock=accept(hServSock, (struct sockaddr*)&clntAddr, &szClntAddr); //연결수락
if(hClntSock<0)
ErrorHandling("accept() error");
send(hClntSock, message, sizeof(message), 0); //메세지 보냄
return 0;
}
void ErrorHandling(char* message)
{
fputs(message, stderr);
fputc('\n', stderr);
exit(1);
}
Client
//
// client.c
// socket
//
// Created by Jho on 2020/03/24.
// Copyright © 2020 COMP420. All rights reserved.
//
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/file.h>
#include <arpa/inet.h>
#include <fcntl.h>
#include <netinet/in.h>
#include <sys/socket.h>
void ErrorHandling(char* message);
int main(int argc, char* argv[])
{
int hSocket;
struct sockaddr_in serveraddr;
char message[30];
int strLen=0;
int idx=0, readLen=0;
if(argc!=3)
{
printf("Usage : %s <IP> <port>\n", argv[0]);
exit(1);
}
hSocket=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); //소켓 개통
if(hSocket<0)
ErrorHandling("hSocket() error");
memset(&serveraddr, 0, sizeof(serveraddr));
serveraddr.sin_family=AF_INET;
serveraddr.sin_addr.s_addr = inet_addr(argv[1]); //주소할당
serveraddr.sin_port=htons(atoi(argv[2])); //포트할당
if(connect(hSocket, (struct sockaddr*)&serveraddr, sizeof(serveraddr)) < 0)
ErrorHandling("connect() error!");
while((readLen=recv(hSocket, &message[idx++], 1, 0))) //메세지 읽어옴
{
if(readLen==-1) // 출력
ErrorHandling("read() error!");
strLen+=readLen;
}
printf("Message from server: %s \n", message);
printf("Function read call count: %d \n", strLen);
return 0;
}
void ErrorHandling(char* message)
{
fputs(message, stderr);
fputc('\n', stderr);
exit(1);
}
실행결과