基于TCP协议的进程间通信

根据TCP协议三次握手,server一直处于监听状态,等接受到client的请求连接(connect)信号,accept该连接。

  server:
   1 #include<stdio.h>
  2 #include<string.h>
  3 #include<unistd.h>
  4 #include<stdlib.h>
  5 #include<sys/socket.h>
  6 #include<sys/types.h>
  7 #include<netinet/in.h>
  8 #include<arpa/inet.h>
  9 #define _BACKLOG 5
 10 void usage(char *_proc)
 11 {
 12     printf("usage: %s,[ip],[proc]",_proc);
 13 }
 14 int startup(const char *ip,const int port)
 15 {
 16     int sock = socket(AF_INET,SOCK_STREAM,0); //创建套接字
 17     if(sock < 0)
 18     {
 19         perror("socket");
 20         exit(1);
 21     }
 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     if(bind(sock,(struct sockaddr*)&local,sizeof(local))<0) //将IP和端口号绑定
 27     {
 28         perror("bind");
 29         exit(2);
 30     }
 31     if(listen(sock,_BACKLOG)<0) //监听是否有进程与之创建连接
 32     {
 33         perror("listen");
 34         exit(3);
 35     }
 36     return sock;
 37 }
 38 void* pthread(void * arg)
 39 {
 40     int sock = (int)arg;
 41     char buf[1024];
 42     while(1)
 43     {
 44         ssize_t size = read(sock,buf,sizeof(buf)-1);
 45         if(size>0)
 46         {
 47             buf[size] = ‘\0‘;
 48         }
 49         else if(size==0)
 50         {
 51             printf("client close...\n");
 52             break;
 53         }
 54         else
 55         {
 56             perror("read");
 57             exit(3);
 58         }
 59         printf("client say: %s\n",buf);
 60     }
 61     close(sock);
 62     return NULL;
 63 }
 64 
 65 int main(int argc,char *argv[])
 66 {
 67     if(argc != 3)
 68     {
  69         usage(argv[0]);
 70         exit(1);
 71     }
 72     char *ip = argv[1];
 73     int port = atoi(argv[2]);
 74     int listen_sock = startup(ip,port);
 75     struct sockaddr_in client;
 76     socklen_t len = sizeof(client);
 77     while(1)
 78     {
 79         int new_sock = accept(listen_sock,(struct sockaddr*)&client,&len);
 80         if(new_sock<0)
 81         {
 82             perror("accept");
 83             continue;
 84         }
 85         printf("get a client... sock %d,ip: %s,port: %d\n",new_sock,inet_nto    a(client.sin_addr),ntohs(client.sin_port));
 86 #ifdef _V1_ //单进程通信
 87         char buf[1024];
 88         while(1)
 89         {
 90             ssize_t size = read(new_sock,buf,sizeof(buf)-1);
 91             if(size>0)
 92             {
 93                 buf[size] = ‘\0‘;
 94             }
 95             else if(size==0)
 96             {
 97                 printf("client close...\n");
 98                 break;
 99             }
100             else
101             {
102                 perror("read");
103                 exit(3);
104             }
105             printf("client say :%s\n",buf);
106         }
107 #elif _V2_ //多进程
108         pid_t pid = fork();
109         if(pid<0)
110         {                              
111             perror("fork");
112             exit(4);
113         }
114         else if(pid == 0)
115         {//child
116             close(listen_sock);
117             char *_client = inet_ntoa(client.sin_addr);
118             char buf[1024];
119             while(1)
120             {
121                 memset(buf,‘\0‘,sizeof(buf));
122                 ssize_t size = read(new_sock,buf,sizeof(buf)-1);
123                 if(size>0)
124                 {
125                     buf[size] = ‘\0‘;
126                 }
127                 else if(size==0)
128                 {
129                     printf("[ip]:%s close...\n",_client);
130                     break;
131                 }
132                 else
133                 {
134                     perror("read");
135                     exit(3);
136                 }
137                 printf("[ip]:%s say :%s\n",_client,buf);
138             }
139             close(new_sock);
140             exit(0);
141         }
142         else
143         {//father
144             close(new_sock);
145         }
146 #elif _V3_ //多线程
147         pthread_t pid;
148         pthread_create(&pid,NULL,pthread,(void*)new_sock);
149         pthread_detach(pid);
150 #else
151         printf("default");
152 #endif
153     }
154     return 0;
155 }

