呈现一张基本的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. linux下使用sftp

    何为sftp sftp是Secure File Transfer Protocol的缩写,安全文件传送协议.可以为传输文件提供一种安全的加密方法. 连接 linux下直接在终端中输入: sftp us ...

  2. MVC中的JS和CSS压缩

    小说一下Js和CSS压缩的好处: 1.减小了文件的体积 2.减小了网络传输量和带宽占用 3.减小了服务器的处理的压力 4.提高了页面的渲染显示的速度  很多建议将站点的静态文件(如图片.js.css ...

  3. python IDE

    提供给开发者 10 款最好的 Python IDE http://www.oschina.net/news/57468/best-python-ide-for-developers vim windo ...

  4. 16. 星际争霸之php设计模式--组合模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  5. 微信端应用 ionic实现texarea 自适应高度

    最近公司项目,做微信端用到texarea 需要实现自适应高度的功能 当然自适应高度的方法很多网上找一大片,最直接的方式就是在使用到texarea的controller中添加js代码事件来实现,这中方式 ...

  6. 2016年4月1日下午,《java入门123》翻开了第一页,从此走上不归路。新手初来乍到,献上见面礼

    package copyfile; import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream ...

  7. Qt报表控件NCReport教程:添加报表字段

    NCReport是一款轻量级.快速.多平台.简单易用的基于Qt toolkit的C++编写的报表解决方案,目前主要包括报表渲染库和报表设计器GUI应用程序. 在前面的文章<报表控件NCRepor ...

  8. static const vs. extern const

    在实现文件(.m文件)中使用static const来定义“只在编译单元内可见的常量”(只在.m文件内可见),由于此类常量不在全局符号表中,所以无须为其名称加类名前缀(一般以k开头). 在头文件中使用 ...

  9. pageX/Y, offset(), position(), scrollTop(), screenX/Y, clientX/Y, pageX/Y

    event.pageX get mouse position Description: The mouse position relative to the left edge of the docu ...

  10. 隐式意图Intent

    在我们想往下一个页面传递数据时,要想到显式意图和隐式意图,显示意图用于内部活动跳转时比较方便,而隐式意图用于应用程序中外部活动的跳转时较为方便,在使用隐式意图时我们要想到清单文件 代码如下: < ...