socketpair机制

183 篇文章 24 订阅

描述

先看下传统的CS模型,如下:

总是一方发起请求,等待另一方回应。当一次传输完成之后,client端发起新的请求之后,server端才作出回应。 那如何才能做到双向通信?  一种解决办法就是client端即使client,又是server,server端即使client也是server,如下:

但是上述方面比较复杂,这时候就引入要分析的socketpair了。

socketpair用于创建一对相互连接的unnamed socket。而pipe系统调用使用创建的pipe也是相互连接的unnamed pipe(无名管道)。而pipe和socketpair创建的描述符之间的区别就是:  pipe创建的描述符一端只能用于读,一端用于写,而socketpair创建的描述符任意一端既可以读也可以写。

原理

使用socketpiar创建的是一对相互连接的socket,任意一段既可以做发送,也可以做接受端。所有每个socket描述符中应该有两个buf。一个为发送buf,一个为接受buf。如上图所示。

示例代码:

 
  1. #include <stdio.h>

  2. #include <sys/types.h>

  3. #include <sys/socket.h>

  4. #include <pthread.h>

  5. #define SOCKET_BUFFER_SIZE (32768U)

  6. void *thread_function(void *arg)

  7. {

  8. int len = 0;

  9. int fd = *((int*)(arg));

  10. char buf[500];

  11. int cnt = 0;

  12. /*主线程*/

  13. while(1)

  14. {

  15. /*向main thread线程发送数据*/

  16. len = sprintf(buf, "Hi, main process, cnt = %d", cnt++);

  17. write(fd, buf, len);

  18. /*读数据*/

  19. len = read(fd, buf, 500);

  20. buf[len]='\0';

  21. printf("%s\n",buf);

  22. sleep(5);

  23. }

  24. return NULL;

  25. }

  26. int main()

  27. {

  28. int ret;

  29. int sockets[2];

  30. int bufferSize = SOCKET_BUFFER_SIZE;

  31. pthread_t thread;

  32. ret = socketpair(AF_UNIX, SOCK_SEQPACKET, 0, sockets);

  33. if(ret == -1)

  34. {

  35. printf("socketpair create error!\n");

  36. return -1;

  37. }

  38. /*设置socket描述符的选项*/

  39. setsockopt(sockets[0], SOL_SOCKET, SO_SNDBUF, &bufferSize, sizeof(bufferSize));

  40. setsockopt(sockets[0], SOL_SOCKET, SO_RCVBUF, &bufferSize, sizeof(bufferSize));

  41. setsockopt(sockets[1], SOL_SOCKET, SO_SNDBUF, &bufferSize, sizeof(bufferSize));

  42. setsockopt(sockets[1], SOL_SOCKET, SO_RCVBUF, &bufferSize, sizeof(bufferSize));

  43. /*创建线程1*/

  44. pthread_create(&thread, NULL, thread_function, (void*)(&sockets[1]));

  45. int len = 0;

  46. int fd = sockets[0];

  47. char buf[500];

  48. int cnt = 0;

  49. /*主线程*/

  50. while(1)

  51. {

  52. /*读数据*/

  53. len = read(fd, buf, 500);

  54. buf[len]='\0';

  55. printf("%s\n",buf);

  56. /*项thread线程发送数据*/

  57. len = sprintf(buf, "Hi, thread process, cnt = %d", cnt++);

  58. write(fd, buf, len);

  59. }

  60. return 0;

  61. }


测试结果:

1.  编译代码

gcc socketpair.c -o socketpair -lpthread


2. 运行,查看结果

 
  1. test$ ./socketpair

  2. Hi, main process, cnt = 0

  3. Hi, thread process, cnt = 0

  4. Hi, main process, cnt = 1

  5. Hi, thread process, cnt = 1

  6. Hi, main process, cnt = 2

  7. Hi, thread process, cnt = 2


 

注意:  socketpair创建的只适用于父子进程或者线程间通信,不能用于两个进程之间通信。如果要实现两个进程之间的双向通信,则需要将socketpair创建的一个描述符fd发送给另一个进程,这相当于两个两个不同的进程访问同一个文件。

socketpair机制-CSDN博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值