分析一个socket通信: server/client
分析一个socket通信: server/client1
server
1. 创建一个server_socket文件,并绑定端口,然后监听端口 (socket, bind, listen)
2. 查询该端口是否有客户端的连接:
while(1)
{
查询这个端口是否有来自client的消息;(accept)// accept: input is server_socket_fd ; ret value is client_socket_fd
如果有,返回client_socket_fd, 并把消息读出来 (rcv from client_socket_fd); 当然这个时候server也可以send to client_socket.
}
client
1. 创建一个client_socket文件,绑定端口和server ip,然后通过这个socket去和server的socket连接起来 (socket, connect);
2. 连接成功后,client往client_socket写东西(send to client_socket_fd). 当然这个时候client也可以rcv from client_socket.
client_socket文件的作用是client和server之间的一个通信管道。
debug代码:
//client:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h> #define N 128 typedef struct sockaddr SA; extern void show_time(void); int main(int argc, char *argv[])
{
int sockfd, fd, nbyte;
char command[];
struct sockaddr_in server_addr; if (argc < )
{
printf("Usage : %s <server_ip> : <port>\n", argv[]);
exit(-);
} memset(&server_addr, , sizeof(server_addr));
server_addr.sin_family = PF_INET;
server_addr.sin_port = htons(atoi(argv[]));
server_addr.sin_addr.s_addr = inet_addr(argv[]); while ( )
{
printf("<client> ");
fgets(command, , stdin);
command[strlen(command)-] = '\0'; // overwrite the '\n' if ((sockfd = socket(PF_INET, SOCK_STREAM, )) < )
{
printf("fail to get\n");
return;
}
printf("socket\n");show_time();
if (connect(sockfd, (SA *)&server_addr, sizeof(server_addr)) < )
{
printf("fail to connect server\n");
return;
}
printf("send\n");show_time();
send(sockfd, command, strlen(command)+, );
printf("send over\n");show_time();
close(sockfd);
} return ;
}
//break client.c:41
//server:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#include <dirent.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h> #define N 128 typedef struct sockaddr SA;
extern void show_time(void); int main(int argc, char *argv[])
{
int listenfd, connfd;
char buf[N];
struct sockaddr_in server_addr; // XXX:step 1 int socket(int domain, int type, int protocol);
if ((listenfd = socket(PF_INET, SOCK_STREAM, )) < )
{
fprintf(stderr, "fail to socket : %s\n", strerror(errno));
exit(-);
}
#ifdef _DEBUG_
printf("socket is %d\n", listenfd);
#endif // XXX:step 2 int bind(int sockfd, const struct sockaddr *serv_addr, socklen_t addrlen);
memset(&server_addr, , sizeof(server_addr));
server_addr.sin_family = PF_INET;
server_addr.sin_port = htons();
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
if (bind(listenfd, (SA *)&server_addr, sizeof(server_addr)) < )
{
perror("fail to bind");
exit(-);
} listen(listenfd, );
static int counter = ;
while ( )
{
if ((connfd = accept(listenfd, NULL, NULL)) < )
{
perror("fail to accept"); show_time();
break;
}else{
printf("a connect from client accepted, counter = %d\n", counter++); show_time();
}
recv(connfd, buf, N, );
printf("recvd from client\n"); show_time();
send(connfd, "", , );
printf("sent to client\n"); show_time();
close(connfd);
} return ;
}
调试:
gcc -g client.c show_time.c -o client
gcc -g server.c show_time.c -o server
1. 打断点:
//break client.c:41
2. 跑server
3. 单步跑client,
当line47跑完 if (connect(sockfd, (SA *)&server_addr, sizeof(server_addr)) < 0) 的时候,
server打印“a connect from client accepted, counter = 0”
if ((connfd = accept(listenfd, NULL, NULL)) < )
{
perror("fail to accept"); show_time();
break;
}else{
printf("a connect from client accepted, counter = %d\n", counter++); show_time();
}
当line53跑完 send(sockfd, command, strlen(command)+1, 0) 的时候,
server打印 ”recvd from client “
recv(connfd, buf, N, );
printf("recvd from client\n"); show_time();
上面的实验说明了:
socket通信的几个函数接口之间的关系和时序。accept阻塞地等待client的connect接入;recv阻塞地等待client send的数据。
分析一个socket通信: server/client的更多相关文章
- Android简单实现Socket通信,client连接server后,server向client发送文字数据
案例实现的是简单的Socket通信,当client(Androidclient)连接到指定server以后,server向client发送一句话文字信息(你能够拓展其他的了) 先看一下服务端程序的实现 ...
- [001]socket通信--server和client实现迭代的简单例子
server端: #include<stdio.h> #include<stdlib.h> #include<string.h> #include<unist ...
- [000]socket通信--server和client实现的简单例子
在C语言中就学过scanf和printf,其实理解socket就跟这两个输入输出差不多,只不过是信息的传输而已. 1.TCP服务器端(server)的默认函数调用顺序: 按照上述的调用顺序,我们可以来 ...
- (OK) Linux epoll模型—socket epoll server client chat
http://www.cnblogs.com/venow/archive/2012/11/30/2790031.html http://blog.csdn.net/denkensk/article/d ...
- C# Socket TCP Server & Client & nodejs client
要调试公司某项目里的一个功能,因为要准备测试环境,趁这个机会重温了一下Socket(全还给老师了 -_-#),做个备份. C# Server static void Main(string[] arg ...
- libevent 实现的socket 通信 server以及解决找不到动态库的方法
注: client 个人觉得没必要用 libvent来实现就没写 注:由于 涉及到回调函数的使用 如有疑惑的可以先去了解回调函数的实现机理 先来说一下 libevent主要是干啥的 : 内部封装了 s ...
- 调试一个socket通信bug的心理过程和反思
背景交代.最近在玩lua的服务端编码, 有项目A,B,AB都是同一个模子的.我手上有A的winsocket客户端和服务端的代码,B项目早期的一份linux下的lua client.服务端.客户端都是L ...
- AgileEAS.NET SOA 中间件平台.Net Socket通信框架-简单例子-实现简单的服务端客户端消息应答
一.AgileEAS.NET SOA中间件Socket/Tcp框架介绍 在文章AgileEAS.NET SOA 中间件平台Socket/Tcp通信框架介绍一文之中我们对AgileEAS.NET SOA ...
- Socket通信的Python实现
Python中实现socket通信,socket通信的服务端比较复杂,而客户端非常简单,所以客户端基本上都是用sockct模块实现,而服务 端用有很多模块可以使用.下面就说一下服务端可使用的模块. 模 ...
随机推荐
- Java之旅(一)---说说“异常”那些事
从開始学习VB,就听说过"异常",认为异常处理就是加上try..catch,不让错误抛出给用户,到此为止,不要再往下问了,再问也不会了.这就是那时候的理解.如今随时项目经验的 ...
- 大数据时代之hadoop(五):hadoop 分布式计算框架(MapReduce)
大数据时代之hadoop(一):hadoop安装 大数据时代之hadoop(二):hadoop脚本解析 大数据时代之hadoop(三):hadoop数据流(生命周期) 大数据时代之hadoop(四): ...
- 高性能网站优化-创建快速响应的Web
<高性能网站建设进阶指南> 优化原则 优化的目的是希望降低程序的整体开销. 减少开销 通常认为开销就是程序的执行时间.而在进行优化工作时,应该把重点放在对程序开销影响最大的那部分. 假设我 ...
- Enze Second day
哈喽,很高兴在云和学院又学了一天的新知识,现在,我来继续总结一下今天所学的以及对昨天的一些补充. 变量 • 声明变量的语法格式: –数据类型 变量名; •赋值: 变量名=值; 变量的命名 • ...
- zookeeper集群配置
zookeeper集群网上demo一大堆,补充一下一些不明白的地方 1 复制2份zookeeper,savle作为备份节点 2.配置zoo.cfg # The number of millisecon ...
- GNU自动补全模块readline解析
readline模块定义了一系列函数用来读写Python解释器中历史命令,并提供自动补全命令功能.这个模块可以通过relcompleter模块直接调用,模块中的设置会影响解释器中的交互提示,以及内置函 ...
- js的初始化
在项目中遇到了类似于这样的js, myinit.js文件: var wyl_01 = { tip : function(msg){ alert('i am a tip,msg:'+msg); }, t ...
- 转:让ie6-8支持部分css3样式的方案
我们都知道,IE浏览器暂不支持CSS3的一些属性.国外的工程师们,不安于此现状,他们总是尽量使用一些手段使IE浏览器也能支持CSS3属性,我觉得这些都是很有意义,很有价值的工作,可以推动整个技术领域的 ...
- 多种EDA软件的鼠标增强工具EDAHelper
最新版本(unicode版本,各种语言环境显示中文)下载地址:http://www.jyxtec.com/edahelper/EDAHelper-2.1.13.7z 繁体版:http://www.jy ...
- Unable to connect to your virtual device!解决方法
使用Genymotion安卓模拟器的用户,很多朋友在启动安卓系统的时候就弹出了以下英文,不知道如何处理,今天电脑知识网小编来教您处理Genymotion安卓模拟器启动出错的问题. Error Unab ...