基於TCP協議伺服器(執行緒/多程序)
基於TCP協議的伺服器,執行緒,多程序版本。
為了解決伺服器可以同時和多個客戶端資料互動。
程式碼如下:
server.c
#include<stdio.h>
#include<stdlib.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<unistd.h>
#include<string.h>
#include<sys/types.h>
#include<arpa/inet.h>
#include<wait.h>
#include<pthread.h>
typedef struct {
int sock;
int a;
}net_info;
void service(int sock,int a)
{
char buf[1024];
while(1)
{
buf[0] = 0;
ssize_t s = read(sock,buf,sizeof(buf)-1);
if(s > 0)
{
buf[s] = 0;
printf("我是 %d : %s\n",a,buf);
write(sock,buf,strlen (buf));
}
else if(s ==0)
{
printf("client %d quit\n",a);
break;
}
else{
printf("read error!\n");
break;
}
}
}
//執行緒處理函式
void *rout(void *arg)
{
net_info* tmp = (net_info*)arg;
service(tmp->sock,tmp->a);
close(tmp->sock);
free (tmp);
}
//./server 0 8080
int main(int argc,char *argv[])
{
if(argc != 3)
{
printf("usage: ./client [ip] [port]");
return 1;
}
//建立檔案描述符
int sock = socket(AF_INET,SOCK_STREAM,0);
if(sock < 0)
{
printf("create socket error\n");
return 2;
}
struct sockaddr_in server_socket;
server_socket.sin_family = AF_INET;
server_socket.sin_port = htons(atoi(argv[2]));
server_socket.sin_addr.s_addr = inet_addr(argv[1]);
//繫結檔案描述符,IP/PORT
if(bind(sock,(struct sockaddr*)&server_socket,sizeof(struct sockaddr_in))<0)
{
printf("bind error\n");
goto END;
}
int ret = listen(sock,5);
if(ret < 0)
{
printf("listen error\n");
goto END;
}
printf("bind and listen success..\n");
struct sockaddr_in peer;
while(1)
{
socklen_t len = sizeof(peer);
int new_sock = accept(sock,(struct sockaddr*)&peer,&len);
if(new_sock<0)
{
printf("accept error\n");
continue;
}
net_info *info = (net_info *)malloc(sizeof(net_info));
if(info == 0)
{
perror("malloc\n");
close(new_sock);
continue;
}
info->sock = new_sock;
info->a = new_sock;
//執行緒
pthread_t tid;
pthread_create(&tid,NULL,rout,(void *)info);
pthread_detach(tid);
/*
// 多程序
pid_t pid = fork();
if(pid == 0)
{
//child
close(sock);
if(fork() > 0)
{
exit(0);
}
service(new_sock,a);
close(new_sock);
exit(0);
}
else if(pid > 0)
{
close(new_sock);
waitpid(pid,NULL,0);
}
else{
printf("fork error\n");
continue;
}
*/
}
END:
close(sock);
return 0;
}
執行結果:
支援多個客戶端同時訪問。
相關推薦
基於TCP協議伺服器(執行緒/多程序)
基於TCP協議的伺服器,執行緒,多程序版本。 為了解決伺服器可以同時和多個客戶端資料互動。 程式碼如下: server.c #include<stdio.h> #include<stdlib.h> #include<sy
核心執行緒、輕量級程序、使用者執行緒三種執行緒概念解惑(執行緒≠輕量級程序)
執行緒與程序概念 在現代作業系統中,程序支援多執行緒。 程序是資源管理的最小單元; 執行緒是程式執行的最小單元。 即執行緒作為排程和分配的基本單位,程序作為資源分配的基本單位 一個程序的組成實體可以分為兩大部分:執行緒集和資源集。程序中的執行緒是動態的物件;代表了程序指
【隨堂筆記】unity中socket用法(三,伺服器端執行緒的使用)
手機專案,最好不要使用執行緒,因為unity專門提供了協程,枝執行緒不能訪問主執行緒(ui) 手機使用執行緒,容易導致硬體出問題 執行緒測試程式碼 /// <summary> /// 執行緒的測試方法 /// </summary>
《Java多執行緒程式設計實戰》—— 第10章 Thread Specific Storage(執行緒特有儲存)模式
Thread Specific Storage模式:不共享變數,不使用鎖。 不同執行緒使用統一的訪問接入點可以獲取執行緒特有的例項。 弊端: 隱藏了系統結構,隱藏了應用中各個物件之間的關係,從而使應用更加難於理解。 鼓勵使用全域性物件。 常見使用場景
Java中的多執行緒(執行緒間通訊)
/學習筆記/ 執行緒間通訊: 多個執行緒在處理同一資源,但是任務卻不同。 先看一個例子,採用兩個執行緒執行進行輸入和輸出任務: //資源 class Resource { String name; String sex;
Android小知識-Java多執行緒相關(執行緒間通訊)下篇
本平臺的文章更新會有延遲,大家可以關注微信公眾號-顧林海,如果大家想獲取最新教程,請關注微信公眾號,謝謝! 在一種場景中,比如main執行緒建立並啟動了子執行緒,子執行緒需要做耗時操作,如果main執行緒想等子執行緒執行完成之後再結束,由於main執行緒比子執行緒先執行完,因此main執行緒獲取不
多執行緒學習一(執行緒、程序基本概念理解)
執行緒是程序中的實體,一個程序可以擁有多個執行緒,一個執行緒必須有一個父程序。執行緒不擁有系統資源,只有執行必須的一些資料結構;它與父程序的其它執行緒共享該程序所擁有的全部資源。執行緒可以建立和撤消執行緒,從而實現程式的併發執行。 執行緒也有就緒、阻塞和執行三種基本狀態。就
Python3基礎之(三十 一)多執行緒&多程序
一、多執行緒 Threading 多執行緒 Threading 是一種讓程式擁有分身效果. 能同時處理多件事情. 一般的程式只能從上到下一行行執行程式碼, 不過多執行緒 (Threading)就能打破這
c++多執行緒模式下的socket程式設計(執行緒池實現)
socket 程式設計可以說是一個基本的技術掌握,而多個客戶端向服務端傳送請求又是一個非常常見的場景,因此多執行緒模式下的socket程式設計則顯得尤為常見與重要。 本文主要利用執行緒池的技術,來實現多執行緒的模式,執行緒池的優點就不多述了,相信大家都能理
linux/unix多執行緒/多程序程式設計總結(一)
linux/unix多執行緒,多程序程式設計是在實際工作中經常使用到的技能,在C語言或者C++語言面試的時候也經常會被問到此部分內容。 本文對linux/unix系統中的pthread相關的多程序和多執行緒程式設計的各個方面進行了總結,包括執行緒、程序、程
select伺服器端的程式碼以及select的優缺點與多執行緒多程序伺服器的比較
22 struct sockaddr_in local; 23 local.sin_family=AF_INET; 24 local.sin_port=htons(port); 25 local.sin_addr.s_addr=inet_addr(ip); 26
Java執行緒學習和總結(執行緒的概念)
執行緒的概念: 多執行緒允許在程式中併發執行多個指令流,每個指令流都稱為一個執行緒,彼此間互相獨立。它和程序一樣擁有獨立的執行控制,由作業系統負責排程,區別在於執行緒沒有獨立的儲存空間,而是和所屬程序中的其它執行緒共享一個儲存空間,這使得執行緒間的通訊遠較程序簡單。 具體到java記憶體模型,
多執行緒多程序使用場景
Python36 多執行緒、多程序的使用場景 多執行緒與多程序的使用場景 io 操作不佔用CPU(從硬碟、從網路、從記憶體讀資料都算io) 計算佔用CPU(如1+1計算) python中的執行緒是假執行緒,不同執行緒之間的切換是需要耗費資源的,因為需要儲存執行緒的上下文,不斷的切換就
java 併發(執行緒&鎖)
java 併發(執行緒&鎖) ##執行緒 ###執行緒概念 作業系統排程的最小單元是執行緒,也叫輕量級程序(LightWeight Process),在一個程序裡可以建立多個執行緒,這些執行緒都擁有各自的計數器、堆疊和區域性變數等屬性,並且能夠訪問共享的記憶體變數。處
spider ---- 程序&執行緒+++多程序&多執行緒
1案例演示: 程序-面向過程 import time from multiprocessing import Process def sing(): for x in range(1, 6): print('你在唱女兒情') time
Python 多執行緒 多程序 協程 yield
python中多執行緒和多程序的最大區別是穩定性和效率問題 多程序互相之間不影響,一個崩潰了不影響其他程序,穩定性高 多執行緒因為都在同一程序裡,一個執行緒崩潰了整個程序都完蛋 多程序對系統資源開銷大,多執行緒對系統資源開銷小,所以這方面來說多執行緒會比多程序快一點點 關於執行
【linux】Valgrind工具集詳解(十三):DRD(執行緒錯誤檢測器)
一、概述 多執行緒程式設計需要注意的問題: 資料競爭;鎖競爭;POSIX執行緒API使用不當;死鎖; 二、使用 1、例子main.c原始碼 #include <stdio.h> #include <pthread.h> #include <s
【linux】Valgrind工具集詳解(十三):Helgrind(執行緒錯誤檢測器)
一、概述 Helgrind用於檢測C、C ++和Fortran程式中使用符合POSIX標準的執行緒函式造成的同步錯誤。 POSIX中關於執行緒的主要抽象描述有:共享公共地址空間的一組執行緒、執行緒建立、執行緒連線、執行緒退出、互斥(鎖)、條件變數(執行緒間事件通知)、讀寫器鎖、自
理解一下Python中的多執行緒,多程序,多協程
程序 一個執行的程式(程式碼)就是一個程序,沒有執行的程式碼叫程式,程序是系統資源分配的最小單位,程序擁有自己獨立的記憶體空間,所以程序間資料不共享,開銷大。 執行緒, 排程執行的最小單位,也叫執行路徑,不能獨立存在,依賴程序存在一個程序至少有一個執行緒,叫主執行緒,而多
Android Service保活(執行緒保活)
Android 系統對於記憶體管理,為了使系統有序穩定的執行,系統內部會自動分配,控制程式的記憶體使用。當系統覺得記憶體的資源非常有限的時候,為了保證一些優先順序高的程式能執行,就會殺掉一些他認為不重要的程式或者服務來釋放記憶體, 比如專案需求需要Service在後臺實時