非阻塞多執行緒控制檯下例項
月月給小弟的程式碼~
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堆中的