private void Form1_FormClosed(object sender, FormClosedEventArgs e) { WSA.Close_Socket(UDP_socket); WSA.Close_Socket(TCP_socket); socketFlag = false; foreach (IntPtr sock in clients.Keys) { WSA.Close_Socket(sock); } WSA.WSA_Cleanup(); }
void stop_server() { WSA.Close_Socket(UDP_socket); log_txt.Text += "\r\nUDP сокет уничтожен"; WSA.Close_Socket(TCP_socket); log_txt.Text += "\r\nTCP сокет уничтожен"; lock (clients) foreach (IntPtr sock in clients.Keys) { WSA.Close_Socket(sock); } }
void listen_tcp() { IntPtr accSocket; WSA.sockaddr client = new WSA.sockaddr(); while (socketFlag) { accSocket = WSA.Accept(TCP_socket); if (accSocket != new IntPtr(-1)) { int Size = Marshal.SizeOf(client); int result = WSA.getpeername(accSocket, ref client, ref Size); string ip = new IPAddress(BitConverter.GetBytes(client.sin_addr)).ToString(); int iResult; byte[] recvBuff = new byte[512]; int tv = 2000; int li = WSA.setsockopt(accSocket, 65535, 4102, ref tv, Marshal.SizeOf(tv)); iResult = WSA.Recv(accSocket, recvBuff, 512, 0); string Source = Encoding.Default.GetString(recvBuff); if (regexFunc(@"IYOUCLIENT", Source) != "IYOUCLIENT") { WSA.Close_Socket(accSocket); continue; } tv = 2000; li = WSA.setsockopt(accSocket, 65535, 4102, ref tv, Marshal.SizeOf(tv)); Client cclient; cclient.ip = ip; cclient.socket = accSocket.ToString(); cclient.game_status = 0; cclient.game_bill = 0; clients.Add(accSocket, cclient); Update_list(); AddTextSafe("Подключился клиент:" + accSocket.ToString()); new Thread(delegate() { recvClientTCP(accSocket); }).Start(); if (currentWord != "") { lock (command_risovalko_log) foreach (string str in command_risovalko_log) { sendTCP(accSocket, str); } } } } }
void recvClientTCP(IntPtr client) { string Source; while (true) { byte[] recvBuff = new byte[512]; int iResult; iResult = WSA.Recv(client, recvBuff, 512, 0); if (iResult > 0) { Source = Encoding.Default.GetString(recvBuff); if (regexFunc(@"IAMHERETOO", Source) == "IAMHERETOO") { int tv = 2000; WSA.setsockopt(client, 65535, 4102, ref tv, Marshal.SizeOf(tv)); tv = 0; continue; } if ((Convert.ToInt32(regexFunc(@"CommandType=[0-9]", Source).Substring(12)) == 0)) { string str = regexFunc(@"Text=\W\w+", Source); if (str.Length > 0) { if (str.Substring(5) == "!start") { lock (command_risovalko_log) command_risovalko_log.Clear(); lock (clients) { Random r = new Random(); int i = 0; int needed_i = r.Next(clients.Count); foreach (IntPtr sock in clients.Keys) { if (i == needed_i) { currentPUser = sock; currentWord = words[r.Next(words.Count)]; } i++; } lock (clients) add_new_client(1, ((Client)clients[currentPUser]).game_bill, ((Client)clients[currentPUser]).ip, ((Client)clients[currentPUser]).socket, currentPUser); sendTCP(currentPUser, "CommandType=3\r\n" + currentWord); } Update_list(); } } else { str = regexFunc(@"Text=\w+", Source); if (str.Substring(5) == currentWord) { try { add_new_client(0, ((Client)clients[currentPUser]).game_bill + 10, ((Client)clients[currentPUser]).ip, ((Client)clients[currentPUser]).socket, currentPUser); } catch { } try { add_new_client(0, ((Client)clients[client]).game_bill + 10, ((Client)clients[client]).ip, ((Client)clients[client]).socket, client); Update_list(); sendTCP(currentPUser, "CommandType=3\r\n"); } catch { } } } str = null; } lock (command_risovalko_log) command_risovalko_log.Add(client.ToString() + ": " + Source); lock (clients) foreach (IntPtr sock in clients.Keys) { sendTCP(sock, client.ToString() + ": " + Source); } GC.Collect(); } else { break; } } lock (clients) if (clients.ContainsKey(client)) { AddTextSafe("Клиент отключился: " + ((Client)clients[client]).ip); clients.Remove(client); WSA.Close_Socket(client); if ((client == currentPUser) && (clients.Count > 0)) { currentWord = ""; lock (command_risovalko_log) command_risovalko_log = new List <string>(); lock (clients) { Random r = new Random(); int i = 0; int needed_i = r.Next(clients.Count); foreach (IntPtr sock in clients.Keys) { if (i == needed_i) { currentPUser = sock; currentWord = words[r.Next(words.Count)]; } i++; } add_new_client(1, ((Client)clients[currentPUser]).game_bill, ((Client)clients[currentPUser]).ip, ((Client)clients[currentPUser]).socket, currentPUser); sendTCP(currentPUser, "CommandType=3\r\n" + currentWord); foreach (IntPtr sock in clients.Keys) { sendTCP(sock, currentPUser.ToString() + ": CommandType=0\r\nText=!start"); } } Update_list(); } else if (client == currentPUser) { currentWord = ""; command_risovalko_log = new List <string>(); GC.Collect(); } Update_list(); } }