呈现一张基本的socket阻塞式模型,如下图:

                    

 一: 对于一对一的进行C/S回射:

服务端(server.c):

  1. #include<unistd.h>
  2. #include<stdio.h>
  3. #include<string.h>
  4. #include<stdlib.h>
  5. #include<netinet/in.h>
  6. #include<sys/socket.h>
  7. #include<sys/types.h>
  8. #include<error.h>
  9.  
  10. #define ERR_EXIT(m) \
  11. do{ \
  12. perror(m); \
  13. exit(); \
  14. }while()
  15.  
  16. int
  17. main (void)
  18. {
  19. int sock, conn;
  20. if ((sock = socket (PF_INET, SOCK_STREAM, )) < )
  21. ERR_EXIT ("socket");
  22. struct sockaddr_in sockaddr;
  23. memset (&sockaddr, , sizeof (sockaddr));
  24. sockaddr.sin_family = AF_INET;
  25. sockaddr.sin_port = htons ();
  26. sockaddr.sin_addr.s_addr = htonl (INADDR_ANY);
  27. if (bind (sock, (struct sockaddr *) &sockaddr, sizeof (sockaddr)) < )
  28. ERR_EXIT ("Bind");
  29. if (listen (sock, SOMAXCONN) < )
  30. ERR_EXIT ("Listen");
  31. struct sockaddr_in client;
  32. memset (&client, , sizeof (client));
  33. socklen_t addrlen = sizeof (client);
  34. if ((conn = accept (sock, (struct sockaddr *) &client, &addrlen)) < )
  35. ERR_EXIT ("Accept");
  36. char sed[], recv[];
  37. while (fgets (sed, sizeof (sed), stdin) != NULL || == )
  38. {
  39. if (strlen (sed) > )
  40. write (conn, sed, sizeof (sed));
  41. if (read (conn, recv, sizeof (recv)) > )
  42. {
  43. fputs (recv, stdout);
  44. if (strcmp (recv, "exit") == )
  45. break;
  46. write (conn, recv, sizeof (recv));
  47. }
  48. else
  49. ERR_EXIT ("read...");
  50. }
  51. close (conn);
  52. close (sock);
  53. return ;
  54. }

客户端(client.c):

  1. #include<unistd.h>
  2. #include<stdio.h>
  3. #include<string.h>
  4. #include<error.h>
  5. #include<netinet/in.h>
  6. #include<stdlib.h>
  7. #include<sys/socket.h>
  8. #include<sys/types.h>
  9.  
  10. #define ERR_EXIT( m ) \
  11. do{ \
  12. perror(m); \
  13. exit(); \
  14. }while();
  15.  
  16. int
  17. main (void)
  18. {
  19. int socketid, conn;
  20.  
  21. if ((socketid = socket (PF_INET, SOCK_STREAM, IPPROTO_TCP)) < )
  22. ERR_EXIT ("socket");
  23.  
  24. struct sockaddr_in server_addr;
  25. memset (&server_addr, , sizeof (server_addr));
  26.  
  27. server_addr.sin_family = AF_INET;
  28. server_addr.sin_port = htons ();
  29. server_addr.sin_addr.s_addr = inet_addr ("127.0.0.1");
  30. if ((conn =
  31. connect (socketid, (struct sockaddr *) &server_addr,
  32. sizeof (server_addr))) < )
  33. ERR_EXIT ("connect");
  34. char sendbuf[], recivebuf[];
  35. while (fgets (sendbuf, sizeof (sendbuf), stdin) != NULL)
  36. {
  37. write (socketid, sendbuf, sizeof (sendbuf));
  38. read (socketid, recivebuf, sizeof (recivebuf));
  39. fputs (recivebuf, stdout);
  40. if (strcmp (recivebuf, "exit") == )
  41. {
  42. ERR_EXIT ("exit");
  43. break;
  44. }
  45. }
  46. close (conn);
  47. close (socketid);
  48. return ;
  49. }

