1. 程式人生 > >linux socket多程序併發伺服器

linux socket多程序併發伺服器

/***sever***/  
#include <sys/types.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <arpa/inet.h> 
#include <unistd.h> 
#include <sys/select.h> 
#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 
#define PORT 1234 
#define MAXSOCKFD 10 
void main() 
{ 
 
int sockfd,newsockfd,is_connected[MAXSOCKFD],fd; 
 
struct sockaddr_in addr; 
 
int addr_len = sizeof(struct sockaddr_in); 
 
fd_set readfds; 
 
char buffer[256]; 
 
char msg[ ] ="Welcome to server!"; 
 
pid_t pid; 
 
if ((sockfd = socket(AF_INET,SOCK_STREAM,0))<0) 
 
{ 
 
 
perror("socket"); 
 
 
exit(1); 
 
} 
 
bzero(&addr,sizeof(addr)); 
 
addr.sin_family =AF_INET; 
 
addr.sin_port = htons(PORT); 
 
addr.sin_addr.s_addr = htonl(INADDR_ANY); 
 
if(bind(sockfd,&addr,sizeof(addr))<0) 
 
{ 
 
 
perror("connect"); 
 
 
exit(1); 
 
} 
 
if(listen(sockfd,3)<0) 
 
{ 
 
 
perror("listen"); 
 
 
exit(1); 
 
} 
 
while(1) 
 
{ 
 
 
FD_ZERO(&readfds); 
 
 
if((newsockfd = accept (sockfd,&addr,&addr_len))<0)  
 
 
{ 
 
 
 
perror("accept"); 
 
 
 
continue;  
 
 
}  
 
 
 
if ((pid = fork()) != 0) 
 
 
{ 
 
 
 
close(newsockfd); 
 
 
 
 
continue;  
 
 
}  
 
 
FD_SET(newsockfd, &readfds);  
 
 
printf("cnnect from %s\n",inet_ntoa(addr.sin_addr)); 
 
 
printf("pid = %d, ppid = %d\n", getpid(), getppid()); 
 
 
write(newsockfd,msg,sizeof(msg)); 
 
 
while(1) 
  
  
{ 
  
 
 
 
/*
描述符無變化,資料將阻塞
*/ 
 
 
 
if (!select(MAXSOCKFD, &readfds, NULL, NULL, 0)) 
 
 
 
{ 
 
 
 
 
continue; 
 
 
 
} 
 
 
 
if(read(newsockfd,buffer,sizeof(buffer))<=0) 
 
 
 
{ 
 
 
 
 
printf("connect closed.\n"); 
 
 
 
 
close(newsockfd); 
 
 
 
 
break; 
 
 
 
} 
 
 
 
else 
 
 
 
{ 
 
 
 
 
printf("From client: %d\n",buffer[0]); 
 
 
 
 
if (write(newsockfd, buffer, strlen(buffer)) < 0) 
 
 
 
 
 
perror("write"); 
 
 
 
 
printf("To client: %d\n\n",buffer[0]); 
 
 
 
} 
 
 
 
 
 
} 
 
 
} 
} 
 
  
/****client****/ 
#include <sys/stat.h> 
#include <fcntl.h> 
#include <unistd.h> 
#include <sys/types.h>  
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <arpa/inet.h> 
#include <stdlib.h> 
#include <stdio.h> 
#define PORT 1234  
#define SERVER_IP "127.0.0.1" 
main() 
{ 
 
int s; 
 
struct sockaddr_in addr; 
 
char buffer[256]; 
 
static int flag = 1; 
 
if((s = socket(AF_INET,SOCK_STREAM,0))<0) 
 
{ 
 
 
perror("socket"); 
 
 
exit(1); 
 
} 
 
/* 
填寫
sockaddr_in
結構
*/ 
 
bzero(&addr,sizeof(addr)); 
 
addr.sin_family = AF_INET; 
 
addr.sin_port=htons(PORT); 
 
addr.sin_addr.s_addr = inet_addr(SERVER_IP); 
 
/* 
嘗試連線
*/ 
 
if(connect(s,&addr,sizeof(addr))<0) 
 
{ 
 
 
perror("connect"); 
 
 
exit(1); 
 
} 
 
/* 
接收由
server
端傳來的資訊
*/ 
 
recv(s,buffer,sizeof(buffer),0); 
 
printf("%s\n",buffer); 
 
while(1) 
 
{ 
 
 
bzero(buffer,sizeof(buffer)); 
 
 
/* 
從標準輸入裝置取得字串
*/ 
 
 
if (flag == 1) 
 
 
{ 
 
 
 
read(STDIN_FILENO,buffer,sizeof(buffer)); 
 
 
 
printf("Insert data:%s\n", buffer); 
 
 
 
 
flag = 0; 
 
 
} 
 
 
else 
  
  
{ 
  
 
 
 
read(s,buffer,sizeof(buffer)); 
 
 
 
 
printf("From sever: %d\n\n", buffer[0]); 
  
 
 
}  
 
 
/* 
將字串傳給
server
端
*/ 
 
 
sleep(2);  
 
 
buffer[0] += 1;  
 
 
if(write(s,buffer,sizeof(buffer))<0) 
 
 
{ 
 
 
 
perror("send"); 
 
 
 
exit(1); 
 
 
}  
 
 
printf("To sever: %d\n", buffer[0]); 
  
 
}  
} 
  