client:
   1 #include<stdio.h>
  2 #include<unistd.h>
  3 #include<stdlib.h>
  4 #include<sys/socket.h>
  5 #include<sys/types.h>
  6 #include<netinet/in.h>
  7 #include<arpa/inet.h>
  8 
  9 void usage(char *proc)
 10 {
 11     printf("usage:%s,[remote ip],[remote proc]",proc);
 12 }
 13 int main(int argc,char *argv[])
 14 {
 15     if(argc != 3)
 16     {
 17         usage(argv[0]);
 18         exit(1);
 19     }
 20     int sock = socket(AF_INET,SOCK_STREAM,0);
 21     if(sock<0)
 22     {
 23         perror("sock");
 24         exit(1);
 25     }
 26     int port = atoi(argv[2]);
 27     char *ip = argv[1];
 28     struct sockaddr_in remote;
 29     remote.sin_family = AF_INET;
 30     remote.sin_port = htons(port);
 31     remote.sin_addr.s_addr = inet_addr(ip);
 32 
 33     int ret = connect(sock,(struct sockaddr*)&remote,sizeof(remote));
 34     if(ret<0)
 35     {
 36         perror("connect");
 37         exit(2);
 38     }
 39     char buf[1024];
 40     while(1)
 41     {
 42         printf("please say: ");
 43         scanf("%s",buf);
 44         ssize_t size = write(sock,buf,sizeof(buf)-1);
 45 
 46     }
 47     return 0;
 48 }
 
 结果:
[[email protected] tcp]$ ./tcp_server 192.168.1.106 8080
get a client... sock 4,ip: 192.168.1.106,port: 51708
client say: hello
client say: hi
client say: nihao
client close...
^C
[[email protected] tcp]$ 
[[email protected] tcp]$ ./tcp_client 192.168.1.106 8080
please say: hello
please say: hi
please say: nihao 
please say: ^C
[[email protected] tcp]$
时间: 2025-01-15 11:25:10

基于TCP协议的进程间通信的相关文章

网络编程——基于TCP协议的Socket编程,基于UDP协议的Socket编程

Socket编程 目前较为流行的网络编程模型是客户机/服务器通信模式 客户进程向服务器进程发出要求某种服务的请求,服务器进程响应该请求.如图所示,通常,一个服务器进程会同时为多个客户端进程服务,图中服务器进程B1同时为客户进程A1.A2和B2提供服务. Socket概述 ①   所谓Socket通常也称作“套接字”,用于描述IP地址和端口,是一个通信链的句柄.应用程序通常通过“套接字”向网络发出请求或者应答网络请求. ②   Socket是连接运行在网络上的两个程序间的双向通信的端点. ③  

基于TCP协议的网络通信

**重点内容**1.使用InetAddress(IP地址类) 这个类有点儿奇葩,没有提供构造方法.而是有两个静态方法来实例化. ·getByName(String host) 通过主机名获取对应的InetAddress对象 ·getByAddress(byte[] addr) 通过IP地址获取对应的InetAddress对象 getCononicalHostName() 获取IP地址的全限定域名 getHostAddress() 返回IP地址字符串 getHostName() 获取IP地址的主机

用c++开发基于tcp协议的文件上传功能

用c++开发基于tcp协议的文件上传功能 2005我正在一家游戏公司做程序员,当时一直在看<Windows网络编程> 这本书,把里面提到的每种IO模型都试了一次,强烈推荐学习网络编程的同学阅读,比 APUE 讲的更深入 这是某个银行广告项目(p2p传输视频)的一部分 IO模型采用的阻塞模式,文件一打开就直接上传 用vc 2003编译,生成win32 dll 麻雀虽小五脏俱全,CSimpleSocket,CReadStream dll 输出一虚类 extern "C" __d