相关的makefile文件

  1. makefile文件:
  2.  
  3. .SUFFIXES: .o.c
  4. .PHONY: clean
  5. .PHONY: start
  6.  
  7. CC =gcc
  8. SRC =server.c
  9. OBJS =$(SRC:.c =.o)
  10. BIN = Server
  11.  
  12. start:
  13. $(CC) -o $(BIN) $(OBJS)
  14.  
  15. .o.c:
  16. $(CC) -g -Wall $@ -c $<
  17. clean:
  18. rm -f $(OBJS)

但是上述虽然满足了基本的socket套路,但是当我们关闭服务可执行程序时,在开启就会出现地址被占用,解决此等问题,需再加上一个setsockopt()函数,对齐进行设定。

详细可以去查询man帮助(man  setsockopt)

代码:

  1. int on = ;
  2. if (setsockopt (sock, SOL_SOCKET, SO_REUSEADDR, &on, sizeof (on)) < )
  3. {
  4. ERR_EXIT ("setsockopt");
  5. }
  6.  
  7. if (bind (sock, (struct sockaddr *) &sockaddr, sizeof (sockaddr)) < )
  8. ERR_EXIT ("Bind");

  二:  利用进程进行并行socket阻塞式连接:

        客户端和makefile文件和上面一样,只是将socket的服务端,修改为调用进程来进行多并发连接即可!

服务端(server.c):

  1. #include<unistd.h>
  2. #include<stdio.h>
  3. #include<string.h>
  4. #include<stdlib.h>
  5. #include<netinet/in.h>
  6. #include<sys/socket.h>
  7. #include<sys/types.h>
  8. #include<error.h>
  9.  
  10. #define ERR_EXIT(m) \
  11. do{ \
  12. perror(m); \
  13. exit(); \
  14. }while()
  15.  
  16. void
  17. print (int conn){
  18.  
  19. char sed[], recv[];
  20. while (fgets (sed, sizeof (sed), stdin) != NULL || == )
  21. {
  22. if (strlen (sed) > )
  23. write (conn, sed, sizeof (sed));
  24. if (read (conn, recv, sizeof (recv)) > )
  25. {
  26. fputs (recv, stdout);
  27. if (strcmp (recv, "exit") == )
  28. break;
  29. write (conn, recv, sizeof (recv));
  30. }
  31. else
  32. ERR_EXIT ("read...");
  33. }
  34. close (conn);
  35. }
  36.  
  37. int
  38. main (void)
  39. {
  40. int sock, conn;
  41. if ((sock = socket (PF_INET, SOCK_STREAM, )) < )
  42. ERR_EXIT ("socket");
  43. struct sockaddr_in sockaddr;
  44. memset (&sockaddr, , sizeof (sockaddr));
  45. sockaddr.sin_family = AF_INET;
  46. sockaddr.sin_port = htons ();
  47. sockaddr.sin_addr.s_addr = htonl (INADDR_ANY);
  48.  
  49. int on = ;
  50. if (setsockopt (sock, SOL_SOCKET, SO_REUSEADDR, &on, sizeof (on)) < )
  51. {
  52. ERR_EXIT ("setsockopt");
  53. }
  54.  
  55. if (bind (sock, (struct sockaddr *) &sockaddr, sizeof (sockaddr)) < )
  56. ERR_EXIT ("Bind");
  57.  
  58. if (listen (sock, SOMAXCONN) < )
  59. ERR_EXIT ("Listen");
  60.  
  61. struct sockaddr_in client;
  62. memset (&client, , sizeof (client));
  63. socklen_t addrlen = sizeof (client);
  64. pid_t pid ;
  65.  
  66. while ()
  67. {
  68. if((conn = accept (sock, (struct sockaddr *) &client, &addrlen)) < )
  69. ERR_EXIT ("Accept");
  70. pid = fork ();
  71. if (pid == -)
  72. ERR_EXIT ("fork");
  73. else if (pid == ){
  74. close (sock);
  75. print (conn);
  76. }
  77. else
  78. close (conn);
  79. }
  80. close (sock);
  81. return ;
  82. }