相關推薦

linux socket程序併發伺服器

/***sever***/ #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h>

linux fork程序併發伺服器模型之C/C++程式碼實戰

        在很早的文章中, 我們一起聊過伺服器如何與多個客戶端進行通訊, 那時, 我們要麼用select, 要麼用多執行緒, 卻沒有用多程序。 其實, 多程序也可以實現與多個客戶端進行通訊。          如果是在while中迴圈accept,  然後迴圈處理事情

Linux程序併發伺服器(TCP)

Linux多程序併發伺服器(TCP) 前言:在Linux環境下多程序的應用很多,其中最主要的就是網路/客戶伺服器。多程序伺服器是當客戶有請求時 ,伺服器用一個子程序來處理客戶請求。父程序繼續等待其它客戶的請求。這種方法的優點是當客戶有請求時 ,伺服器能及時處理客戶 ,特別是在客戶伺服

Linux學習之網路程式設計(程序併發伺服器

言之者無罪,聞之者足以戒。 - “詩序” 上面我們所說過的通訊都是一個伺服器一個客戶端之間的通訊,下面我們來交流一下多程序併發伺服器的相關知識 邏輯上就是這個樣子的,就是一個伺服器多個客戶端進行資料的傳輸。 1、傳送資料的函式: ssize_t send(int sockfd,

linux網路程式設計之程序併發伺服器

1)使用多程序併發伺服器考慮的因素:       (1)父程序描述最大檔案描述符的個數(父程序需要關閉accept返回的新檔案描述符)       (2)系統內可建立程序的個數(與記憶體大小相關)       (3)程序建立過多是否降低整體服務效能 2)多程序建立併發

嵌入式linux-sqlite3資料庫,程序併發伺服器,線上詞典

文章目錄 1,簡介: 2,框架圖 2.1,客戶端框架 2.1,伺服器端框架 3,程式碼 3.1,客戶端程式碼 3.2,伺服器端程式碼 1,簡介: 1,線上詞典

嵌入式Linux網路程式設計,TCP併發伺服器,TCP執行緒併發伺服器,TCP程序併發伺服器

文章目錄 1,TCP多執行緒併發伺服器 1.1,標頭檔案net.h 1.2,客戶端client.c 1.3,伺服器端server.c 2,TCP多程序併發伺服器 2.1,標頭檔案net.h 2.2,客

linux(一)------程序併發伺服器實現(fork)

本文實現一個多程序併發伺服器 實現思路: 利用fork()函式實現每有一個client連線時就會建立一個子程序程序與client通訊,父程序負責回收子程序的PCB 直接上程式碼! #include <stdio.h> #i

