유닉스 네트워크 프로그래밍의 소켓 프로그래밍

2502 단어 인터넷
이 프로그램은 클라이언트가 서버에 문자열을 보내면 서버가 받은 문자열을 클라이언트에게 되돌려줍니다.
// unp.h
#ifndef _UNP_H
#define _UNP_H

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

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

#endif
다음은 클라이언트 코드입니다.
#include "unp.h"

int main()
{
	int sockfd;
	char sendbuff[MAXLINE];
	struct sockaddr_in servaddr;
	ssize_t n;
	
	if( (sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
		ERR_EXIT("socket err");
	
	memset(&servaddr, 0, sizeof(servaddr));
	servaddr.sin_family = AF_INET;
	servaddr.sin_port = htons(6666);
	servaddr.sin_addr.s_addr = inet_addr("127.0.0.1");

	if(connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0)
		ERR_EXIT("connect err");
	
	for(; ;){
		fgets(sendbuff, MAXLINE, stdin);
		if( (n = write(sockfd, sendbuff, strlen(sendbuff))) < 0)
			ERR_EXIT("write err");
		memset(sendbuff, 0 ,sizeof(sendbuff));
		
		if( (n = read(sockfd, sendbuff, sizeof(sendbuff))) < 0)
			ERR_EXIT("read err");
		fputs(sendbuff, stdout);
		memset(sendbuff, 0, sizeof(sendbuff));
	}

	close(sockfd);
}
다음은 서버 코드입니다.
#include "unp.h"

int main()
{
	int listenfd, connfd;
	struct sockaddr_in servaddr;
	char recvbuff[MAXLINE];
	ssize_t n;

	if( (listenfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
		ERR_EXIT("socket err");

	memset(&servaddr, 0, sizeof(servaddr));
	servaddr.sin_family = AF_INET;
	servaddr.sin_port = htons(6666);
	servaddr.sin_addr.s_addr = INADDR_ANY;
	
	if(bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0)
		ERR_EXIT("bind err");

	if(listen(listenfd, SOMAXCONN) < 0)
		ERR_EXIT("listen err");

	if( (connfd = accept(listenfd, (struct sockaddr*)NULL, NULL)) < 0)
		ERR_EXIT("accept err");
	
	for(; ;){
		if( (n = read(connfd, recvbuff, sizeof(recvbuff))) < 0)
			ERR_EXIT("read err");
		recvbuff[n] = '\0';
		fputs(recvbuff, stdout);
		
		if( (n = write(connfd, recvbuff, strlen(recvbuff))) < 0)
			ERR_EXIT("write err");
		memset(recvbuff, 0, sizeof(recvbuff));
	}

	close(connfd);
	close(listenfd);

	return 0;
}

좋은 웹페이지 즐겨찾기