socket编程与利用进程进行多并行连接的更多相关文章

  1. 利用socket编程在ESP32上搭建一个TCP客户端

    通过之前http://www.cnblogs.com/noticeable/p/7636582.html中对socket的编程,已经可以知道如何通过socket编程搭建服务器和客户端了,现在,就在ES ...

  2. python网络编程-socket编程

     一.服务端和客户端 BS架构 (腾讯通软件:server+client) CS架构 (web网站) C/S架构与socket的关系: 我们学习socket就是为了完成C/S架构的开发 二.OSI七层 ...

  3. [转]C语言SOCKET编程指南

    1.介绍 Socket编程让你沮丧吗?从man pages中很难得到有用的信息吗?你想跟上时代去编Internet相关的程序,但是为你在调用 connect() 前的bind() 的结构而不知所措?等 ...

  4. socket编程-java

    一,网络编程中两个主要的问题 一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输. 在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可 ...

  5. socket编程基础

    socket编程 什么是socket 定义 socket通常也称作套接字,用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过套接字向网络发出请求或者应答网络请求. socket起源于Unix ...

  6. Linux Socket编程

    “一切皆Socket!” 话虽些许夸张,但是事实也是,现在的网络编程几乎都是用的socket. ——有感于实际编程和开源项目研究. 我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览 ...

  7. C语言SOCKET编程指南

    1.介绍 Socket 编程让你沮丧吗?从man pages中很难得到有用的信息吗?你想跟上时代去编Internet相关的程序,但是为你在调用 connect() 前的bind() 的结构而不知所措? ...

  8. Linux Socket编程(不限Linux)【转】

    转自:http://www.cnblogs.com/skynet/archive/2010/12/12/1903949.html “一切皆Socket!” 话虽些许夸张,但是事实也是,现在的网络编程几 ...

  9. java socket编程(网络编程)

    一,网络编程中两个主要的问题 一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输. 在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可 ...

随机推荐

  1. (转载)eclipse插件安装的四种方法

    eclipse插件安装的四种方法 Eclipse插件的安装方法 1.在eclipse的主目录(ECLIPSE_HOME, 比如在我的机器上安装的目录是:D:\eclipse)有一个plugins的目录 ...

  2. 重启redis报错:Waiting for Redis to shutdown

    重启redis,发现一直报:Waiting for Redis to shutdown service redis_6379 restart Stopping ... OK (error) NOAUT ...

  3. cat *.txt | grep '>' | wc -l

    find the line where the '>' located, and make a statistic.

  4. 2.1.5 计算机网络协议: TCP/IP

    应用程序阶段:妳打开浏览器,在浏览器上面输入网址列,按下 [Enter].此时网址列与相关数据会被浏览器包成一个数据, 并向下传给 TCP/IP 的应用层: 应用层:由应用层提供的 HTTP 通讯协议 ...

  5. python—面向对象编程

    面向对象编程简单来说就是基于对 类 和 对象 的使用,所有的代码都是通过类和对象来实现的编程就是面向对象编程! 面向对象的三大特性:封装.继承.多态 首先创建一个类 #使用class创建一个Schoo ...

  6. Android-Universal-Image-Loader的缓存处理机制

    讲到缓存,平时流水线上的码农一定觉得这是一个高大上的东西.看过网上各种讲缓存原理的文章,总感觉那些文章讲的就是玩具,能用吗?这次我将带你一起看过UIL这个国内外大牛都追捧的图片缓存类库的缓存处理机制. ...

  7. Web Performance Test : IP切换/IP欺骗

    译者前言 本文翻译自<Visual Studio Performance Testing Quick Reference Guide 3.6> 有关于IP Switching的章节.< ...

  8. [转]C#中调用资源管理器(Explorer.exe)打开指定文件夹 + 并选中指定文件 + 调用(系统默认的播放类)软件(如WMP)打开(播放歌曲等)文件

    原文:http://www.crifan.com/csharp_call_explorer_to_open_destinate_folder_and_select_specific_file/ C#中 ...

  9. 四大开源协议比较:BSD、Apache、GPL、LGPL (转)

    转自:http://www.lupaworld.com/portal.php?mod=view&aid=205552&page=all 本文参考文献:http://www.fsf.or ...

  10. 利用win7系统自带的dos命令把笔记本无线网卡当无线路由器(无线AP发射器)

    利用win7系统自带的dos命令把笔记本无线网卡当无线路由器(无线AP发射器). 1.打开win7开始菜单,找到命令提示符选项,以管理员身份运行cmd.2.在命令行上输入:netsh wlan set ...