1. 程式人生 > >非阻塞多執行緒控制檯下例項

非阻塞多執行緒控制檯下例項

月月給小弟的程式碼~

Server:
#include <WinSock2.h>
#include <Windows.h>
#include <stdio.h>
#pragma comment(lib,"WS2_32.lib")

typedef struct tagTHREADPARAM
{
 SOCKET sClinet;
 sockaddr_in addrClient;
}THREADPARAM;

DWORD dThreadId[255];
HANDLE hThread[255];
int ThreadCount = 0;
DWORD WINAPI RecvProc(LPVOID lpParam);
DWORD WINAPI SendProc( LPVOID lpParam );

int main()
{
 WSADATA wsaData;
 SOCKET sServer;
 SOCKET sClinet;
 sockaddr_in addrServer;
 sockaddr_in addrClient;
 int iResult;
 THREADPARAM ClientSocket;

 //初始化
 if (WSAStartup(MAKEWORD(2,2),&wsaData) != 0)
 {
  printf("WSAStartuo failed!");
  return 1;
 }

 //連線Socket
 sServer = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
 if (sServer == INVALID_SOCKET)
 {
  printf("socket failed!");
  WSACleanup();
  return -1;
 }

 //bind繫結IP和埠
 addrServer.sin_family = AF_INET;
 addrServer.sin_port = htons(9990);
 addrServer.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
 iResult = bind(sServer,(const struct sockaddr*)&addrServer,sizeof(SOCKADDR_IN));
 if (iResult == SOCKET_ERROR)
 {
  printf("bind failed!");
  closesocket(sServer);
  WSACleanup();
  return -1;
 }

 
 //監聽Socket
 iResult = listen(sServer,1);
 if (iResult == SOCKET_ERROR)
 {
  printf("listen failed!");
  closesocket(sServer);
  WSACleanup();
  return -1;
 }

 printf("Tcp Server start...\n");

 //等待接收,如果客戶端不發包,則一直監聽

 while(1)
 {
  int addrClientlen = sizeof(addrClient);
  sClinet = accept(sServer,(sockaddr FAR*)&addrClient,&addrClientlen);
  if (sClinet == INVALID_SOCKET)
  {
   printf("accept failed!");
   closesocket(sServer);
   WSACleanup();
   return -1;
  }
  ClientSocket.sClinet = sClinet;
  ClientSocket.addrClient = addrClient;
  hThread[ThreadCount] = CreateThread(NULL,0,RecvProc,&ClientSocket,0,&dThreadId[ThreadCount]);
  if (hThread[ThreadCount] == NULL)
  {
   printf("Create thread error!");
   return 1;
  }
 }
 printf("Please begin to chat\n");

 //結束清理
 closesocket(sServer);
 closesocket(sClinet);
 WSACleanup();
 system("Pause");
 return 0;
}

DWORD WINAPI RecvProc( LPVOID lpParam )
{
 ThreadCount++;
 if (lpParam == NULL)
 {
  ThreadCount--;
  ExitThread(dThreadId[ThreadCount]);
 }

 int iResult;
 char buff_reve[255];
 THREADPARAM * ClientSocket = (THREADPARAM*)lpParam;
 SOCKET sClient = ClientSocket->sClinet;
 sockaddr_in addrClient = ClientSocket->addrClient;

 THREADPARAM SeverSend;
 SeverSend.sClinet = sClient;
 SeverSend.addrClient = addrClient;

 hThread[ThreadCount] = CreateThread(NULL,0,SendProc,&SeverSend,0,&dThreadId[ThreadCount]);
 if (hThread[ThreadCount] == NULL)
 {
  printf("Create send thread error!");
  ExitThread(dThreadId[ThreadCount]);
 }

 //訊息迴圈
 while(1)
 {
  ZeroMemory(buff_reve,128);
  iResult = recv(sClient,buff_reve,BUFSIZ,0);
  if (iResult == SOCKET_ERROR)
  {
   printf("recv failed!");
   closesocket(sClient);
   WSACleanup();
   ThreadCount--;
   ExitThread(dThreadId[ThreadCount]);
   return -1;
  }

   //等待quit,則結束訊息接收
  if (strcmp(buff_reve,"quit") == 0 || strcmp(buff_reve,"結束") == 0)
  {
   iResult = send(sClient,"quit",strlen("quit"),0);
   ThreadCount = 0;
   break;
  }
  else
  {
   printf("Please input a string to send:\n");
  }
 }
}