浅析C#基于TCP协议的SCOKET通信

TCP协议是一个基本的网络协议,基本上所有的网络服务都是基于TCP协议的,如HTTP,FTP等等,所以要了解网络编程就必须了解基于TCP协议的编程.然而TCP协议是一个庞杂的体系,要彻底的弄清楚它的实现不是一天两天的功夫,所幸的是在.net framework环境下,我们不必要去追究TCP协议底层的实现,一样可以很方便的编写出基于TCP协议进行网络通讯的程序. C#基于TCP协议的网络通讯 要进行C#基于TCP协议的网络通讯,首先必须建立同远程主机的连接,连接地址通常包括两部分--主机名和端口,

基于TCP协议的服务器中转简易聊天

项目比较简单:主要使用了TCP传输协议.多线程和swing窗口,以及IO流读写. 功能:各窗口之间简单的收发信息,另外附加一个抖动的效果. 服务器代码: 1 package com.java; 2 3 import java.awt.Dimension; 4 import java.awt.Toolkit; 5 import java.awt.event.ActionEvent; 6 import java.awt.event.ActionListener; 7 import java.awt.

基于TCP协议的简单Socket通信笔记(JAVA)

好久没写博客了,前段时间忙于做项目,耽误了些时间,今天开始继续写起~ 今天来讲下关于Socket通信的简单应用,关于什么是Socket以及一些网络编程的基础,这里就不提了,只记录最简单易懂实用的东西. 1.首先先来看下基于TCP协议Socket服务端和客户端的通信模型: Socket通信步骤:(简单分为4步) 1.建立服务端ServerSocket和客户端Socket 2.打开连接到Socket的输出输入流 3.按照协议进行读写操作 4.关闭相对应的资源 2.相关联的API: 1.首先先来看下S

Android基础入门教程——7.6.3 基于TCP协议的Socket通信(2)

Android基础入门教程--7.6.3 基于TCP协议的Socket通信(2) 标签(空格分隔): Android基础入门教程 本节引言: 上节中我们给大家接触了Socket的一些基本概念以及使用方法,然后写了一个小猪简易聊天室的 Demo,相信大家对Socket有了初步的掌握,本节我们来学习下使用Socket来实现大文件的断点续传! 这里讲解的是别人写好的一个Socket上传大文件的例子,不要求我们自己可以写出来,需要的时候会用 就好! 1.运行效果图: 1.先把我们编写好的Socket服务

Android基础入门教程——7.6.2 基于TCP协议的Socket通信(1)

Android基础入门教程--7.6.2 基于TCP协议的Socket通信(1) 标签(空格分隔): Android基础入门教程 本节引言: 上一节的概念课枯燥无味是吧,不过总有点收获是吧,本节开始我们来研究基于TCP协议的Socket 通信,先来了解下Socket的概念,以及Socket通信的模型,实现Socket的步骤,以及作为Socket服务 端与客户端的两位各做要做什么事情!好的,我们由浅入深来扣这个Socket吧! 1.什么是Socket? 2.Socket通信模型: Socket通信

(1)网络编程的常识 (2)基于tcp协议的编程模型 (3)tcp协议和udp协议的比较 (4)基于udp协议的编程模型

1.网络编程的常识 目前主流的网络通讯软件有:微信.QQ.YY.陌陌.探探.飞信.阿里旺旺.... 在吗? 1.1 七层网络模型(熟悉) 为了保证数据传递的可靠安全等等,ISO(国际标准委员会组织)将数据的传递从逻辑上划分为以下七层: 应用层.表示层.会话层.传输层.网络层.数据链路层.物理层. 在发送数据之前要按照上述七层协议从上到下一层一层进行加包处理,再发送出去; 在接收数据之后要按照上述七层协议从下到上一层一层进行拆包处理,再解析出来: 1.2 常用的协议(熟悉) http协议 - 超文