`

Linux下Socket通信(IPC)

    博客分类:
  • C
 
阅读更多

1、Linux下的Socket通信是一种基于文件的IPC通信,也可以是基于其他设备的IPC通信。它可以在本机内不同进程间实现通信,也可以在实现不同主机之间的通信。

2、Socket是一种进程间通信模式:
对等模式(P2P):一对一:UDP
客户服务器模式(C/S):一对多:TCP

3、基本创建步骤
(1)通过socket()函数创建socket
(2)通过bind函数绑定socket于设备地址
(3)进行读写操作read/recv/recvfrom write/send/sendto
(4)close方法关闭套接字

4、下面是其中用到的一些函数的用法及说明
(1)socket函数
int socket(int domain,int type, int protocol)
domain:地址族 IF_INET与底层内核通信(原生数据包)
type:通信的数据格式
protocol:传递数的含义

通信的数据类型:
SOCK_STREAM:字节流(一对多)
SOCK_DGRAM:字节包(一对一)
SOCK_RAW:硬件层的原生数据包 

通信的协议:
0:默认协议:地址族+数据格式=唯一决定协议
指定协议 IPPROTO_TCP
        IPPROTO_UDP
        IPPROTO_IP
        IPPROTO_ICMP
        IPPROTO_IGMP

(2)bind函数
把socket绑定到一个通信地址
int bind(int sockfd,const struct sockaddr* addr,socklen_t len)
sockfd:绑定地址的socket
addr:地址
len:地址内存长度
返回:成功是0,失败是-1

(3)recvfrom函数
如果想返回数据发送者的地址,则使用recvfrom.
int recvfrom(int fd,
 void *buf,
 size_t len,
 int flag,
 struct sockaddr*addr,//返回数据发送者的地址) ssocklen_t *l);//输入返回地址缓冲长度,返回实际发送者的地址长度

(4)write/send/sendto函数
int sendto(int fd,//发送socket
    const void *buf,//发送的数据
    size_t len,//发送数据的长度
    int flag,//发送数据的方式,建议为0
    const struct sockaddr *addr,//数据        发往的目的地址
    socklen_t l);//地址长度
  返回:
    -1:发送失败
    否则就是发送的字节数。

 

代码如下:

test1.c

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int main(void)
{
	//create socket
	int fd = socket(AF_INET, SOCK_DGRAM, 0);
	if(fd==-1)
	{
		perror("socket\n");
		exit(-1);
	}
	printf("socket fd=%d\n",fd);

	//build connection address
	struct sockaddr_in addr;
	addr.sin_family = AF_INET;
	addr.sin_port = htons(6666);
	addr.sin_addr.s_addr = inet_addr("127.0.0.1");

	int r;
	r = bind(fd,(struct sockaddr*)&addr,sizeof(addr));
	if(r==-1)
	{
		perror("bind");
		close(fd);
		exit(-1);
	}
	printf("bind address successful!\n");
	//accept or send message
	char buf[255];
	struct sockaddr_in from;
	socklen_t len;
	len = sizeof(from);
	while(1)
	{
		r = recvfrom(fd,buf,sizeof(buf)-1,0,(struct sockaddr*)&from,&len);
		if(r>0)
		{
			buf[r]=0;
			printf("The message from %s is:%s\n",inet_ntoa(from.sin_addr),buf);
		}
		else
		{
			break;
		}
	}
	//close socket
	close(fd);
	return 0;
}

test2.c

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int main(void)
{
	//create socket
	int fd = socket(AF_INET,SOCK_DGRAM,0);
	if(fd==-1)
	{
		perror("socket");
		exit(-1);
	}
	printf("create socket OK!\n");
	//create an send address
	struct sockaddr_in addr={};
	addr.sin_family = AF_INET;
	addr.sin_port = htons(6666);
	addr.sin_addr.s_addr=inet_addr("127.0.0.1");
	//send the message to the specify address
	int r;
	char buf[255];
	while(1)
	{
		r = read(0,buf,sizeof(buf)-1);
		if(r<=0)
			break;
		sendto(fd,buf,r,0,(struct sockaddr*)&addr,sizeof(addr));
	}
	//close socket
	close(fd);
	return 0;
}

 运行结果如下:(先运行test1.o,然后运行test2.o,在test2.c运行后输入内容,在test1.c所在终端中就会显示信息)



 

以下是一些好的博客:http://blog.sina.com.cn/s/blog_48d101870100n7e9.html

  • 大小: 11.5 KB
  • 大小: 15.6 KB
分享到:
评论

相关推荐

    ipc_socket-2

    linux 进程间通信 socket 实现

    ipc_socket-1

    linux 进程间通信 socket 实现

    linux IPC之socket解析及实例代码

    Linux下的Socket通信是一种基于文件的IPC通信,也可以是基于其他设备的IPC通信。它可以在本机内不同进程间实现通信,也可以在实现不同主机之间的通信。 socket的创建步骤 服务端 1.通过socket()函数创建socket 2....

    嵌入式操作系统作业,Linux自定义内核模块编写,Linux进程间通信(Socket IPC)+源代码+文档说明

    嵌入式操作系统作业,Linux自定义内核模块编写,Linux进程间通信(Socket IPC)+源代码+文档说明 不懂运行,下载完可以私聊问,可远程教学 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源...

    Linux下sokcet聊天进程版

    本程序是基于Linux下,socket开发,实现了利用父子进程进行通信

    Linux下进程间通信FIFO演示程序

    一个简单程序,演示了Linux下的FIFO IPC机制 http://blog.csdn.net/ZhengZhiRen/archive/2010/05/21/5613843.aspx

    Linux进程通信(IPC)方式简介

    linux下进程间通信的几种主要方式:管道(pipe)和有名管道(FIFO)、信号(signal)、消息队列、共享内存(shared memory)、信号量(semaphore)、套接字(socket),本文对这些做简单介绍

    Linux操作系统实验报告

    熟悉Linux常用命令 实验二 Linux下程序设计基础 实验三 Linux下进程间管道通信 实验四 IPC进程间共享内存通信 实验五 IPC信号量使用 实验六 Linux内存基本原理 实验八 设备驱动程序 实验九 Linux下socket网络通信

    android IPC及原理简介

    Linux 系统中进程间通信的方式有:socket, named pipe,message queque, signal,share memory。Java系统中的进程间通信方式有socket, named pipe等。android应用程序理所当然可以应用JAVA的IPC机制实现进程间的通信, ...

    Linux-IPC-进程间通信实例

    Linux下6种进程间通信的服务端和客户端实例。

    linux网络编程

    21socket编程(十六) UNIX域协议特点 UNIX域地址结构 UNIX域字节流回射客户/服务 UNIX域套接字编程注意点 22socket编程(十七) socketpair sendmsg/recvmsg UNIX域套接字传递描述符字 Linux网络编程之进程间通信篇...

    嵌入式系统/ARM技术中的linux下的进程通信

     linux下的进程通信手段基本上是从Unix平台上的进程通信手段继承而来的。而对Unix发展做出重大贡献的两大主力AT&T的贝尔实验室及BSD(加州大学伯克利分校的伯克利软件发布中心)在进程间通信方面的侧重点有所不同。...

    Linux下C编程函数手册/linux下C编程必备函数大全

    第20章 进程通信(IPC)函数 第21章 记录函数 第22章 环境变量函数 第23章 正则表达式 第24章 动态函数 第25章 其它函数 附录:编译程序,宏,不定参数,linux信号列表,常见错误代码及原因 pdf文档,400多页,函数大全,每...

    进程间通信(IPC)介绍

    其中Socket和Streams支持不同主机上的两个进程IPC。以Linux中的C语言编程为例。管道,通常指无名管道,是UNIX系统IPC最古老的形式。1、特点:它是半双工的(即数据只能在一个方向上流动),具有固定的读端和写端。它...

    Linux网络编程 视频 教程

    Linux网络编程之socket编程篇 Linux网络编程之进程间通信篇 Linux网络编程之线程篇 Linux网络编程之TCP/IP基础篇 01TCPIP基础(一) ISO/OSI参考模型 TCP/IP四层模型 基本概念(对等通信、封装、分用、端口)...

    精简的linux核心编程

    主要描述了linux下VI编辑器,IPC,信号机制,多线程编程,socket网络通信

    基于linux的进程通信设计方案

    linux下的进程通信手段基本上是从Unix平台上的进程通信手段继承而来的。而对Unix发展做出重大贡献的两大主力AT&T的贝尔实验室及BSD(加州大学伯克利分校的伯克利软件发布中心)在进程间通信方面的侧重点有所不同。...

    嵌入式系统/ARM技术中的基于linux的进程通信设计方案

    linux下的进程通信手段基本上是从Unix平台上的进程通信手段继承而来的。而对Unix发展做出重大贡献的两大主力AT&T的贝尔实验室及BSD(加州大学伯克利分校的伯克利软件发布中心)在进程间通信方面的侧重点有所不同。...

Global site tag (gtag.js) - Google Analytics