呈现一张基本的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(1);    \
14      }while(0)
15
16 int
17 main (void)
18 {
19   int sock, conn;
20   if ((sock = socket (PF_INET, SOCK_STREAM, 0)) < 0)
21     ERR_EXIT ("socket");
22   struct sockaddr_in sockaddr;
23   memset (&sockaddr, 0, sizeof (sockaddr));
24   sockaddr.sin_family = AF_INET;
25   sockaddr.sin_port = htons (5528);
26   sockaddr.sin_addr.s_addr = htonl (INADDR_ANY);
27   if (bind (sock, (struct sockaddr *) &sockaddr, sizeof (sockaddr)) < 0)
28     ERR_EXIT ("Bind");
29   if (listen (sock, SOMAXCONN) < 0)
30     ERR_EXIT ("Listen");
31   struct sockaddr_in client;
32   memset (&client, 0, sizeof (client));
33   socklen_t addrlen = sizeof (client);
34   if ((conn = accept (sock, (struct sockaddr *) &client, &addrlen)) < 0)
35     ERR_EXIT ("Accept");
36   char sed[1024], recv[1024];
37   while (fgets (sed, sizeof (sed), stdin) != NULL || 1 == 1)
38     {
39       if (strlen (sed) > 0)
40         write (conn, sed, sizeof (sed));
41       if (read (conn, recv, sizeof (recv)) > 0)
42         {
43           fputs (recv, stdout);
44           if (strcmp (recv, "exit") == 0)
45             break;
46           write (conn, recv, sizeof (recv));
47         }
48       else
49         ERR_EXIT ("read...");
50     }
51   close (conn);
52   close (sock);
53   return 0;
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(1);       \
14     }while(0);
15
16 int
17 main (void)
18 {
19   int socketid, conn;
20
21   if ((socketid = socket (PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
22     ERR_EXIT ("socket");
23
24   struct sockaddr_in server_addr;
25   memset (&server_addr, 0, sizeof (server_addr));
26
27   server_addr.sin_family = AF_INET;
28   server_addr.sin_port = htons (5528);
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))) < 0)
33     ERR_EXIT ("connect");
34   char sendbuf[1024], recivebuf[1024];
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") == 0)
41         {
42           ERR_EXIT ("exit");
43           break;
44         }
45     }
46   close (conn);
47   close (socketid);
48   return 0;
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 = 1;
2   if (setsockopt (sock, SOL_SOCKET, SO_REUSEADDR, &on, sizeof (on)) < 0)
3     {
4       ERR_EXIT ("setsockopt");
5     }
6
7
8   if (bind (sock, (struct sockaddr *) &sockaddr, sizeof (sockaddr)) < 0)
9     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(1);    \
14      }while(0)
15
16
17 void
18 print (int conn){
19
20   char sed[1024], recv[1024];
21   while (fgets (sed, sizeof (sed), stdin) != NULL || 1 == 1)
22     {
23       if (strlen (sed) > 0)
24          write (conn, sed, sizeof (sed));
25       if (read (conn, recv, sizeof (recv)) > 0)
26         {
27           fputs (recv, stdout);
28           if (strcmp (recv, "exit") == 0)
29                     break;
30           write (conn, recv, sizeof (recv));
31         }
32       else
33         ERR_EXIT ("read...");
34    }
35     close (conn);
36 }
37
38 int
39 main (void)
40 {
41   int sock, conn;
42   if ((sock = socket (PF_INET, SOCK_STREAM, 0)) < 0)
43     ERR_EXIT ("socket");
44   struct sockaddr_in sockaddr;
45   memset (&sockaddr, 0, sizeof (sockaddr));
46   sockaddr.sin_family = AF_INET;
47   sockaddr.sin_port = htons (5528);
48   sockaddr.sin_addr.s_addr = htonl (INADDR_ANY);
49
50   int on = 1;
51   if (setsockopt (sock, SOL_SOCKET, SO_REUSEADDR, &on, sizeof (on)) < 0)
52     {
53       ERR_EXIT ("setsockopt");
54     }
55
56
57   if (bind (sock, (struct sockaddr *) &sockaddr, sizeof (sockaddr)) < 0)
58     ERR_EXIT ("Bind");
59
60   if (listen (sock, SOMAXCONN) < 0)
61     ERR_EXIT ("Listen");
62
63   struct sockaddr_in client;
64   memset (&client, 0, sizeof (client));
65   socklen_t addrlen = sizeof (client);
66   pid_t pid ;
67
68   while (1)
69     {
70    if((conn = accept (sock, (struct sockaddr *) &client, &addrlen)) < 0)
71         ERR_EXIT ("Accept");
72           pid = fork ();
73       if (pid == -1)
74            ERR_EXIT ("fork");
75       else if (pid == 0){
76            close (sock);
77            print (conn);
78         }
79       else
80         close (conn);
81     }
82   close (sock);
83   return 0;
84 }
编程是一种快乐,享受代码带给我的乐趣!!!

