linux IPC之socket解析及实例代码

2025-05-27 0 59

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

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 linux IPC之socket解析及实例代码 https://www.kuaiidc.com/60113.html

相关文章

发表评论
暂无评论