消息队列是可以实现没有共同关系的进程之间的通信。Socket则可以实现不同计算机的不同进程之间的通信。

//地址的结构体
struct sockaddr_in{
short int sin_family;//AF_INET
unsigned short int sin_port;//端口号
struct in_addr sin_addr;//IP地址
}; struct in_addr{
unsigned long int s_addr;
};

几个重要的函数:

//创建socket
int socket(int domain, int type, int protocol); //命名(绑定)套接字 服务器采用
int bind( int socket, const struct sockaddr *address, size_t address_len); //创建套接字队列(监听)
int listen(int socket, int backlog); //接受连接
int accept(int socket, struct sockaddr *address, size_t *address_len); //请求连接
int connect(int socket, const struct sockaddr *address, size_t address_len);

服务器接收来自客户的信息:

客户发送信息:

客户端代码:

#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h> int main(){ int sockfd = -;
struct sockaddr_in address; //创建套接字
sockfd = socket(AF_INET, SOCK_STREAM, ); //对地址结构体赋值
address.sin_family = AF_INET;
address.sin_addr.s_addr = inet_addr("127.0.0.1");
address.sin_port = htons(); //连接服务器的时候 要把套接字和地址结构传进去
connect(sockfd, (struct sockaddr*)&address, sizeof(address)); printf("Connect OK!\n"); printf("Enter a string\n"); char buffer[];
memset(buffer,'\0',); fgets(buffer,,stdin); //socketfd的用处在这里,通过write和read来读写数据 write(sockfd,buffer,); memset(buffer,'\0',); read(sockfd,buffer,); printf("%s\n",buffer); close(sockfd); }

服务端代码:

#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h> int main(){ int server_sockfd = -;
int client_sockfd = -; struct sockaddr_in server_addr;
struct sockaddr_in client_addr; server_sockfd = socket(AF_INET, SOCK_STREAM, );
//internet stream protocol server_addr.sin_family = AF_INET;
//接收任何地址
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
server_addr.sin_port = htons(); //绑定才能被别人找到
bind(server_sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr)); //创建队列
listen(server_sockfd, ); //create end while(){ printf("Server start!\n"); char buffer[];
memset(buffer,'\0',); int client_len = sizeof(client_addr); //接收成功会返回客户的文件描述符 把客户的地址信息填到client_addr里面
client_sockfd = accept(server_sockfd, (struct sockaddr*)&client_addr, &client_len); //调用子进程来处理
if(fork()==){ //in child process read(client_sockfd,buffer,); printf("client:\n");
printf("%ld\n",client_addr.sin_addr.s_addr);
printf("%d\n",client_addr.sin_port);
printf("Message:%s\n",buffer); write(client_sockfd,"Get Message\n",); close(client_sockfd); }
else{ close(client_sockfd); } } }