socket编程与利用进程进行多并行连接相关推荐

  1. socket 编程基础

    网络模型 osi 参考模型,tcp/ip 参考模型 网络通讯要素 ip地址,端口号,传输协议 IP地址就是我想找到他的主机地址,但是如何区分是feiq 找他还是qq 找他用端口号区分,每一种进程的端口 ...

  2. TCP:利用Socket编程技术实现客户端向服务端上传一个图片。

    问题: 利用Socket编程技术实现客户端向服务端上传一个图片的程序. 客户端: import java.io.*; import java.net.Socket;public class clien ...

  3. Linux下Socket编程

    Linux下Socket编程    网络的Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符.Socket也具有一个类似于打开文件的函数调用Socket(),该函数返回一个整型的S ...

  4. C# socket编程实践——支持广播的简单socket服务器

    在上篇博客简单理解socket写完之后我就希望写出一个websocket的服务器了,但是一路困难重重,还是从基础开始吧,先搞定C# socket编程基本知识,写一个支持广播的简单server/clie ...

  5. python基础之socket编程

    阅读目录 一 客户端/服务器架构 二 osi七层 三 socket层 四 socket是什么 五 套接字发展史及分类 六 套接字工作流程 七 基于TCP的套接字 八 基于UDP的套接字 九 粘包现象 ...

  6. python封装api linux_python Socket编程-python API 与 Linux Socket API之间的关系

    python socket编程 by SA19225409 地址协议家族 Python 支持 AF_UNIX. AF_NETLINK. AF_TIPC 和 AF_INET 家族 AF_UNIX 基于本 ...

  7. Java从零开始学四十五(Socket编程基础)

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

  8. Go中的Socket编程

    在很多底层网络应用开发者的眼里一切编程都是Socket,话虽然有点夸张,但却也几乎如此了,现在的网络编程几乎都是用Socket来编程.你想过这些情景么?我们每天打开浏览器浏览网页时,浏览器进程怎么和W ...

  9. Socket编程原理概述

    1 问题的引入  UNIX系统的I/O命令集,是从Maltics和早期系统中的命令演变出来的,其模式为打开一读/写一关闭(open-write-read-close).在一个用户进程进行I/O操作时, ...

最新文章

  1. tf.matmul / tf.multiply
  2. 东半球最接地气的短链接系统设计
  3. Hover States - 有趣的用户界面及交互设计
  4. 要找到现阶段最适合自己的方法
  5. OpenStack核心组件-glance镜像服务
  6. 经典面试题(6):NaN 是什么?如何测试一个值是否等于 NaN ?
  7. WorkFlow入门Step.7—Creating a FlowChart WorkFlow-For-WF4.0
  8. HTTP响应头信息 Content-Type
  9. 【HC资料合集】2019华为全联接大会主题资料一站式汇总,免费下载!
  10. 中断触发流程三(中断控制器)
  11. java 新手入门电子书_3款针对初学者的免费Java电子书
  12. Lottie 动画AE+Bodymovin导出的JSON文件解读
  13. 强贴---不用VBA实现Excel单元格连动下拉选择
  14. html 两个表合并,html如何合并表格
  15. Prometheus监控报警系统入门
  16. JPA/Hibernate 中@Formula的作用
  17. 播布客的视频讲座-下载(持续更新2011-12-31)
  18. Vulnhub-maEnuBox
  19. 联手新加坡南洋理工大学,阿里加速推进人工智能战略
  20. 写爬虫遇到验证码识别问题的解决方案

热门文章

  1. JAVA模拟某信网登录信息采集
  2. VS2010 MFC exe独立系统环境运行
  3. 【opencv】3.在一个opencv窗口中显示多个视频界面、画箭头、画掉头箭头
  4. 【数据结构与算法】1.二叉树代码
  5. C/C++ 中生成特定范围内的随机数
  6. 关于高阶导数的一个不等式估计
  7. Hadoop Streaming
  8. webpack 之 code spliting
  9. CSS选择器分类与优先级
  10. Linux Top命令详解(载自百度经验)