DWORD WINAPI SendProc( LPVOID lpParam )
{
 ThreadCount++;
 if (lpParam == NULL)
 {
  ThreadCount--;
  ExitThread(dThreadId[ThreadCount]);
 }

 int iResult;
 char buff_send[255];
 THREADPARAM* SeverSend = (THREADPARAM*)lpParam;
 SOCKET sClient = SeverSend->sClinet;
 sockaddr_in addrClient = SeverSend->addrClient;

 while(1)
 {
  ZeroMemory(buff_send,128);
  printf("Please input a string to send:\n");
  scanf("%s",buff_send);
  iResult = send(sClient,buff_send,strlen(buff_send),0);
  if (iResult == SOCKET_ERROR)
  {
   printf("send failed!");
   closesocket(sClient);
   WSACleanup();
   ThreadCount--;
   ExitThread(dThreadId[ThreadCount]);
   return -1;
  }
 }
}

client:
#include <stdio.h>
#include <WinSock2.h>
#pragma comment(lib,"WS2_32.lib")

typedef struct tagTHREADPARAM
{
 SOCKET sClinet;
 sockaddr_in addrClient;
}THREADPARAM;

DWORD dThreadId[255];
HANDLE hThread[255];
int ThreadCount = 0;
HANDLE hEvent;
DWORD WINAPI RecvProc(LPVOID lpParam);
DWORD WINAPI SendProc( LPVOID lpParam );

int main()
{
 WSADATA wsaData;
 SOCKET sClinet;
 sockaddr_in addrClient;
 int iResult;
 char ServerIP[32];

 ZeroMemory(ServerIP,32);
 printf("Please input server's IP:");
 scanf("%s",ServerIP);

 //初始化
 if (WSAStartup(MAKEWORD(2,2),&wsaData) != 0)
 {
  printf("WSAStartuo failed!");
  return 1;
 }

 //連線Scocket
 sClinet = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
 if (sClinet == INVALID_SOCKET)
 {
  printf("socket failed!");
  WSACleanup();
  return -1;
 }

 //連線伺服器
 addrClient.sin_family = AF_INET;
 addrClient.sin_port = htons(9990);
 addrClient.sin_addr.S_un.S_addr = inet_addr(ServerIP);
 int addrlen = sizeof(addrClient);
 iResult = connect(sClinet,(const sockaddr*)&addrClient,sizeof(addrClient));
 if (iResult == SOCKET_ERROR)
 {
  printf("connect failed!");
  closesocket(sClinet);
  WSACleanup();
  return -1;
 }

 hEvent = CreateEvent(NULL,FALSE,FALSE,L"ClientEvent");
 THREADPARAM ClientSocket;
 ClientSocket.sClinet = sClinet;
 ClientSocket.addrClient = addrClient;
 hThread[ThreadCount] = CreateThread(NULL,0,RecvProc,&ClientSocket,0,&dThreadId[ThreadCount]);
 if (hThread[ThreadCount] == NULL)
 {
  printf("Create thread error!");
  return 1;
 }

 printf("Please begin to chat\n");
 //訊息接收

 WaitForSingleObject(hEvent,INFINITE);

 closesocket(sClinet);
 WSACleanup();
 system("Pause");
 return 0;
}

DWORD WINAPI RecvProc(LPVOID lpParam)
{
 ThreadCount++;
 if (lpParam == NULL)
 {
  ThreadCount--;
  ExitThread(dThreadId[ThreadCount]);
 }

 int iResult;
 char buff_reve[255];
 THREADPARAM* ClientSocket = (THREADPARAM*)lpParam;
 SOCKET sClient = ClientSocket->sClinet;
 sockaddr_in addrClient = ClientSocket->addrClient;

 THREADPARAM SeverSend;
 SeverSend.sClinet = sClient;
 SeverSend.addrClient = addrClient;

 hThread[ThreadCount] = CreateThread(NULL,0,SendProc,&SeverSend,0,&dThreadId[ThreadCount]);
 if (hThread[ThreadCount] == NULL)
 {
  printf("Create send thread error!");
  ExitThread(dThreadId[ThreadCount]);
 }

 //訊息迴圈
 while(1)
 {
  ZeroMemory(buff_reve,128);
  iResult = recv(sClient,buff_reve,BUFSIZ,0);
  if (iResult == SOCKET_ERROR)
  {
   printf("recv failed!");
   closesocket(sClient);
   WSACleanup();
   ThreadCount--;
   ExitThread(dThreadId[ThreadCount]);
   return -1;
  }

  //等待quit,則結束訊息接收
  if (strcmp(buff_reve,"quit") == 0 || strcmp(buff_reve,"結束") == 0)
  {
   iResult = send(sClient,"quit",strlen("quit"),0);
   ThreadCount = 0;
   break;
  }
  else
  {
   printf("Please input a string to send:\n");
  }
 }
 ThreadCount--;
 if (ThreadCount == 0)
 {
  SetEvent(hEvent);
 }
}

