TCP编程:多进程(fork)并发处理客户端请求

忽略SIGCHLD信号,交给内核处理子进程,避免产生僵尸进程。

服务器端:

 1 #include <iostream>
 2 #include <netinet/in.h>
 3 #include <cstring>
 4 #include <unistd.h>
 5 #include<signal.h>
 6
 7 #define MAXLINE 4096
 8
 9 int main(int argc,char ** argv) {
10
11     signal(SIGCHLD, SIG_IGN);
12     int listenfd,connfd;
13     struct sockaddr_in servaddr;
14     char buff[4096];
15     int n;
16
17     if((listenfd = socket(AF_INET,SOCK_STREAM,0)) == -1){
18         printf("create socket error:%s(errno: %d)\n",strerror(errno),errno);
19         return 0;
20     }
21
22     memset(&servaddr,0,sizeof(servaddr));
23     servaddr.sin_family = AF_INET;
24     servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
25     servaddr.sin_port = htonl(6666);
26
27     if(bind(listenfd,(struct sockaddr*)&servaddr,sizeof(servaddr)) == -1){
28         printf("bind socket error: %s(errno: %d)\n",strerror(errno),errno);
29         return 0;
30     }
31
32     if(listen(listenfd,10) == -1){
33         printf("listen socket error:%s(errno: %d)\n",strerror(errno),errno);
34         return 0;
35     }
36
37     printf("======waiting for client‘s request======\n");
38     while(1){
39
40         if((connfd = accept(listenfd,(struct sockaddr*)NULL,NULL)) == -1){
41
42             printf("accept socket error:%s(errno:%d)\n",strerror(errno),errno);
43             continue;
44
45         }
46          pid = fork();
47         if (pid == -1)
48             ERR_EXIT("fork error");
49         if (pid == 0)
50         {
51
52             close(listenfd);
53             while(1){
54                     n = recv(connfd,buff,MAXLINE,0);
55                     buff[n] = ‘\0‘;
56                     printf("recv msg from client:%s\n",buff);
57                     close(connfd);
58             }
59             exit(EXIT_SUCCESS);
60         }
61         else
62             close(conn);
63     }
64
65     return 0;
66 }
67        

客户端:

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<string.h>
 4 #include<errno.h>
 5 #include<sys/types.h>
 6 #include<sys/socket.h>
 7 #include<netinet/in.h>
 8 #include<arpa/inet.h>
 9 #include<unistd.h>
10 #define MAXLINE 4096
11
12 int main(int argc, char** argv){
13     int   sockfd, n;
14     char  recvline[4096], sendline[4096];
15     struct sockaddr_in  servaddr;
16
17     if( argc != 2){
18         printf("usage: ./client <ipaddress>\n");
19         return 0;
20     }
21
22     if( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){
23         printf("create socket error: %s(errno: %d)\n", strerror(errno),errno);
24         return 0;
25     }
26
27     memset(&servaddr, 0, sizeof(servaddr));
28     servaddr.sin_family = AF_INET;
29     servaddr.sin_port = htons(6666);
30     if( inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0){
31         printf("inet_pton error for %s\n",argv[1]);
32         return 0;
33     }
34
35     if( connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0){
36         printf("connect error: %s(errno: %d)\n",strerror(errno),errno);
37         return 0;
38     }
39
40     printf("send msg to server: \n");
41     fgets(sendline, 4096, stdin);
42     if( send(sockfd, sendline, strlen(sendline), 0) < 0){
43         printf("send msg error: %s(errno: %d)\n", strerror(errno), errno);
44         return 0;
45     }
46     close(sockfd);
47     return 0;
48 }

时间: 2024-08-22 04:41:35

TCP编程:多进程(fork)并发处理客户端请求的相关文章

TCP编程2: 客户端给服务器端发信息,服务器端将信息打印到控制台上,同时发送&quot;已收到信息&quot;给客户端

