Linux下Socket通信(IPC),附实例

本文介绍Linux下Socket通信的基本原理及应用实例,涵盖Socket创建、绑定、读写操作等关键步骤,并提供具体C语言代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

C代码   收藏代码
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <unistd.h>  
  4. #include <netinet/in.h>  
  5. #include <arpa/inet.h>  
  6.   
  7. int main(void)  
  8. {  
  9.     //create socket  
  10.     int fd = socket(AF_INET, SOCK_DGRAM, 0);  
  11.     if(fd==-1)  
  12.     {  
  13.         perror("socket\n");  
  14.         exit(-1);  
  15.     }  
  16.     printf("socket fd=%d\n",fd);  
  17.   
  18.     //build connection address  
  19.     struct sockaddr_in addr;  
  20.     addr.sin_family = AF_INET;  
  21.     addr.sin_port = htons(6666);  
  22.     addr.sin_addr.s_addr = inet_addr("127.0.0.1");  
  23.   
  24.     int r;  
  25.     r = bind(fd,(struct sockaddr*)&addr,sizeof(addr));  
  26.     if(r==-1)  
  27.     {  
  28.         perror("bind");  
  29.         close(fd);  
  30.         exit(-1);  
  31.     }  
  32.     printf("bind address successful!\n");  
  33.     //accept or send message  
  34.     char buf[255];  
  35.     struct sockaddr_in from;  
  36.     socklen_t len;  
  37.     len = sizeof(from);  
  38.     while(1)  
  39.     {  
  40.         r = recvfrom(fd,buf,sizeof(buf)-1,0,(struct sockaddr*)&from,&len);  
  41.         if(r>0)  
  42.         {  
  43.             buf[r]=0;  
  44.             printf("The message from %s is:%s\n",inet_ntoa(from.sin_addr),buf);  
  45.         }  
  46.         else  
  47.         {  
  48.             break;  
  49.         }  
  50.     }  
  51.     //close socket  
  52.     close(fd);  
  53.     return 0;  
  54. }  

test2.c

Java代码   收藏代码
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <unistd.h>  
  4. #include <string.h>  
  5. #include <sys/socket.h>  
  6. #include <netinet/in.h>  
  7. #include <arpa/inet.h>  
  8.   
  9. int main(void)  
  10. {  
  11.     //create socket  
  12.     int fd = socket(AF_INET,SOCK_DGRAM,0);  
  13.     if(fd==-1)  
  14.     {  
  15.         perror("socket");  
  16.         exit(-1);  
  17.     }  
  18.     printf("create socket OK!\n");  
  19.     //create an send address  
  20.     struct sockaddr_in addr={};  
  21.     addr.sin_family = AF_INET;  
  22.     addr.sin_port = htons(6666);  
  23.     addr.sin_addr.s_addr=inet_addr("127.0.0.1");  
  24.     //send the message to the specify address  
  25.     int r;  
  26.     char buf[255];  
  27.     while(1)  
  28.     {  
  29.         r = read(0,buf,sizeof(buf)-1);  
  30.         if(r<=0)  
  31.             break;  
  32.         sendto(fd,buf,r,0,(struct sockaddr*)&addr,sizeof(addr));  
  33.     }  
  34.     //close socket  
  35.     close(fd);  
  36.     return 0;  
  37. }  

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



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值