- 浏览: 1446694 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (691)
- linux (207)
- shell (33)
- java (42)
- 其他 (22)
- javascript (33)
- cloud (16)
- python (33)
- c (48)
- sql (12)
- 工具 (6)
- 缓存 (16)
- ubuntu (7)
- perl (3)
- lua (2)
- 超级有用 (2)
- 服务器 (2)
- mac (22)
- nginx (34)
- php (2)
- 内核 (2)
- gdb (13)
- ICTCLAS (2)
- mac android (0)
- unix (1)
- android (1)
- vim (1)
- epoll (1)
- ios (21)
- mysql (3)
- systemtap (1)
- 算法 (2)
- 汇编 (2)
- arm (3)
- 我的数据结构 (8)
- websocket (12)
- hadoop (5)
- thrift (2)
- hbase (1)
- graphviz (1)
- redis (1)
- raspberry (2)
- qemu (31)
- opencv (4)
- socket (1)
- opengl (1)
- ibeacons (1)
- emacs (6)
- openstack (24)
- docker (1)
- webrtc (11)
- angularjs (2)
- neutron (23)
- jslinux (18)
- 网络 (13)
- tap (9)
- tensorflow (8)
- nlu (4)
- asm.js (5)
- sip (3)
- xl2tp (5)
- conda (1)
- emscripten (6)
- ffmpeg (10)
- srt (1)
- wasm (5)
- bert (3)
- kaldi (4)
- 知识图谱 (1)
最新评论
-
wahahachuang8:
我喜欢代码简洁易读,服务稳定的推送服务,前段时间研究了一下go ...
websocket的helloworld -
q114687576:
http://www.blue-zero.com/WebSoc ...
websocket的helloworld -
zhaoyanzimm:
感谢您的分享,给我提供了很大的帮助,在使用过程中发现了一个问题 ...
nginx的helloworld模块的helloworld -
haoningabc:
leebyte 写道太NB了,期待早日用上Killinux!么 ...
qemu+emacs+gdb调试内核 -
leebyte:
太NB了,期待早日用上Killinux!
qemu+emacs+gdb调试内核
不使用select
普通的基础socket连接,对多个客户端的反应
是有顺序的,根据建立连接的顺序
1.建立服务端socket
2.服务端socket准备建立新的connection,accept阻塞
3.客户端建立socket,
客户端connect 服务端
4.服务端accept返回,建立了一个connnection
并阻塞到recv,准备接受数据(几个客户端就会简历几个connection)
5.客户端向socket发送数据
6.服务端的connection 这时候recv收到数据并返回
一言不合上代码,先用c写:
server.c
client.c
gcc server.c -o server
gcc client.c -o client
测试server端:
开三个客户端观察
第一个
这里先不输入
-------------------------
第二个
观察server端没有反应
---------------------
第三个客户端:
观察server端没有反应
---------------
再到第一个客户端
回车,
观察服务端
为
发现,服务端返回的值是按照客户端打开connection的顺序返回的
说明给服务端建立连接后,就阻塞在recv上了
,即使后面的client先发送数据,也不会先返回
想哪个先发送就先返回需要使用select等
如果没有select等,
socket是阻塞的,
第一个客户端连接的时候就accept到那里等着了,只有第一个有反应了,后两个才会继续进行,
服务端返回的也是按连接建立的顺序返回的
再看socket的建立过程
一共四个过程,服务端阻塞两次,等待连接和接收消息
客户端建立连接和发送数据两次触发服务端
-------------(1)-------------
服务端:
server端先建立个socket句柄
listenfd = socket(AF_INET, SOCK_STREAM, 0)
绑定地址
bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)
监听socket
listen(listenfd, 10)
建立连接句柄,
并且阻塞##################
connfd =accept(listenfd, (struct sockaddr*)NULL, NULL)
注意
------------(2)---------
客户端:
建立socket句柄
sockfd = socket(AF_INET, SOCK_STREAM, 0)
用这个句柄连接到远程的地址
connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)
--------------(3)--------------
服务端accept的阻塞返回
n = recv(connfd, buff, MAXLINE, 0);
阻塞数据################
---------------(4)---
客户端
句柄发送数据
send(sockfd, sendline, strlen(sendline), 0)
----------------(5)--------------
服务端:
接受消息recv返回
######################################################
这样的普通socket会有顺序问题,
如果想,后面客户端先发送数据,server端不等待前面的客户端反应,就直接返回后面客户端的相应,
需要引入select等
参考http://www.cnblogs.com/skynet/archive/2010/12/12/1903949.html
普通的基础socket连接,对多个客户端的反应
是有顺序的,根据建立连接的顺序
1.建立服务端socket
2.服务端socket准备建立新的connection,accept阻塞
3.客户端建立socket,
客户端connect 服务端
4.服务端accept返回,建立了一个connnection
并阻塞到recv,准备接受数据(几个客户端就会简历几个connection)
5.客户端向socket发送数据
6.服务端的connection 这时候recv收到数据并返回
一言不合上代码,先用c写:
server.c
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<errno.h> #include<sys/types.h> #include<sys/socket.h> #include<netinet/in.h> #define MAXLINE 4096 int main(int argc, char** argv) { int listenfd, connfd; struct sockaddr_in servaddr; char buff[4096]; int n; if( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 ){ printf("create socket error: %s(errno: %d)\n",strerror(errno),errno); exit(0); } memset(&servaddr, 0, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl(INADDR_ANY); servaddr.sin_port = htons(6666); if( bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1){ printf("bind socket error: %s(errno: %d)\n",strerror(errno),errno); exit(0); } if( listen(listenfd, 10) == -1){ printf("listen socket error: %s(errno: %d)\n",strerror(errno),errno); exit(0); } printf("======waiting for client's request======\n"); while(1){ if( (connfd = accept(listenfd, (struct sockaddr*)NULL, NULL)) == -1){ printf("accept socket error: %s(errno: %d)",strerror(errno),errno); continue; } n = recv(connfd, buff, MAXLINE, 0); buff[n] = '\0'; printf("recv msg from client: %s\n", buff); close(connfd); } close(listenfd); }
client.c
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<errno.h> #include<sys/types.h> #include<sys/socket.h> #include<netinet/in.h> #define MAXLINE 4096 int main(int argc, char** argv) { int sockfd, n; char recvline[4096], sendline[4096]; struct sockaddr_in servaddr; if( argc != 2){ printf("usage: ./client <ipaddress>\n"); exit(0); } if( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){ printf("create socket error: %s(errno: %d)\n", strerror(errno),errno); exit(0); } memset(&servaddr, 0, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(6666); if( inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0){ printf("inet_pton error for %s\n",argv[1]); exit(0); } if( connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0){ printf("connect error: %s(errno: %d)\n",strerror(errno),errno); exit(0); } printf("send msg to server: \n"); fgets(sendline, 4096, stdin); if( send(sockfd, sendline, strlen(sendline), 0) < 0) { printf("send msg error: %s(errno: %d)\n", strerror(errno), errno); exit(0); } close(sockfd); exit(0); }
gcc server.c -o server
gcc client.c -o client
测试server端:
[root@centos32 c]# ./server ======waiting for client's request======
开三个客户端观察
第一个
[root@centos32 c]# ./client 127.0.0.1 send msg to server:
这里先不输入
-------------------------
第二个
[root@centos32 c]# ./client 127.0.0.1 send msg to server: hello this is 2222222222222 回车
观察server端没有反应
---------------------
第三个客户端:
[root@centos32 c]# ./client 127.0.0.1 send msg to server: hello this is 33333333 回车
观察server端没有反应
---------------
再到第一个客户端
[root@centos32 c]# ./client 127.0.0.1 send msg to server: this is 111111111
回车,
观察服务端
为
[root@centos32 c]# ./server ======waiting for client's request====== recv msg from client: hello this is 1111111111 recv msg from client: hello this is 2222222222222 recv msg from client: hello this is 33333333
发现,服务端返回的值是按照客户端打开connection的顺序返回的
说明给服务端建立连接后,就阻塞在recv上了
,即使后面的client先发送数据,也不会先返回
想哪个先发送就先返回需要使用select等
如果没有select等,
socket是阻塞的,
第一个客户端连接的时候就accept到那里等着了,只有第一个有反应了,后两个才会继续进行,
服务端返回的也是按连接建立的顺序返回的
再看socket的建立过程
一共四个过程,服务端阻塞两次,等待连接和接收消息
客户端建立连接和发送数据两次触发服务端
-------------(1)-------------
服务端:
server端先建立个socket句柄
listenfd = socket(AF_INET, SOCK_STREAM, 0)
绑定地址
bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)
监听socket
listen(listenfd, 10)
建立连接句柄,
并且阻塞##################
connfd =accept(listenfd, (struct sockaddr*)NULL, NULL)
注意
------------(2)---------
客户端:
建立socket句柄
sockfd = socket(AF_INET, SOCK_STREAM, 0)
用这个句柄连接到远程的地址
connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)
--------------(3)--------------
服务端accept的阻塞返回
n = recv(connfd, buff, MAXLINE, 0);
阻塞数据################
---------------(4)---
客户端
句柄发送数据
send(sockfd, sendline, strlen(sendline), 0)
----------------(5)--------------
服务端:
接受消息recv返回
######################################################
这样的普通socket会有顺序问题,
如果想,后面客户端先发送数据,server端不等待前面的客户端反应,就直接返回后面客户端的相应,
需要引入select等
参考http://www.cnblogs.com/skynet/archive/2010/12/12/1903949.html
发表评论
-
xl2tp 备份
2019-09-24 16:25 5792019年9月24日更新: 注意,需要开启firewall ... -
sdl笔记
2019-01-31 17:19 689sdl教程教程 https://github.com/Twin ... -
tinyemu
2019-01-24 17:59 1402参考https://bellard.org/jslinux/t ... -
建立tap设备的c的代码
2019-01-08 19:09 439tapper.c #include <stdio.h& ... -
jslinux总结帖
2019-01-04 21:33 1022注意个问题: chrome不要用两个tab页,否则ping不通 ... -
br0和tap0的互相影响
2019-01-02 19:17 777转载 http://www.cnblogs.com/wlei/ ... -
aws搭建xl2tp给iphone使用
2018-12-26 21:37 18122019年12月26日 可以参考原来的配置 https:// ... -
consul的基本使用
2017-06-27 11:13 1358### 安装 [centos7上consul的安装](ht ... -
lvs的helloworld
2017-06-13 20:36 564###################lvs######### ... -
系统调用的helloworld
2017-05-04 16:14 564《2.6内核标准教程》 p293 #include < ... -
bitcoin和cgminer的安装
2017-04-05 22:45 1924参考 http://blog.csdn.net/rion_ch ... -
ceph安装和常用命令
2017-03-21 21:55 915/etc/hosts ssh-keygen ssh-copy- ... -
jslinux-deobfuscated-network
2017-02-13 22:37 617基础知识 查看网络包 tcpdump -i eth0 -e ... -
mobile terminal 笔记
2016-12-02 15:35 547找出旧的iphone4 越狱之后可以变个小操作系统 mobi ... -
Tunnels with iproute2
2016-11-14 15:22 514copy from http://members.ferrar ... -
qemu用tap方式启动vm的网络试验(ip route)
2016-09-14 11:29 2678ip route add 192.168.8.0/24 via ... -
socket的方式使用qemu建立虚拟机
2016-06-24 17:54 1806qemu的-net参数 -net nic 必须有,基本配置mo ... -
tap的方式使用qemu建立虚拟机NAT网络
2016-06-23 18:03 9507基本概念: vm:虚拟机 ... -
qemu用nat的方式使用tap建立虚拟机
2016-06-23 16:15 11普通桥接参考 http://haoningabc.iteye. ... -
tap的方式使用qemu建立虚拟机桥接网络
2016-06-22 20:53 7620需求:建立一个虚拟机,使网络和内网一样,当一台普通接入内网的服 ...
相关推荐
C语言编程-socket基础.pdf
本文档提供c语言中socket编程需要的基础知识,包括各种类的介绍及使用。
C语言编程-socket基础.docxC语言编程-socket基础.docx
C语言编程-socket基础
C语言编程-socket基础[参考].pdf
c语言SOCKEt编程指南,C网络编程的内容。比较基础,易懂,
主要介绍了C语言实现socket简单通信的方法,是学习C语言网络编程非常基础而又实用的实例,需要的朋友可以参考下
socket服务端客户端单向通信(C语言) 包括socket网络编程的基础 源码、exe 及完整注释, 2016-4-3
linuxC语言描述操作系统入门基础 多进程 socket 信号量 管道
Linux socket 基础开发教程. 真心不错,个人总结,运行测试
c语言编写的linux下socket通信,多线程实现客户端与服务端随意互发消息,不需要你一条我一条,内容非常基础
资源是个压缩包,里面包括了8个文件: C语言socket编程指南 C++标准函数库 C语言socket编程基础 C语言标准函数 C语言标准函数大全 C语言开发全程指南 C语言头文件略述 C语言头文件注释大全
基础性强:C语言是一门基础性的编程语言,它直接涉及到计算机的内存管理、指针操作等底层知识。学习C语言有助于深入理解计算机的工作原理,为后续学习其他高级语言打下坚实基础。 可移植性好:C语言编写的程序可以...
基于C语言实现socket套接字双机通信源码(ubuntu与windows).zip 该项目是个人毕设项目源码,评审分达到95分,都经过严格调试,确保可以运行!放心下载使用。 该项目资源主要针对计算机、自动化等相关专业的学生或从业...
主要介绍了Linux中使用C语言实现基于UDP协议的socket通信示例,服务器端与客户端的功能都非常基础,需要的朋友可以参考下
C语言网络编程快速入门 C语言的学习,一般的方式是:先学C,然后是C++, 最好还要有汇编语言和微机原理基础,然后才是Visual...其实,具有了C语言基础后,再有一些基本的C++ 类的概念,就可以直接学习Windows C编程了。
汇总了计算机研究生复试有关C语言程序设计各章节简答题,使用了易于口头表达的语言进行了总结。包括C语言程序设计基本概念及各章节问题回答。可供研究生复试或相关...SOCKET基础之C/S通信过程; C和C++的区别; ... ...
本压缩包系东北大学软件学院信息安全专业 《程序实践2》所用 代码及报告仅供参考 libpcap环境搭建等等基础linux程序设计 ├─libpcap环境搭建 ├─Linux-PDF Version...│ └─socket ├─基于libpcap的C编程 └─报告
Windows(VC6+doc)下C语言多线程聊天室,使用Socket套接字编程,具有多人聊天和私聊的功能,还支持断开重新连接,适合新手学习C语言Socket基础