import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; import java.net.UnknownHostException; import org.junit.Test; /* * TCP编程例二: * 客户端给服

第13章 TCP编程(3)_基于自定义协议的多进程模型

5. 自定义协议编程 (1)自定义协议:MSG //自定义的协议(TLV:Type length Value) typedef struct{ //协议头部 char head[10];//TLV中的T unsigned int checkNum; //校验码 unsigned int cbSizeContent; //协议体的长度 //协议体部 char buff[512]; //数据 }MSG; (2)自定义读写函数 ①extern int write_msg(int sockfd, cha

网络编程TCP/IP与UDP实现客户端与客户端聊天

一.TCP/IP协议 既然是网络编程,涉及几个系统之间的交互,那么首先要考虑的是如何准确的定位到网络上的一台或几台主机,另一个是如何进行可靠高效的数据传输.这里就要使用到TCP/IP协议. TCP/IP协议(传输控制协议)由网络层的IP协议和传输层的TCP协议组成.IP层负责网络主机的定位,数据传输的路由,由IP地址可以唯一的确定Internet上的一台主机.TCP层负责面向应用的可靠的或非可靠的数据传输机制,这是网络编程的主要对象. 二.TCP与UDP TCP是一种面向连接的保证可靠传输的协议

基于TCP网络通信的自动升级程序源码分析-客户端请求服务器上的升级信息

每次升级,客户端都会获取服务器端存放在upgradefile文件夹下的需要升级的文件和升级信息配置文件(即upgradeconfig.xml文件) 我们来看一下代码 //升级信息配置文件相对应的类 ( 升级信息配置文件是由这个类转化成的) private UpgradeConfig upgradeConfig = null; //客户端存储升级配置文件的地址 是放在客户端根目录下的 (就是把服务器 upgradefile/upgradeconfig.xml下载到客户端存放的位置) string

TCP编程例三:从客户端发送文件给服务器端,服务器端保存到本地,并返回“发送成功”给客户端。

import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.InetAddress; import java.

.Net TCP探索(一)——TCP服务端开发(同时监听多个客户端请求)

????最近在园子里看了大神写的(面试官,不要再问我三次握手和四次挥手),忍不住写段程序来测试一番. ????在网上找了很多例子,大多只实现了TCP点对点通讯,但实际应用中,一个服务器端口往往要监听多个客户端发来的消息. 测试工具下载:https://download.csdn.net/download/nbyanghuichao/11872360 ????本例采用System.Threading实现多线程监听,下面只介绍核心代码,省略了消息提示和错误处理,可以从我的GitHub获取完整代码:h

第13章 TCP编程(4)_基于自定义协议的多线程模型

7. 基于自定义协议的多线程模型 (1)服务端编程 ①主线程负责调用accept与客户端连接 ②当接受客户端连接后,创建子线程来服务客户端,以处理多客户端的并发访问. ③服务端接到的客户端信息后,回显给客户端 (2)客户端编程 ①从键盘输入信息,并发送给服务端 ②接收来自服务端的信息 //msg.h与前一节相同 #ifndef __MSG_H__ #define __MSG_H__ #include <sys/types.h> //求结构体中成员变量的偏移地址 #define OFFSET(T

嵌入式 Linux网络编程(二)——TCP编程模型

嵌入式 Linux网络编程(二)--TCP编程模型 一.TCP编程模型 TCP编程的一般模型如下图: TCP编程模型分为客户端和服务器端编程,两者编程流程如下: TCP服务器端编程流程: A.创建套接字: B.绑定套接字: C.设置套接字为监听模式,进入被动接受连接状态: D.接受请求,建立连接: E.读写数据: F.终止连接. TCP客户端编程流程: A.创建套接字: B.与远程服务器建立连接: C.读写数据: D.终止连接. 二.TCP迭代服务器编程模型 TCP循环服务器接受一个客户端的连接

【Socket编程】通过Socket实现TCP编程

通过Socket实现TCP编程 Socket通信 : 1.TCP协议是面向对象连接.可靠的.有序的,以字节流的方式发送数据. 2.基于TCP协议实现网络通信的类: 客户端----Socket类 服务器端----ServerSocket类 一.通信过程(Socket通信模型) Socket通信模型用下图所示: 1.在服务端建立一个ServerSocket,绑定相应的端口,并且在指定的端口进行侦听,等待客户端的连接. 2.当客户端创建连接Socket并且向服务端发送请求. 3.服务器收到请求,并且接