socket编程与利用进程进行多并行连接
呈现一张基本的socket阻塞式模型,如下图:
一: 对于一对一的进行C/S回射:
服务端(server.c):
- #include<unistd.h>
- #include<stdio.h>
- #include<string.h>
- #include<stdlib.h>
- #include<netinet/in.h>
- #include<sys/socket.h>
- #include<sys/types.h>
- #include<error.h>
- #define ERR_EXIT(m) \
- do{ \
- perror(m); \
- exit(); \
- }while()
- int
- main (void)
- {
- int sock, conn;
- if ((sock = socket (PF_INET, SOCK_STREAM, )) < )
- ERR_EXIT ("socket");
- struct sockaddr_in sockaddr;
- memset (&sockaddr, , sizeof (sockaddr));
- sockaddr.sin_family = AF_INET;
- sockaddr.sin_port = htons ();
- sockaddr.sin_addr.s_addr = htonl (INADDR_ANY);
- if (bind (sock, (struct sockaddr *) &sockaddr, sizeof (sockaddr)) < )
- ERR_EXIT ("Bind");
- if (listen (sock, SOMAXCONN) < )
- ERR_EXIT ("Listen");
- struct sockaddr_in client;
- memset (&client, , sizeof (client));
- socklen_t addrlen = sizeof (client);
- if ((conn = accept (sock, (struct sockaddr *) &client, &addrlen)) < )
- ERR_EXIT ("Accept");
- char sed[], recv[];
- while (fgets (sed, sizeof (sed), stdin) != NULL || == )
- {
- if (strlen (sed) > )
- write (conn, sed, sizeof (sed));
- if (read (conn, recv, sizeof (recv)) > )
- {
- fputs (recv, stdout);
- if (strcmp (recv, "exit") == )
- break;
- write (conn, recv, sizeof (recv));
- }
- else
- ERR_EXIT ("read...");
- }
- close (conn);
- close (sock);
- return ;
- }
客户端(client.c):
- #include<unistd.h>
- #include<stdio.h>
- #include<string.h>
- #include<error.h>
- #include<netinet/in.h>
- #include<stdlib.h>
- #include<sys/socket.h>
- #include<sys/types.h>
- #define ERR_EXIT( m ) \
- do{ \
- perror(m); \
- exit(); \
- }while();
- int
- main (void)
- {
- int socketid, conn;
- if ((socketid = socket (PF_INET, SOCK_STREAM, IPPROTO_TCP)) < )
- ERR_EXIT ("socket");
- struct sockaddr_in server_addr;
- memset (&server_addr, , sizeof (server_addr));
- server_addr.sin_family = AF_INET;
- server_addr.sin_port = htons ();
- server_addr.sin_addr.s_addr = inet_addr ("127.0.0.1");
- if ((conn =
- connect (socketid, (struct sockaddr *) &server_addr,
- sizeof (server_addr))) < )
- ERR_EXIT ("connect");
- char sendbuf[], recivebuf[];
- while (fgets (sendbuf, sizeof (sendbuf), stdin) != NULL)
- {
- write (socketid, sendbuf, sizeof (sendbuf));
- read (socketid, recivebuf, sizeof (recivebuf));
- fputs (recivebuf, stdout);
- if (strcmp (recivebuf, "exit") == )
- {
- ERR_EXIT ("exit");
- break;
- }
- }
- close (conn);
- close (socketid);
- return ;
- }
相关的makefile文件
- makefile文件:
- .SUFFIXES: .o.c
- .PHONY: clean
- .PHONY: start
- CC =gcc
- SRC =server.c
- OBJS =$(SRC:.c =.o)
- BIN = Server
- start:
- $(CC) -o $(BIN) $(OBJS)
- .o.c:
- $(CC) -g -Wall $@ -c $<
- clean:
- rm -f $(OBJS)
但是上述虽然满足了基本的socket套路,但是当我们关闭服务可执行程序时,在开启就会出现地址被占用,解决此等问题,需再加上一个setsockopt()函数,对齐进行设定。
详细可以去查询man帮助(man setsockopt)
代码:
- int on = ;
- if (setsockopt (sock, SOL_SOCKET, SO_REUSEADDR, &on, sizeof (on)) < )
- {
- ERR_EXIT ("setsockopt");
- }
- if (bind (sock, (struct sockaddr *) &sockaddr, sizeof (sockaddr)) < )
- ERR_EXIT ("Bind");
二: 利用进程进行并行socket阻塞式连接:
客户端和makefile文件和上面一样,只是将socket的服务端,修改为调用进程来进行多并发连接即可!
服务端(server.c):
- #include<unistd.h>
- #include<stdio.h>
- #include<string.h>
- #include<stdlib.h>
- #include<netinet/in.h>
- #include<sys/socket.h>
- #include<sys/types.h>
- #include<error.h>
- #define ERR_EXIT(m) \
- do{ \
- perror(m); \
- exit(); \
- }while()
- void
- print (int conn){
- char sed[], recv[];
- while (fgets (sed, sizeof (sed), stdin) != NULL || == )
- {
- if (strlen (sed) > )
- write (conn, sed, sizeof (sed));
- if (read (conn, recv, sizeof (recv)) > )
- {
- fputs (recv, stdout);
- if (strcmp (recv, "exit") == )
- break;
- write (conn, recv, sizeof (recv));
- }
- else
- ERR_EXIT ("read...");
- }
- close (conn);
- }
- int
- main (void)
- {
- int sock, conn;
- if ((sock = socket (PF_INET, SOCK_STREAM, )) < )
- ERR_EXIT ("socket");
- struct sockaddr_in sockaddr;
- memset (&sockaddr, , sizeof (sockaddr));
- sockaddr.sin_family = AF_INET;
- sockaddr.sin_port = htons ();
- sockaddr.sin_addr.s_addr = htonl (INADDR_ANY);
- int on = ;
- if (setsockopt (sock, SOL_SOCKET, SO_REUSEADDR, &on, sizeof (on)) < )
- {
- ERR_EXIT ("setsockopt");
- }
- if (bind (sock, (struct sockaddr *) &sockaddr, sizeof (sockaddr)) < )
- ERR_EXIT ("Bind");
- if (listen (sock, SOMAXCONN) < )
- ERR_EXIT ("Listen");
- struct sockaddr_in client;
- memset (&client, , sizeof (client));
- socklen_t addrlen = sizeof (client);
- pid_t pid ;
- while ()
- {
- if((conn = accept (sock, (struct sockaddr *) &client, &addrlen)) < )
- ERR_EXIT ("Accept");
- pid = fork ();
- if (pid == -)
- ERR_EXIT ("fork");
- else if (pid == ){
- close (sock);
- print (conn);
- }
- else
- close (conn);
- }
- close (sock);
- return ;
- }
socket编程与利用进程进行多并行连接的更多相关文章
- 利用socket编程在ESP32上搭建一个TCP客户端
通过之前http://www.cnblogs.com/noticeable/p/7636582.html中对socket的编程,已经可以知道如何通过socket编程搭建服务器和客户端了,现在,就在ES ...
- python网络编程-socket编程
一.服务端和客户端 BS架构 (腾讯通软件:server+client) CS架构 (web网站) C/S架构与socket的关系: 我们学习socket就是为了完成C/S架构的开发 二.OSI七层 ...
- [转]C语言SOCKET编程指南
1.介绍 Socket编程让你沮丧吗?从man pages中很难得到有用的信息吗?你想跟上时代去编Internet相关的程序,但是为你在调用 connect() 前的bind() 的结构而不知所措?等 ...
- socket编程-java
一,网络编程中两个主要的问题 一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输. 在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可 ...
- socket编程基础
socket编程 什么是socket 定义 socket通常也称作套接字,用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过套接字向网络发出请求或者应答网络请求. socket起源于Unix ...
- Linux Socket编程
“一切皆Socket!” 话虽些许夸张,但是事实也是,现在的网络编程几乎都是用的socket. ——有感于实际编程和开源项目研究. 我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览 ...
- C语言SOCKET编程指南
1.介绍 Socket 编程让你沮丧吗?从man pages中很难得到有用的信息吗?你想跟上时代去编Internet相关的程序,但是为你在调用 connect() 前的bind() 的结构而不知所措? ...
- Linux Socket编程(不限Linux)【转】
转自:http://www.cnblogs.com/skynet/archive/2010/12/12/1903949.html “一切皆Socket!” 话虽些许夸张,但是事实也是,现在的网络编程几 ...
- java socket编程(网络编程)
一,网络编程中两个主要的问题 一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输. 在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可 ...
随机推荐
- (转载)eclipse插件安装的四种方法
eclipse插件安装的四种方法 Eclipse插件的安装方法 1.在eclipse的主目录(ECLIPSE_HOME, 比如在我的机器上安装的目录是:D:\eclipse)有一个plugins的目录 ...
- 重启redis报错:Waiting for Redis to shutdown
重启redis,发现一直报:Waiting for Redis to shutdown service redis_6379 restart Stopping ... OK (error) NOAUT ...
- cat *.txt | grep '>' | wc -l
find the line where the '>' located, and make a statistic.
- 2.1.5 计算机网络协议: TCP/IP
应用程序阶段:妳打开浏览器,在浏览器上面输入网址列,按下 [Enter].此时网址列与相关数据会被浏览器包成一个数据, 并向下传给 TCP/IP 的应用层: 应用层:由应用层提供的 HTTP 通讯协议 ...
- python—面向对象编程
面向对象编程简单来说就是基于对 类 和 对象 的使用,所有的代码都是通过类和对象来实现的编程就是面向对象编程! 面向对象的三大特性:封装.继承.多态 首先创建一个类 #使用class创建一个Schoo ...
- Android-Universal-Image-Loader的缓存处理机制
讲到缓存,平时流水线上的码农一定觉得这是一个高大上的东西.看过网上各种讲缓存原理的文章,总感觉那些文章讲的就是玩具,能用吗?这次我将带你一起看过UIL这个国内外大牛都追捧的图片缓存类库的缓存处理机制. ...
- Web Performance Test : IP切换/IP欺骗
译者前言 本文翻译自<Visual Studio Performance Testing Quick Reference Guide 3.6> 有关于IP Switching的章节.< ...
- [转]C#中调用资源管理器(Explorer.exe)打开指定文件夹 + 并选中指定文件 + 调用(系统默认的播放类)软件(如WMP)打开(播放歌曲等)文件
原文:http://www.crifan.com/csharp_call_explorer_to_open_destinate_folder_and_select_specific_file/ C#中 ...
- 四大开源协议比较:BSD、Apache、GPL、LGPL (转)
转自:http://www.lupaworld.com/portal.php?mod=view&aid=205552&page=all 本文参考文献:http://www.fsf.or ...
- 利用win7系统自带的dos命令把笔记本无线网卡当无线路由器(无线AP发射器)
利用win7系统自带的dos命令把笔记本无线网卡当无线路由器(无线AP发射器). 1.打开win7开始菜单,找到命令提示符选项,以管理员身份运行cmd.2.在命令行上输入:netsh wlan set ...