2. Linux 네트워크 프로그래밍 - socket 함수 및 C2S 구현

1. TCP 클라이언트/서버 모델 TCP 서버: socket () – >bind () – >listen () – >accept () – >block – 클라이언트 연결이 도착할 때--->read () – > 처리 요청 – >write () -->read () – >close ()
TCP 클라이언트: socket()->connect()->write()--->read()-->close()
2. 고객/서버가 고객이 보낸 정보를 반송한다.
3.socket 함수는 헤더 파일 기능을 포함합니다: 통신에 사용할 플러그인을 만듭니다.원형: int socket(int domain, int type, int protocol);매개 변수:domain: 통신 프로토콜족 (protocolfamily) 지정;type: socket 유형 지정, 스트림 소켓 SOCK_STREAM, 데이터 메시징 소켓 SOCK_DGRAM, 원본 소켓 SOCK_RAW; 프로토콜: 프로토콜 형식;반환값: 비음정수를 성공적으로 반환했습니다. 이것은 파일 설명자와 유사합니다. 우리는 그것을 인터페이스 설명자, 약칭 플러그인이라고 부릅니다.실패 반환-1;
4.bind 함수는 헤더 파일 기능을 포함합니다: 로컬 주소를 플러그인에 연결합니다.원형: intbind(intsockfd,conststructsockaddr*addr,socklenutaddrlen);매개 변수:sockfd:socket 함수가 되돌아오는 플러그인;addr: 연결할 주소;addrlen: 주소 길이;반환값: 0 반환 성공, 실패 반환-1;
5.listen 함수는 헤더 파일 기능을 포함합니다. 플러그인을 들어오는 연결을 감청하는 데 사용합니다.원형: int listen(int sockfd, int backlog);매개 변수:sockfd:socket 함수가 되돌아오는 플러그인;backlog: 이 플러그인에 대한 최대 연결 개수를 설정합니다.반환값: 0 반환 성공, 실패 반환-1;
6. accept 함수는 헤더 파일 기능을 포함합니다. 연결 대기열에서 첫 번째 연결을 되돌려줍니다. 연결 대기열이 비어 있으면 막습니다.원형: int accept(int sockfd,const struct sockaddr *addr,socklenut addrlen);매개 변수:sockfd:socket 함수가 되돌아오는 플러그인;addr: 연결할 주소;addrlen: 주소 길이;반환값: 비음정수를 성공적으로 반환하고 실패를 반환-1;
7.write 함수에 헤더 파일 포함
8.read 함수에 헤더 파일 포함
/*server side:begin

#include 
#include 
#include  
#include   
#include 
#include 
#include 
#include 
#include 
#include 

using namespace std;

#define ERR_EXIT(m) do{ perror(m); exit(EXIT_FAILURE);}while(0)

int main()
{	
	int sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	if(sockfd<0)
		ERR_EXIT("socket");
	struct sockaddr_in servaddr;
	memset(&servaddr, 0, sizeof(servaddr));
	servaddr.sin_family = AF_INET;
	servaddr.sin_port = htons(5188);
	//servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
	servaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
	//inet_aton("127.0.0.1", &servaddr.sin_addr);
	
	if(bind(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)))
		ERR_EXIT("bind");
	
	int listenfd = listen(sockfd, SOMAXCONN);
	if(listenfd<0)
		ERR_EXIT("listen");
	
	struct sockaddr_in peeraddr;
	socklen_t peerlen = sizeof(peeraddr);
	int conn = accept(sockfd, (struct sockaddr*)&peeraddr, &peerlen);
	if(conn<0)
		ERR_EXIT("accept");
	
	char recvbuf[1024];
	while(1)
	{
		memset(recvbuf, 0, sizeof(recvbuf));
		int ret = read(conn, recvbuf, sizeof(recvbuf));
		fputs(recvbuf, stdout);
		write(conn, recvbuf, ret);
	}
	close(conn);
	close(sockfd);
	return 0;
}
server side:end*/


/*client side:begin

#include 
#include 
#include  
#include   
#include 
#include 
#include 
#include 
#include 
#include 

using namespace std;

#define ERR_EXIT(m) do{ perror(m); exit(EXIT_FAILURE);}while(0)

int main()
{	
	int sockfd;
	if((sockfd=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP))<0)
		ERR_EXIT("socket");
	struct sockaddr_in servaddr;
	memset(&servaddr, 0, sizeof(servaddr));
	servaddr.sin_family = AF_INET;
	servaddr.sin_port = htons(5188);
	servaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
	//inet_aton("127.0.0.1", &servaddr.sin_addr);
	
	if(connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr))<0)
		ERR_EXIT("connect");
	char sendbuf[1024] = {0};
	char recvbuf[1024] = {0};
	while(fgets(sendbuf, sizeof(sendbuf), stdin) != NULL)
	{
		write(sockfd, sendbuf, strlen(sendbuf));
		read(sockfd, recvbuf, sizeof(recvbuf));
		fputs(recvbuf, stdout);
		memset(&sendbuf, 0, sizeof(sendbuf));
		memset(&recvbuf, 0, sizeof(recvbuf));
	}
	close(sockfd);
	return 0;
}

client side:end*/

좋은 웹페이지 즐겨찾기