gpt4 book ai didi

linux IPC之socket解析及实例代码

转载 作者:qq735679552 更新时间:2022-09-28 22:32:09 33 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章linux IPC之socket解析及实例代码由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

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

socket的创建步骤 。

服务端 。

1.通过socket()函数创建socket 2.通过bind函数绑定socket于设备地址 3.通过listen监听指定的socket 4.通过accept等待客户端的连接 。

客户端 。

1.通过socket()函数创建socket 2.通过connect连接到服务端 。

待经过上面的步骤后,服务端和客户端已经建立了链接,可以通过write/read或者sendto/recvfrom发送/接收数据. 。

示列 。

1.服务端 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
//s_unix.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#define UNIX_DOMAIN "/tmp/UNIX.domain"
int main( void )
{
   socklen_t clt_addr_len;
   int listen_fd;
   int com_fd;
   int ret;
   int i;
   static char recv_buf[1024];
   int len;
   struct sockaddr_un clt_addr;
   struct sockaddr_un srv_addr;
   listen_fd=socket(PF_UNIX,SOCK_STREAM,0);
   if (listen_fd<0)
   {
     perror ( "cannot create communication socket" );
     return 1;
   }
 
   //set server addr_param
   srv_addr.sun_family=AF_UNIX;
   strncpy (srv_addr.sun_path,UNIX_DOMAIN, sizeof (srv_addr.sun_path)-1);
   unlink(UNIX_DOMAIN);
   //bind sockfd & addr
   ret=bind(listen_fd,( struct sockaddr*)&srv_addr, sizeof (srv_addr));
   if (ret==-1)
   {
     perror ( "cannot bind server socket" );
     close(listen_fd);
     unlink(UNIX_DOMAIN);
     return 1;
   }
   //listen sockfd
   ret=listen(listen_fd,1);
   if (ret==-1)
   {
     perror ( "cannot listen the client connect request" );
     close(listen_fd);
     unlink(UNIX_DOMAIN);
     return 1;
   }
   //have connect request use accept
   len= sizeof (clt_addr);
   com_fd=accept(listen_fd,( struct sockaddr*)&clt_addr,&len);
   if (com_fd<0)
   {
     perror ( "cannot accept client connect request" );
     close(listen_fd);
     unlink(UNIX_DOMAIN);
     return 1;
   }
   //read and printf sent client info
   printf ( "/n=====info=====/n" );
   for (i=0;i<4;i++)
   {
     memset (recv_buf,0,1024);
     int num=read(com_fd,recv_buf, sizeof (recv_buf));
     printf ( "Message from client (%d)) :%s/n" ,num,recv_buf);
   }
   close(com_fd);
   close(listen_fd);
   unlink(UNIX_DOMAIN);
   return 0;
}

2.客户端 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
//c_unix.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#define UNIX_DOMAIN "/tmp/UNIX.domain"
int main( void )
{
   int connect_fd;
   int ret;
   char snd_buf[1024];
   int i;
   static struct sockaddr_un srv_addr;
//creat unix socket
   connect_fd=socket(PF_UNIX,SOCK_STREAM,0);
   if (connect_fd<0)
   {
     perror ( "cannot create communication socket" );
     return 1;
  
   srv_addr.sun_family=AF_UNIX;
   strcpy (srv_addr.sun_path,UNIX_DOMAIN);
//connect server
   ret=connect(connect_fd,( struct sockaddr*)&srv_addr, sizeof (srv_addr));
   if (ret==-1)
   {
     perror ( "cannot connect to the server" );
     close(connect_fd);
     return 1;
   }
   memset (snd_buf,0,1024);
   strcpy (snd_buf, "message from client" );
//send info server
   for (i=0;i<4;i++)
     write(connect_fd,snd_buf, sizeof (snd_buf));
   close(connect_fd);
   return 0;
}

总结 。

以上就是本文关于linux IPC之socket解析及实例代码的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持! 。

原文链接:http://blog.csdn.net/u010657219/article/details/44059073 。

最后此篇关于linux IPC之socket解析及实例代码的文章就讲到这里了,如果你想了解更多关于linux IPC之socket解析及实例代码的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com