DWORD WINAPI SendProc( LPVOID lpParam )
{
 ThreadCount++;
 if (lpParam == NULL)
 {
  ThreadCount--;
  ExitThread(dThreadId[ThreadCount]);
 }

 int iResult;
 char buff_send[255];
 THREADPARAM* SeverSend = (THREADPARAM*)lpParam;
 SOCKET sClient = SeverSend->sClinet;
 sockaddr_in addrClient = SeverSend->addrClient;

 while(1)
 {
  ZeroMemory(buff_send,128);
  printf("Please input a string to send:\n");
  scanf("%s",buff_send);
  iResult = send(sClient,buff_send,strlen(buff_send),0);
  if (iResult == SOCKET_ERROR)
  {
   printf("send failed!");
   closesocket(sClient);
   WSACleanup();
   ThreadCount--;
   ExitThread(dThreadId[ThreadCount]);
   return -1;
  }
 }
 ThreadCount--;
 if (ThreadCount == 0)
 {
  SetEvent(hEvent);
 }
}

相關推薦

阻塞執行控制檯例項

月月給小弟的程式碼~ Server: #include <WinSock2.h> #include <Windows.h> #include <stdio.h> #pragma comment(lib,"WS2_32.lib") type

Java Socket程式設計(阻塞執行,NIO)

