네트워크

20140617 - 소켓 정보보내기(서버, 클라이언트)

Owen.K 2014. 6. 17. 17:23

소켓 정보보내기(서버, 클라이언트)


 

여기서 말하는 데이터를 문자열이다.

 

 

 

소켓 번호로 read를 했을 때 

 

저수준 입력을 사용 했을 때

 


server.c

#include <stdio.h>

#include <sys/types.h>

#include <sys/socket.h>

#include <arpa/inet.h>

#include <linux/types.h>

#include <netinet/in.h>

#include <errno.h>


int main()

{

     struct sockaddr_in stAddr;      //server addr

     struct sockaddr_in stClient1;

     int iSoc;                       //socket descripter

     int iCle1;

     int iRet;

     unsigned int uiSize;

     unsigned char ucBuff[250];

     iSoc = socket(AF_INET, SOCK_STREAM, 0);


     if(-1==iSoc)

     {

         perror("socket() ");

         return 0;

     }

     stAddr.sin_family = AF_INET;

     //소켓의 첫 번째 인자를 넣는다.

     stAddr.sin_port = htons(PORT);

     stAddr.sin_addr.s_addr = inet_addr("192.168.10.250");


     iRet=bind(iSoc, (struct sockaddr *)(&stAddr),sizeof(stAddr));

     if(-1==iRet)

     {

         perror("bind() ");

         close(iSoc);

         return 0;

     }


     iRet=listen(iSoc,5);

     if(-1==iRet)

     {

         perror("listen() ");

         close(iSoc);

         return 0;

     }


     uiSize=sizeof(stClient1);

     iCle1=accept(iSoc,(struct sockaddr *)(&stClient1),&uiSize);

 //클라이언트의 인적사항 조사 accept가 리턴되면 새로운 소켓을 생성한다.

     if(iCle1==-1)

     {

         perror("accept() ");

         close(iSoc);

         return 0;

     }


     printf("iSoc : %d\niRet : %d \n",iSoc, iRet);

     printf("iCle1 : %d\n",iCle1);

     write(iCle1,"welcome",7);


     iRet=read(iCle1,ucBuff,sizeof(ucBuff));

     ucBuff[iRet]=0;

     printf("%s\n",ucBuff);


     iRet=read(iCle1,ucBuff,sizeof(ucBuff));

     ucBuff[iRet]=0;

     printf("%s\n",ucBuff);


     close(iSoc);

     close(iCle1);

     return 0;

}                                                     


client.c

#include <stdio.h>

#include <sys/types.h>

#include <sys/socket.h>

#include <arpa/inet.h>

#include <linux/types.h>

#include <netinet/in.h>

#include <errno.h>


int main()

{

     struct          sockaddr_in stAddr;

     int             iSoc;

     int             iRet;

     unsigned char   ucBuff[250];

     iSoc = socket(AF_INET, SOCK_STREAM, 0);

     if(-1==iSoc)

     {

         perror("socket() ");

         return 0;

     }

     stAddr.sin_family = AF_INET;

     //소켓의 첫 번째 인자를 넣는다.

     stAddr.sin_port = htons(PORT);

     stAddr.sin_addr.s_addr = inet_addr("192.168.10.250");

     iRet=connect(iSoc, (struct sockaddr *)(&stAddr),sizeof(stAddr));

     if(-1==iRet)

     {

         perror("connect() ");   //나머지 에러 내용을 peeror이 출력해줌.

         close(iSoc);

         return 0;

     }

     printf("iSoc : %d\n iRet : %d \n",iSoc, iRet);

     iRet=read(iSoc,ucBuff,sizeof(ucBuff));

     //read함수는 받은 byte만큼 리턴해줌.


     ucBuff[iRet]=0;

     printf("%s\n",ucBuff);//받기


     write(iSoc,"shutup",6);


     iRet=read(1,ucBuff,sizeof(ucBuff));

     //1은 키보드 입력.

     write(iSoc,ucBuff,iRet-1);

     close(iSoc);
     return 0;
}





#include <stdio.h>

#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>

#define PORT	4090
#define BUFSIZE	1024

int main(int argc, char *argv[])
{
	int sockfd;
	struct sockaddr_in servAddr;
	char sendBuffer[BUFSIZE];
	char recvBuffer[BUFSIZE];
	int recvLen;

	if(argc!=2)
	{
		fprintf(stderr, "Usage:%s IP_address\n", argv[0]);
		exit(1);
	}	

	if((sockfd=socket(AF_INET, SOCK_STREAM, 0))== -1)
	{
		perror("sock failed");
		exit(1);
	}	
		
	memset(&servAddr, 0, sizeof(servAddr));

	servAddr.sin_family 		= AF_INET;
	servAddr.sin_addr.s_addr 	= inet_addr(argv[1]);
	servAddr.sin_port 			= htons(PORT);

	if(connect(sockfd, (struct sockaddr*)&servAddr, 
				sizeof(servAddr))== -1)
	{
		perror("connect failed");
		exit(1);
	}	

	while(1)
	{
		printf("Input sending message ==> ");
		fgets(sendBuffer, BUFSIZE, stdin);

		if(!strncmp(sendBuffer, "quit", 4))
		break;	

		if(send(sockfd, sendBuffer, 
					strlen(sendBuffer), 0)!=strlen(sendBuffer))
		{
			perror("send failed");
			exit(1);
		}	

		if((recvLen=recv(sockfd, recvBuffer,
						BUFSIZE-1, 0))<=0)
		{
			perror("recv failed");
			exit(1);
		}	

		recvBuffer[recvLen]='\0';

		printf("Received : %s\n",recvBuffer);
	}

	close(sockfd);
	exit(0);
	
	return 0;
}	




#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>

#define PORT 		4090
#define MAXPENDING 	5
#define BUFSIZE		1024

int main()
{
	int servSockfd;
	int clntSockfd;
	struct sockaddr_in servAddr;
	struct sockaddr_in clntAddr;
	char recvBuffer[BUFSIZE];
	int clntLen;
	int recvLen;

	if((servSockfd=socket(AF_INET, SOCK_STREAM, 0))== -1)
	{
		perror("sock failed");
		exit(1);
	}	

	memset(&servAddr, 0, sizeof(servAddr));

	servAddr.sin_family = AF_INET;
	servAddr.sin_addr.s_addr = htonl(INADDR_ANY);
	servAddr.sin_port = htons(PORT);

	if(bind(servSockfd, (struct sockaddr*)&servAddr, 
				sizeof(servAddr))==-1)
	{
		perror("bind failed");
		exit(1);
	}	
	
	if(listen(servSockfd, MAXPENDING)==-1)
	{
		perror("listen failed");
		exit(1);
	}	
	
	while(1)
	{
		clntLen = sizeof(clntAddr);

		if((clntSockfd=accept(servSockfd,(struct sockaddr*)&clntAddr,
						&clntLen))==-1)
		{
			perror("accept failed");
			exit(1);
		}	

		while(1)
		{
			if((recvLen=recv(clntSockfd, recvBuffer,
							BUFSIZE-1,0))== -1)
			{
				perror("recv failed");
				exit(1);
			}	
			if(recvLen==0)
				break;

			recvBuffer[recvLen]='\0';

			printf("Received : %s\n",recvBuffer);

			if(send(clntSockfd, recvBuffer,recvLen,0)!=recvLen)
			{
				perror("send failed");
				exit(1);
			}	
		}	

		close(clntSockfd);
	}
	return 0;
}