묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨C# TCP/IP 소켓 프로그래밍
22:38 메세지 박스가 안뜨는 문제
실습을 진행하다 22:38에 떠야하는 메시지 박스가 안뜨는 문제가 발생하여 글 남깁니다.디버깅을 통해서 알 수 있는 사실은 정상적으로 서버에서 SendAsync 한 데이터를 클라이언트 Singleton의 ReceiveAsync 메서드에서 받는다는 사실입니다. ( 스레드 풀의 작업자 스레드가 응답받습니다. )하지만, LoginForm의 주 스레드와 작업자 스레드는 병렬적으로 실행되며 LoginForm의 roomList.ShowDialog()가 호출되는 순간 ReceiveAsync 를 실행하던 작업자 스레드가 중단됩니다.결국, MessageBox.Show(packet.Code.ToString()); 가 호출되기 전에 작업자 스레드가 중단되며, 메시지 박스가 뜨지 않습니다.왜 해당 작업자 스레드가 종료되는 지 궁금합니다. header의 크기를 잘못 지정한 문제였습니다.header의 크기를 2로 지정하여 해당 크기만큼만 Receive 소켓에서 읽어야 했는데, 그 이상 읽어서 이후 ReceiveAsync에서 더 이상 읽을 데이터가 없기 때문에 스레드가 중단된 것이었습니다. ㅡㅜ
-
미해결C# TCP/IP 소켓 프로그래밍
에러 관련하여 질문 있습니다.
안녕하세요, 실습을 따라 진행하던 도중 질문드릴 것이 생겨 여쭤봅니다.해당 강의의 커리큘럼 중 채팅 프로그램 세션에서 로그인 강의를 끝까지 듣고 그대로 입력해 실행해 봤을 때, 강의 영상처럼 영어를 입력하면 입력값이 길든 짧든 오류가 나지 않습니다.그러나 한글로 입력하면 아래의 사진과 같이 아이디, 닉네임 이렇게 짧게만 입력해도 오류가 납니다. 왜 이런 것인지 이유와 그 해결책을 알고 싶습니다.감사합니다.
-
미해결C# TCP/IP 소켓 프로그래밍
에러에 관한 질문입니다.
************** 예외 텍스트 **************System.Net.Sockets.SocketException (10061): 대상 컴퓨터에서 연결을 거부했으므로 연결하지 못했습니다.at System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.ThrowException(SocketError error, CancellationToken cancellationToken)at System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.System.Threading.Tasks.Sources.IValueTaskSource.GetResult(Int16 token)at System.Threading.Tasks.ValueTask.ValueTaskSourceAsTask.<>c.<.cctor>b__4_0(Object state)--- End of stack trace from previous location ---at Client.Singleton.ConnectAsync() in P:\Chat\Client\Singleton.cs:line 36at Client.LoginForm.btn_login_Click(Object sender, EventArgs e) in P:\Chat\Client\LoginForm.cs:line 20at System.Threading.Tasks.Task.<>c.<ThrowAsync>b__128_0(Object state) 16:45초 로그인 할 때 이렇게 뜨네요 ㅠㅠ 해당 라인 가보면LoginForm.csawait Singleton.Instance.ConnectAsync(); Singleton.csawait Socket.ConnectAsync(endPoint);입니다. 아이피와 포트도 제대로 입력해주었습니다. 강사님이 올려주신 파일 통째로 받아서 해봤는데도 동일한 오류가 발생합니다. 어떻게 해결해야하나요?코드 첨부합니다.LoginForm.csusing Core;namespace Client;public partial class LoginForm : Form{ public LoginForm() { InitializeComponent(); } private async Task btn_login_Click(object sender, EventArgs e) { if (string.IsNullOrEmpty(tbx_id.Text) || string.IsNullOrEmpty(tbx_nickname.Text)) { MessageBox.Show("입력하세요"); return; } await Singleton.Instance.ConnectAsync(); LoginRequestPacket packet = new LoginRequestPacket(tbx_id.Text, tbx_nickname.Text); await Singleton.Instance.Socket.SendAsync(packet.Serialize(), System.Net.Sockets.SocketFlags.None); Singleton.Instance.Id = tbx_id.Text; Singleton.Instance.Nickname = tbx_nickname.Text; RoomList roomList = new RoomList(); roomList.ShowDialog(); }}Singleton.csusing System.Net;using System.Net.Sockets;namespace Client;/// <summary>/// 언제 어디서나 접근할 수 있는 객체./// 이 객체는 반드시 1개만 존재해야 한다./// </summary>internal class Singleton{ public string Id { get; set; } = null!; public string Nickname { get; set; } = null!; public Socket Socket { get; } = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); private static Singleton? instance; public static Singleton Instance { get { if (instance == null) instance = new Singleton(); return instance; } } private Singleton() { } public async Task ConnectAsync() { IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse("192.168.219.106"), 20001); await Socket.ConnectAsync(endPoint); ThreadPool.QueueUserWorkItem(ReceiveAsync, Socket); } private async void ReceiveAsync(object? sender) { Socket socket = (Socket)sender!; byte[] headerBuffer = new byte[2]; while (true) { #region 헤더버퍼 가져옮 int n1 = await socket.ReceiveAsync(headerBuffer, SocketFlags.None); if (n1 < 1) { Console.WriteLine("client disconnect"); socket.Dispose(); return; } else if (n1 == 1) { await socket.ReceiveAsync(new ArraySegment<byte>(headerBuffer, 1, 1), SocketFlags.None); } #endregion #region 데이터버퍼 가져옮 short dataSize = IPAddress.NetworkToHostOrder(BitConverter.ToInt16(headerBuffer)); byte[] dataBuffer = new byte[dataSize]; int totalRecv = 0; while (totalRecv < dataSize) { int n2 = await socket.ReceiveAsync(new ArraySegment<byte>(dataBuffer, totalRecv, dataSize - totalRecv), SocketFlags.None); totalRecv += n2; } #endregion } }}
-
미해결C# TCP/IP 소켓 프로그래밍
크롬으로 서버에 접속은 되지만 response되지 않는 이유가 궁금합니다
pc에서 c#으로 http방식으로 response하는 server를 구축했습니다. 크롬을 클라이언트프로그램으로 삼아 서버에 접속했습니다. 이때 console.write(request)을 통해 접속된 것은 확인했습니다. 그러나 크롬화면에서는 err_empty_response만 뜹니다. 여러방식으로 테스트해 본 결과 크롬에서 http주소를 접속하면 공통적으로 나타나는 현상 같은데 어떻게 해야 할 지 모르겠습니다.
-
해결됨C# TCP/IP 소켓 프로그래밍
예제소스 제공 원합니다.
안녕하세요. 강의에서 타이핑 하신 Example Source를 제공받을 수 있을까요?
-
해결됨C# TCP/IP 소켓 프로그래밍
5:34 질문 있습니다.
안녕하세요 강의 복습중 궁금한점 생겨서 질문드립니다.21번줄에 client가 Accept한 이후 통신에 대한 함수(ReadAsync)를 ThreadPool에 추가하는 형태로 코딩을 하셨는데요ReadAsync함수에서는 while(true)내부에서 지속적으로 클라이언트와 통신을 해야하기 때문에 사실상 QueueUserWorkItem로인해 생성된 쓰레드풀의 쓰레드가 대기상태로 돌아가는 상황은 클라이언트가 연결을 종료했을 경우 말고는 없기 때문에쓰레드풀의 쓰레드1개 = 클라이언트1개로 이해했습니다.그렇다면 클라이언트가 connect요청을 하여 서버쪽에서accept를 할때마다 쓰레드풀의 쓰레드를 1개식 할당 하는 구조상클라이언트 100명만 접속하더라도 쓰레드풀의 쓰레드 100개를 사용하게 되는건데 성능상 문제가 생기진 않는걸까요? 아니면 비동기 방식이기 때문에 괜찮은건가요?혹은 쓰레드풀의 쓰레드1개 = 클라이언트1개 라는 조건이 틀린걸까요?제가 잘못 이해한 부분이 있는걸까요?
-
미해결C# TCP/IP 소켓 프로그래밍
방만들기, 방 목록 새로고침 강의 중 크로스스레드 문제
좋은 강의 감사드립니다. 방만들기, 방 목록 새로고침 강의 중 크로스스레드 문제 관련 질문드립니다.강의 중 RoomList 폼의 비하인드 코드에서 CreateRoomResponsed 함수에서 크로스스레드 문제가 발생합니다.코드 흐름상 해당 함수는 Singleton클래스에서 Invoke 되어 호출되는 구조이고 위에 붉은색으로 표시한 코드가 UI에 직접 접근하여 크로스스레드가 발생한 것으로 보입니다.정황상 크로스스레드가 발생하는게 맞는 상황인데, 강사님의 강의에서는 크로스스레드가 발생하지 않는것으로 보입니다.혹시 제가 놓친 부분이 있을까요?
-
해결됨C# TCP/IP 소켓 프로그래밍
9:45 질문 있습니다.
안녕하세요 강의보던중 궁금한점 생겨서 질문드립니다. 9분 45초에서 Receive용으로 사용하는 SocketAsyncEventArgs의 버퍼를 설정해주는데요, 이때 이 버퍼가 [입출력버퍼, 슬라이딩 윈도우] 강의에서 설명해주셨던 입력버퍼가 되는걸까요? 아니면 입력버퍼에 들어온 데이터를 넘겨받는 버퍼로 사용되는걸까요?