C\#Socket 프로 그래 밍 노트

10121 단어 C#Socket
이 문 제 를 보 니 낯 이 익 지 않 습 니까?블 로그 원 에서 찾 아 보면 이 동 동 에 관 한 글 이 너무 많아 요~~정말 쓸 필요 가 없어 요.그리고 저도 글 귀 를 다 듬 기 가 좀 귀 찮 습 니 다.이것 을 보면 반드시 전환 이 있어 야 한다.그렇지 않 으 면 다음 글 이 보이 지 않 을 것 이다.그렇지 않 니?)그러나 다음 글 을 참고 하기 위해 서 는 socket 기초 지식 을 먼저 보충 할 필요 가 있다.
주의:만약 당신 이 이미 socket 을 접촉 한 적 이 있다 면,시간 을 지체 해서 볼 필요 가 없습니다.또 그 중 어떤 잘못 도 발견 되면 직접 지적 하 는 것 을 환영한다.
1.관례 에 따라 먼저 socket 소개
윈도 우즈 의 많은 것들 이 유 닉 스 분야 에서 참고 한 것 이 고 소켓 도 마찬가지다.유 닉 스에 서 socket 은 파일 설명 자 를 대표 합 니 다.(유 닉 스에 서 는 모든 것 이 파일 단위 입 니 다.)이 설명 자 는 네트워크 접근 을 설명 하 는 데 사 용 됩 니 다.무슨 뜻 이 죠?프로그래머 가 socket 을 통 해 네트워크 의 데 이 터 를 보 내 고 받 을 수 있다 는 것 이다.너 도 API 라 고 이해 할 수 있다.그것 이 있 으 면 너 는 직접 네트워크 카드 를 조작 하지 않 고 이 인 터 페 이 스 를 통 해 복잡 한 조작 을 많이 절약 할 수 있다.
C\#에서 MS 는 우리 에 게 System.Net.Sockets 네 임 스페이스 를 제공 합 니 다.그 안에 Socket 류 가 포함 되 어 있 습 니 다.
2.socket 이 있 으 면 인터넷 에 접근 할 수 있 습 니 다.
그러나 너무 일찍 기뻐 하지 마 세 요.네트워크 에 접근 하려 면 기본 적 인 조건 이 있어 야 합 니 다.b.합의 가 있어 야 지.복잡 한 것 을 원한 다 면 우 리 는 스스로 협 의 를 정할 수 있다.하지만 이 건 이 편 에서 언급 하지 않 겠 습 니 다.여러분 이 가장 잘 아 시 는 두 가지 협 의 를 소개 하 겠 습 니 다.TCP&UDP.(네가 모른다 고 말 하지 마라,그렇지 않 으 면...그렇지 않 으 면...나 는 너 에 게 말 하지 않 을 것 이다)
기본 적 인 조건 이 갖 춰 지면 인터넷 에 접근 할 수 있다.절 차 를 살 펴 보 자.
a.소켓 만 들 기
b.본 컴퓨터 의 IP 와 포트 를 연결 합 니 다.
c.TCP 라면 연결 을 위 한 것 이기 때문에 ListenO()방법 으로 인터넷 에서 누군가가 자신 에 게 물건 을 보 냈 는 지 감청 해 야 한다.UDP 라면 연결 이 없 기 때문에 오 는 사람 은 거부 하지 않 는 다.
d.TCP 의 경우 연결 을 감청 하면 accept 를 사용 하여 이 연결 을 받 은 다음 에 Send/Receive 를 이용 하여 작업 을 수행 할 수 있 습 니 다.UDP 는 accept 가 필요 없 이 SendTo/ReceiveFrom 를 사용 하여 작업 을 수행 합 니 다.(잘 보 세 요.TCP 의 실행 방법 과 차이 가 있 습 니 다.UDP 는 연결 을 만 들 필요 가 없 기 때문에 보 내기 전에 상대방 의 IP 와 포트 를 모 르 기 때문에 보 낸 노드 를 지정 해 야 정상적으로 보 내 고 받 을 수 있 습 니 다)
e.계속 보 내 고 받 지 않 으 려 면 자원 을 낭비 하지 마 세 요.닫 을 수 있 는 건 닫 아.
위의 글 자 를 보고 도 잘 모 르 면 그림 을 보 세 요.

연결 을 위 한 소켓 시스템 호출 순서

연결 되 지 않 은 소켓 시스템 호출 순서
3.두 드 리 기 시작~~코드(간단 한 코드)
일단 저희 가 연결 을 위 한...
TCPServer

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

namespace tcpserver
 {
   /// <summary>
   /// Class1      。
  /// </summary>
  class server
   {
     /// <summary>
     ///          。
    /// </summary>
    [STAThread]
     static void Main(string[] args)
     {
       //
       // TODO:               
      //
      int recv;//              
      byte[] data=new byte[1024];//             ,  socket            
      IPEndPoint ipep=new IPEndPoint(IPAddress.Any,9050);//      IP   
      Socket newsock=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
       newsock.Bind(ipep);//  
      newsock.Listen(10);//  
      Console.WriteLine("waiting for a client");
       Socket client=newsock.Accept();//               ,       socket,           
      IPEndPoint clientip=(IPEndPoint)client.RemoteEndPoint;
       Console.WriteLine("connect with client:"+clientip.Address+" at port:"+clientip.Port);
       string welcome="welcome here!";
       data=Encoding.ASCII.GetBytes(welcome);
       client.Send(data,data.Length,SocketFlags.None);//    
      while(true)
       {//                
        data=new byte[1024];
         recv=client.Receive(data);
         Console.WriteLine("recv="+recv);
         if (recv==0)//      0,         
          break;
         Console.WriteLine(Encoding.ASCII.GetString(data,0,recv));
         client.Send(data,recv,SocketFlags.None);
       }
       Console.WriteLine("Disconnected from"+clientip.Address);
       client.Close();
       newsock.Close();

     }
   }
 }

 TCPClient

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