服務端:伺服器Server類public class Server implements Runnable { private int port; private volatile boolean stop; private Selector sele

java socket通訊I/O阻塞>執行實現阻塞通訊

簡單的java socket通訊,多個客戶端同時連線,功能可在此基礎上進行擴充套件。效果如圖: server: package com.lb.LB_Socket; import java.io.BufferedReader; import ja

Linux執行(pthread)程式設計例項

Linux系統下的多執行緒遵循POSIX執行緒介面,稱為 pthread。編寫Linux下的多執行緒程式,需要使用標頭檔案pthread.h,連線時需要使用庫libpthread.a。順便說一下,Linux 下pthread的實現是通過系統呼叫clone()來實現的。clon

執行縣互動例項,生產消費

生產者消費者問題是一個非常典型性的執行緒互動的問題。 1. 使用棧來存放資料 1.1 把棧改造為支援執行緒安全 1.2 把棧的邊界操作進行處理,當棧裡的資料是0的時候,訪問pull的執行緒就會等待。 當棧裡的資料時200的時候,訪問push的執行緒就會等待 2. 提供一個生產者(Producer)執

HashMap執行環境的死迴圈問題解釋

hashMap在多執行緒環境下,呼叫put方法出現的死迴圈是由於擴容時候resize方法導致的連結串列出現迴圈。 void resize(int newCapacity) { Entry[] oldTable = table; int oldCapacity =

基於Log4j NDC 執行條件記錄日誌,排查生產問題

在大吞吐,高併發的場景, 一個請求到達後端,通常是轉換成多執行緒並行處理請求, 如何通過一個標誌找到這個請求對應的多個執行緒,瞭解這個請求的完整的處理情況,從而幫助我們定位這次呼叫到底哪一步出現了問題,對我們快速定位排查生產問題是非常有用的。我們在每個子任務程式

java day25 執行) 單例類(Runtime,Timer

25.01_多執行緒(單例設計模式)(掌握) 單例設計模式:保證類在記憶體中只有一個物件。 如何保證類在記憶體中只有一個物件呢? (1)控制類的建立,不讓其他類來建立本類的物件。private (2)在本類中定義一個本類的物件。Singl

java執行(含例項)、並行、併發的含義

轉  https://www.cnblogs.com/wxd0108/p/5479442.html 這篇文章寫得非常棒, 我在這裡記錄一下,防止以後找不到了   用多執行緒只有一個目的,那就是更好的利用cpu的資源,因為所有的多執行緒程式碼都可以用單執行緒來

Java執行環境的懶漢模式解決方案

一、場景簡述 單例模式下有餓漢模式和懶漢模式,其中懶漢模式在於呼叫相關方法時例項才被建立。懶漢模式我們不難實現,但是在懶漢模式下我們如果使用多執行緒,就會取出多個例項的情況,與單例模式相違背,所以該篇部落格筆者主要關於在多執行緒環境下利用DCL雙檢查鎖機制來實現懶漢模式。

java定時器類Timer和執行介紹及例項

任務要求: 完成一個java application應用程式,使用定時器程式設計,在實時顯示當前時間,每1秒時鐘內容更新一次。 完成一個java application應用程式,在應用程式主程序中新開一個執行緒,此執行緒進行死迴圈,每1秒被啟用一次,啟用時即在

linux執行環境的搶屍行為(system返回-1:No child processes)

#!/usr/bin/env python #coding:utf8 import os import time pid = os.fork() if pid: print 'in parent.sleepin....' while True:

執行環境呼叫 HttpWebRequest 併發連線限制

.net 的 HttpWebRequest 或者 WebClient 在多執行緒情況下存在併發連線限制,這個限制在桌面作業系統如 windows xp , windows  7 下預設是2,在伺服器作業系統上預設為10. 如果不修改這個併發連線限制,那麼客戶端同時可以建立的

C++11 執行程式設計使用例項

最新研究下C++11中執行緒的知識,基本內容如下: 1、C++11中建立執行緒的幾種方式 在C11中,我們可以通過建立std::thread類的物件來建立額外的執行緒。每個thread物件可以跟具體的某個執行緒關聯,從而達到多執行緒併發的目的。  必須 #include 

執行環境的ConcurrentHashMap

文章目錄 什麼是ConcurrentHashMap? 底層資料結構? 如何實現併發安全? transfer和ForwardingNode Hash計算 什麼是ConcurrentHashMap? C

執行環境使用log4j輸出各執行的標識,區分各執行輸出的內容

在多執行緒環境下,我們可能需要輸出很多資訊,每個執行緒產生的日誌資訊可能都是類似的,我們如何區分出哪些資訊是同一個執行緒輸出的呢?其實log4j已經提供了多種實現方式: 1.使用PatternLayout,在設定輸出格式的時候增加%t引數,這樣會輸出各個執行緒的執行緒名稱,這樣我們就可以根據執行緒名稱區分哪

從專案中談JAVA中static 方法在執行環境的運用

最近在做一個實時性比較高的系統,資料庫訪問很頻繁。在這個專案中資料庫訪問的大多數都被我做成了static 方法。(這樣做應該不是很好,沒辦法發揮dao模式的優勢,不過湊合用吧)因這個系統是多執行緒。static方法的運用需要注意,不能在servlet中使用成員變數,因為如果你

關於在執行情況同步爬蟲爬取結果的一個例子

這些天一直在用java做爬蟲工作,之前遇到的都比較簡單,大多都是單介面的爬取,這次需要爬蟲100多個介面,肯定得多跑幾個執行緒 然而這些介面由於資訊中有重複,leader要求我們必須去重,因為資料庫更改是有次數限制的。所以搞了幾天,才把這個程式寫出來。 先寫一下思想:首先,利用JA

執行併發的單例模式實現

1.1 天生執行緒安全的餓漢式單例 1.2 懶漢式單例 1.2.1 執行緒不安全的懶漢式單例 1.2.2 執行緒安全的懶漢式單例

執行狀態使用同步機制的本質原因

簡述 在Java的學習中必然會遇到多執行緒和同步問題,對於初學者一般只會理解到相關api的使用,但是很少能夠真正知道為什麼要對多執行緒環境下的物件進行同步,接下來我就談談自己的一些理解。 JVM堆與JVM棧巨集觀室是分離的,而微觀上則又相互聯絡,這種分配方式使得JVM堆中的