呈现一张基本的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编程与利用进程进行多并行连接的更多相关文章

  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. for循环求交集

    for循环方式求交集 #!/usr/bin/env python #coding:utf-8 #取交集 #定义两个序列对象,求alist与blist对象的交集元素 alist = [2,9,3,4,5 ...

  2. java-Filter过滤器

    特点 过滤浏览器请求的java程序 处于浏览器和被请求的资源之间 可以有多个过滤器组成过滤链 有配置的顺序决定先后顺序 常用语设置请求和响应的字符集 API doFilter()执行过滤 Filter ...

  3. winform 对话框、打印框

    winform 对话框控件 1.打开文件对话框(OpenFileDialog) 2.保存文件对话框(SaveFileDialog) 3.字体对话框(FontDialog) 4.颜色对话框(ColorD ...

  4. 在Repeater中嵌套使用Repeater

    在一般的网站中浏览类别的用户控件通常都位于大多数 ASP.NET 页的左边,它使用户能够按类别快速的查找产品.最近遇到一个客户,因为在他网站上展示的产品并不多,所以要求在原有类别浏览的基础上将产品也加 ...

  5. 一面cvte

    昨天上午去cvte参加一面,和好基友一块,离学校很近,10点多一点到了,一出电梯,傻眼了(不是美女很多),是人真的很多,等了2个小时才轮到我们,一个hr面3个人,我和基友,还有一个本科小盆友,问了5个 ...

  6. app安装位置声明

    AndroidManifest.xml <manifest xmlns:android="http://schemas.android.com/apk/res/android" ...

  7. 初识Python第二天(4)

    '.isdecimal()) print('壹'.isdecimal()) print('11d'.isdecimal()) #True #False #False #只有全部为unicode数字,全 ...

  8. 连续最短路算法(Successive Shortest Path)(最小费用最大流)

    #include <cstdio> #include <cstring> #include <queue> #include <vector> #inc ...

  9. Flowplayer-Embedding

    SOURCE URL:https://flowplayer.org/docs/embedding.html Embedding Video embedding is an act where the ...

  10. CSS3的chapter6

    CSS布局          div标签: 在css布局方式中,div 是这种布局方式的核心对象,我们的页面排版不再依赖于表格, 仅从div的使用上说,做一个简单的布局只需要两样东西:div 与 cs ...