Linux 網路程式設計 全解(四)--------程序併發伺服器執行緒併發伺服器

寫在前面:這個系列也是停滯了20多天了,從今天開始再次步入正軌,以後每個週末都會陸陸續續的更新,這個系列預計完結的時間還會在大約一個月左右,今天靜下心來多整理幾篇。QQ:993650814 正文: 一、多程序併發伺服器     設計思路:當有新的客戶端連線到

[work] Linux Shell程序併發以及併發數控制

1. 基礎知識準備 1.1. linux後臺程序 Unix是一個多工系統,允許多使用者同時執行多個程式。shell的元字元&提供了在後臺執行不需要鍵盤輸入的程式的方法。輸入命令後,其後緊跟&字元,該命令就會被送往到linux後臺執行,而終端又可以繼續輸入下一個命令了。&nbs

Linuxsocket程式設計之程序TCP伺服器

程式碼如下: tcp_server.c #include<string.h> #include<stdlib.h> #include<stdio.h> #include<sys/types.h> #includ

程序併發如何防止殭屍程序——伺服器開發

在併發伺服器設計中,很常用的一種辦法是用fork為每個連線建立子程序來單獨處理客戶端請求。 流程圖如下: 可見,在父程序中直接執行accept等待下一個連線而並沒有用wait或者waitpid來等待子程序返回。這會造成怎樣的後果呢?當子程序exit退出的時候,它並沒有真正

TCP客戶端/伺服器網路程式設計------程序併發模型(附帶實現)

多程序併發模型相比同步阻塞迭代模型,多程序併發模型可以避免是程式阻塞在read系統呼叫上。如果沒有客戶端來建立連線,則會阻塞在accept處。一旦某個客戶端連線建立起來,則立即開啟一個新的程序來處理與這個客戶的資料互動。避免程式阻塞在read呼叫,而影響其他客戶端的連線。缺陷

Python學習程序併發寫入同一檔案

最近學習了Python的多程序,想到我的高德API爬蟲那個爬取讀寫速度我就心累,實在是慢,看到多程序可以充分利用CPU核數我就開始完善我的程式碼,不過過程是艱辛的,在此之中出現了很多問題,其中最大的問題是爬取的資料是正確的,但是讀寫到Excel中卻開啟是空,想了半天也沒解決,腦子笨沒辦法,不過我

Linux程式設計——程序程式設計

    本文學習Linux環境下的多程序程式設計,在我之前的文章裡已經講過程序與執行緒。本文,再簡單講一下程序的概念,方便接下來的學習。     程序定義:程序是一個具有一定獨立功能的程式的一次執行活動。     程序狀態圖:

Linux程式設計 程序執行緒求解PI(圓周率)

題目: 連結 多程序: #include <unistd.h> #include <stdio.h> #include <stdlib.h> #define n 100000000.0 int main() { i

Python程序併發操作程序池Pool

目錄: multiprocessing模組 Pool類 apply apply_async map close terminate join 程序例項 multiprocessing模組 如果你打算編寫多程序的服務程式,Unix/

Linux程序執行緒之間的區別

http://blog.csdn.net/byrsongqq/article/details/6339240 網路程式設計中設計併發伺服器,使用多程序與多執行緒 ,請問有什麼區別?  答案一: 1,程序:子程序是父程序的複製品。子程序獲得父程序資料空間、堆和棧的複製品。 2,執行緒:相

Python程序 併發 multiprocessing庫

庫:multipprocessing 例項: #!/usr/bin/env python # -*- coding:utf-8 -*- import multiprocessing import time def action(sub_process_name): f

PX4概念學習(1)——Linux程序執行緒基礎

【學習Freeape大神的uORB時,乘機補補有關Linux多程序、多執行緒的知識】 uORB(Micro Object Request Broker,微物件請求代理器)是PX4/Pixhawk系統中非常重要且關鍵的一個模組,它肩負了整個系統的資料傳輸任務,所有的感測器資料