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地址可 ...
随机推荐
- EBS R12.2 创建应用层的启动和关闭脚本
Create the following files to start and stop R12. application tier. Change the apps and weblogic pas ...
- sql server 中删除表中数据truncate和delete的区别(转载自.net学习网)
我们都知道truncate table可以用来删除整个表的内容,它与delete后面不跟where条件的效果是一样.但除此之外,我们还清楚它们之间有其它的区别吗?本章我们将一起讨论truncate与d ...
- JQuery实现广告效果(滚动切换)
JQuery实现广告效果(滚动切换) Html+css 效果如上图 代码: <!DOCTYPE html> <html> <head lang="en&qu ...
- mvc与三层结构
http://www.cnblogs.com/zhhh/archive/2011/06/10/2077519.html 又看到有人在问三层架构和MVC的关系,感觉这种问题有点教条化了.因为它们都在逻辑 ...
- install cygwin
make clean
- Java 可变参数列表
1.可变参数列表的简单实现 当调用方法时,方法的参数个数或类型未知时,称其为可变参数列表.在以前的Java代码中,可以使用Object数组来实现这样的功能.因为,所有的类都是直接或间接继承于Objec ...
- How to locate a path? - Unix & Linux Stack Exchange
How to locate a path? - Unix & Linux Stack Exchange http://unix.stackexchange.com/questions/2955 ...
- 误删ibdata1文件恢复方法
注意:以下演示过程前提为mysqld进程仍在运行中,否则无法使用下面演示过程进行恢复! 1.手工制造故障,删除ibdata1文件,注意不要重启mysql shell > rm -rf ibdat ...
- css美化checkbox radio样式
/*check,radio*/ input.check_txt[type='checkbox']{ display: none; } input.check_txt[type='checkbox'] ...
- WF(二)
步骤一: 运用WF(一)中创建好的solution 重命名Workflow1.xaml,变为SayHello.xaml 并在属性窗口设置名称为HelloWorkflow.SayHello,如下图: ( ...