namespace tcpclient
 {
   /// <summary>
   /// Class1      。
  /// </summary>
  class client
   {
     /// <summary>
     ///          。
    /// </summary>
    [STAThread]
     static void Main(string[] args)
     {
       //
       // TODO:               
      //
      byte[] data=new byte[1024];
       Socket newclient=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
       Console.Write("please input the server ip:");
       string ipadd=Console.ReadLine();
       Console.WriteLine();
       Console.Write("please input the server port:");
       int port=Convert.ToInt32(Console.ReadLine());
       IPEndPoint ie=new IPEndPoint(IPAddress.Parse(ipadd),port);//    IP   
      try
       {
         //                    ,          IP   。     。
        newclient.Connect(ie);
       }
       catch(SocketException e)
       {
         Console.WriteLine("unable to connect to server");
         Console.WriteLine(e.ToString());
         return;
       }
       int recv = newclient.Receive(data);
       string stringdata=Encoding.ASCII.GetString(data,0,recv);
       Console.WriteLine(stringdata);
       while(true)
       {
         string input=Console.ReadLine();
         if(input=="exit")
           break;
         newclient.Send(Encoding.ASCII.GetBytes(input));
         data=new byte[1024];
         recv=newclient.Receive(data);
         stringdata=Encoding.ASCII.GetString(data,0,recv);
         Console.WriteLine(stringdata);
       }
       Console.WriteLine("disconnect from sercer");
       newclient.Shutdown(SocketShutdown.Both);
       newclient.Close();

     }
   }
 }

다음은 연결 되 지 않 은 것 을 드 리 겠 습 니 다.
UDPServer

using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.Sockets;
namespace SimpleUdpSrvr
 {
   class Program
   {
     static void Main(string[] args)
     {
       int recv;
       byte[] data = new byte[1024];
       IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 9050);//       
      Socket newsock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);//    Socket
      newsock.Bind(ipep);//Socket            
      Console.WriteLine("Waiting for a client..");

       IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);//            
      EndPoint Remote = (EndPoint)(sender);//
      recv = newsock.ReceiveFrom(data, ref Remote);//          
      Console.WriteLine("Message received from{0}:", Remote.ToString());
       Console.WriteLine(Encoding.ASCII.GetBytes(data,0,recv));

       string welcome = "Welcome to my test server!";
       data = Encoding.ASCII.GetBytes(welcome);
       newsock.SendTo(data, data.Length, SocketFlags.None, Remote);
       while (true)
       {
         data = new byte[1024];
         recv = newsock.ReceiveFrom(data, ref Remote);
         Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv));
         newsock.SendTo(data, recv, SocketFlags.None, Remote);
       }
     }
   }
 }

UDPClient

using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.Sockets;
namespace SimpleUdpClient
 {
   class Program
   {
     static void Main(string[] args)
     {
       byte[] data = new byte[1024];//               
      string input, stringData;
       IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9050);
       Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
       string welcome = "Hello,are you there?";
       data = Encoding.ASCII.GetBytes(welcome);
       server.SendTo(data, data.Length, SocketFlags.None, ipep);//            

      IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
       EndPoint Remote = (EndPoint)sender;
       data = new byte[1024];
       int recv = server.ReceiveFrom(data, ref Remote);//          

      Console.WriteLine("Message received from{0}:", Remote.ToString());
       Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv));
       while (true)//    
      {
         input = Console.ReadLine();//       
        if (input == "text")//    
        {
           break;
         }
         server.SendTo(Encoding.ASCII.GetBytes(input), Remote);//            Remote
        data = new byte[1024];
         recv = server.ReceiveFrom(data, ref Remote);// Remote    
        stringData = Encoding.ASCII.GetString(data, 0, recv);
         Console.WriteLine(stringData);
       }
       Console.WriteLine("Stopping client");
       server.Close();
     }
   }
 }   

위의 예 는 socket 을 간단하게 응용 하여 통신 을 실현 할 뿐 이 고 비동기 socket,IP 그룹 방송 등 을 실현 할 수 있 습 니 다.
MS 는 또한 우리 에 게 몇 가지 조수 류 를 제공 했다.TcpClient 류,TcpListener 류,UDP Client 류.이 몇 가지 종 류 는 조작 을 간소화 하 였 기 때문에 너 도 이 몇 가지 종 류 를 이용 하여 위의 코드 를 쓸 수 있 지만,나 는 개인 적 으로 소켓 으로 직접 쓰 는 것 이 비교적 습관 이 되 었 다.
다 쓴 이상 몇 마디 더 하 겠 습 니 다.실시 간 응답 이 필요 한 소프트웨어 에서 저 는 개인 적 으로 UDP 를 사용 하여 통신 을 실현 하 는 경향 이 있 습 니 다.왜냐하면 TCP 에 비해 UDP 는 더 적은 자원 을 차지 하고 응답 속도 가 빠 르 며 지연 시간 이 낮 기 때 문 입 니 다.UDP 의 신뢰성 은 응용 층 에서 통 제 를 통 해 만족 시 킬 수 있다.물론 신뢰성 요구 가 높 은 환경 에 서 는 TCP 를 사용 하 는 것 을 권장 합 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기