linux 进程通信 :流套接字的更多相关文章

  1. Linux进程间通信——使用流套接字

    前面说到的进程间的通信,所通信的进程都是在同一台计算机上的,而使用socket进行通信的进程可以是同一台计算机的进程,也是可以是通过网络连接起来的不同计算机上的进程.通常我们使用socket进行网络编 ...

  2. IPC——流套接字通信

    Linux进程间通信——使用流套接字 前面说到的进程间的通信,所通信的进程都是在同一台计算机上的,而使用socket进行通信的进程可以是同一台计算机的进程,也是可以是通过网络连接起来的不同计算机上的进 ...

  3. Linux进程间通信——使用数据报套接字

    前一篇文章, Linux进程间通信——使用流套接字介绍了一些有关socket(套接字)的一些基本内容,并讲解了流套接字的使用,这篇文章将会给大家讲讲,数据报套接字的使用. 一.简单回顾——什么是数据报 ...

  4. Linux进程间通信(八):流套接字 socket()、bind()、listen()、accept()、connect()、read()、write()、close()

    前面说到的进程间的通信,所通信的进程都是在同一台计算机上的,而使用socket进行通信的进程可以是同一台计算机的进程,也是可以是通过网络连接起来的不同计算机上的进程.通常我们使用socket进行网络编 ...

  5. Linux网络通信(TCP套接字编写,多进程多线程版本)

    预备知识 源IP地址和目的IP地址 IP地址在上一篇博客中也介绍过,它是用来标识网络中不同主机的地址.两台主机进行通信时,发送方需要知道自己往哪一台主机发送,这就需要知道接受方主机的的IP地址,也就是 ...

  6. [linux basic基础]----套接字

    套接字是一种通信机制,凭借这种机制client/server系统的开发者既可以在本地机器上进行,也可以跨网络进行. 1,服务器应用程序用系统调用socket来创建一个套接字,他是系统分配给服务器进程的 ...

  7. Linux学习笔记30——套接字

    一 什么是套接字 套接字是一种通信机制,凭借这种机制,客户/服务器系统的开发既可以在本地单机上进行,也可以跨网络进行. 二 套接字属性 套接字的特性由3个属性确定,它们是:域,类型和协议   1 套接 ...

  8. Linux网络编程之套接字基础

    1.套接字的基本结构 struct sockaddr 这个结构用来存储套接字地址. 数据定义: struct sockaddr { unsigned short sa_family; /* addre ...

  9. unix, PF_UNIX, AF_UNIX, PF_LOCAL, AF_LOCAL - 用于本地内部进程通讯的套接字。

    SYNOPSIS(总览) #include <sys/socket.h> #include <sys/un.h> unix_socket = socket(PF_UNIX, t ...

  10. Linux进程通信----匿名管道

    Linux进程通信中最为简单的方式是匿名管道 匿名管道的创建需要用到pipe函数,pipe函数参数为一个数组表示的文件描述字.这个数组有两个文件描 述字,第一个是用于读数据的文件描述符第二个是用于写数 ...

随机推荐

  1. [持续更新]Python 笔记

    本文以 Python 2.7 为基础. lambda 函数实现递归 方法一:传递一个 self 参数 求阶乘: frac = lambda self, x: self(self, x - 1) * x ...

  2. POJ3696 The Windy's 【网络流】

    #include<iostream> #include<vector> #include<cstring> #include<algorithm> #i ...

  3. Java8中计算日期时间差

    一.简述 在Java8中,我们可以使用以下类来计算日期时间差异: 1.Period 2.Duration 3.ChronoUnit 二.Period类 主要是Period类方法getYears(),g ...

  4. 在MEF中实现延迟加载部件(转)

    在MEF的宿主中,当我们通过Import声明导入的对象时,组装(Compose)的时候会创建该对象.例如: interface ILogger    {        void Log(string  ...

  5. iOS7 自己定义动画跳转

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/Liar0606/article/details/26399125 简单介绍 在iOS7系统中,假设你 ...

  6. 怎样在windows下和linux下获取文件(如exe文件)的具体信息和属性

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/xmt1139057136/article/details/25620685 程序猿都非常懒.你懂的! ...

  7. 性能指标术语&理发店模型

    2015-11-26 09:13:53 响应时间 响应时间=呈现时间+系统响应时间 呈现时间取决于数据在被客户端收后到呈现出页面所消耗的时间: 系统响应时间指应用系统从请求发出开始到客户端接收到数据所 ...

  8. filter敏感词替换

    1.properties文件的应用 在<filter>写入配置 <filter> <filter-name>myFilter</filter-name> ...

  9. c# winform委托的使用

    可参考http://bbs.csdn.net/topics/390377875中使用new Action<>的使用方式,替代delegate的申明. public delegate voi ...

  10. flask 之 rabbit

    使用pika库操作rabbit 查找whereis rabbitmq-server 启动/usr/sbin/rabbitmq-server & 打印了一些rabbitmq服务状态信息,包括内存 ...