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地址可 ...
随机推荐
- [SLAM]2D激光扫描匹配方法
1.Beam Model 2.Likehood field for k=1:size(zt,1) if zt(k,2)>0 d = -grid_dim/2; else d = grid_dim/ ...
- 安装vim
命令安装vim sudo apt-get install vim
- 刨根问底U3D---Vector3 你到底是蔬菜呢还是水果呢?
事情的起因还是因为一段代码,因为在做一个2D TileBase的游戏 所以需要有一个简单的 Tile坐标到世界坐标的变换 public static Vector3 GetTileWorldPosBy ...
- sql 遍历结果集
declare @temp table ( [id] int IDENTITY(1,1), [Name] varchar(10) ) --select * from @temp declare @te ...
- 在linux中的info手册的用法
就是一些快捷键 空格键向下翻页,当处在当前节点的底部时,空格键跳转到下一个节点. <DEL> 或者 <BACKSPACE> 向上翻页,当处在当前节点的顶部的时候,这两个键可以跳 ...
- Qt之界面实现技巧
一.主界面 1.窗口 最小化 最小化 关闭按钮 显示状态自定义 setWindowFlags(Qt::CustomireWindowHint); setWindowFlags(Qt::WindowCl ...
- Tomcat JSP提交参数中文乱码问题解决
参考: http://blog.csdn.net/error_case/article/details/8250209 中文乱码是个老生常谈的问题,一般情况下,只要保证页面,web服务器,数据库的编码 ...
- ListView的LayoutParams设置
// Temp is the root view that was found in the xml final View temp = createViewFromTag(root, name, a ...
- SQL学习指南 ——笔记
前言:每章的练习题很实用,跟着练了一遍.答案附录有 1.流行的商业级关系数据库:
- GAT2.0使用文档(组合接口测试)
3.2接口用例场景组件 在此之前,大家应该都已经开发完成了一个最简单的接口测试用例,但是之前的接口用例的期望结果是固定值,不能动态的去做对比,有很大局限性.下面开始介绍怎样通过场景组件来动态对测试结果 ...