본문 바로가기
[ Program ]/C#

C# 네트워크

by 관이119 2012. 9. 17.
출처 clean code that works | 아메
원문 http://blog.naver.com/pyrisind/60032485377
출처 : 영진닷컴, C# .NET 프로그래밍 실전프로젝트 
// 데이터 전송
private void SendData(byte[] data)
{			
	try
	{		 
		int total = 0;
		int size = data.Length;
		int left_data = size ;
		int send_data = 0;

		// 전송할 실제 데이터의 크기 전달
		byte [] data_size =new byte[4];
		data_size = BitConverter.GetBytes(size);
		send_data = this.client.Send(data_size);			
				
		// 실제 데이터 전송
		while(total < size)
		{  
			send_data  = this.client.Send(data, total, left_data, SocketFlags.None);
			total     += send_data;
			left_data -= send_data;
		}
	}
	catch(Exception ex)
	{
		MessageBox.Show(ex.Message);
	}
}

// 데이터 수신
private byte[] ReceiveData()
{
	try
	{
		int total = 0;
		int size = 0;
		int left_data = 0;
		int recv_data = 0;

  		// 수신할 데이터 크기 알아내기   
		byte[] data_size = new byte[4];  
		recv_data = this.client.Receive(data_size, 0, 4, SocketFlags.None);
		size = BitConverter.ToInt32(data_size, 0);
		left_data = size ;

		byte [] data = new byte[size];
		// 서버에서 전송한 실제 데이터 수신
		while(total < size)
		{
			recv_data = this.client.Receive(data, total, left_data, 0);
			if(recv_data == 0) break;
			total     += recv_data ;
			left_data -= recv_data;
		}
		return data;
	}
	catch(Exception ex)
	{
		MessageBox.Show(ex.Message);
		return null;
	}
}
 
위의 소스처럼 먼저 전송할 데이터의 크기를 알려준다. 
read, write 함수를 (C에서) 사용할때 늘 버퍼의 크기를 전달해 줬었다. 같은 맥락이다. 
아쉽게도 만들때 없어서.. 
( 나중에 안거지만 byte형으로 어케 넘기는 녀석이 있다. C에서 쓰던 read/write랑 비슷하더라. )
 
책에선 이방법을 권장하고 있다. 테스트 결과 잘돌아 간다. 
다만.. 단점이 있다면 좀 귀찮다. 이래저래 쓸것도 많고.., 뒤에 나올 스트림을 이용해보자. 
문자열은 정말 쉽게 보내고 받고 한다. 그러나, 문자열 이외의 것을 이용할때는 그냥.., Socket을 이용하도록 하자. 
그게 확장성 면에서 더 나은 결과를 가져올것이다. 
 
 
위의 소스처럼 먼저 전송할 데이터의 크기를 알려준다. 
read, write 함수를 (C에서) 사용할때 늘 버퍼의 크기를 전달해 줬었다. 같은 맥락이다. 
아쉽게도 만들때 없어서.. 
( 나중에 안거지만 byte형으로 어케 넘기는 녀석이 있다. C에서 쓰던 read/write랑 비슷하더라. )
 
책에선 이방법을 권장하고 있다. 테스트 결과 잘돌아 간다. 
다만.. 단점이 있다면 좀 귀찮다. 이래저래 쓸것도 많고.., 뒤에 나올 스트림을 이용해보자. 
문자열은 정말 쉽게 보내고 받고 한다. 그러나, 문자열 이외의 것을 이용할때는 그냥.., Socket을 이용하도록 하자. 
그게 확장성 면에서 더 나은 결과를 가져올것이다. 

댓글