分析一个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的更多相关文章

  1. Android简单实现Socket通信,client连接server后,server向client发送文字数据

    案例实现的是简单的Socket通信,当client(Androidclient)连接到指定server以后,server向client发送一句话文字信息(你能够拓展其他的了) 先看一下服务端程序的实现 ...

  2. [001]socket通信--server和client实现迭代的简单例子

    server端: #include<stdio.h> #include<stdlib.h> #include<string.h> #include<unist ...

  3. [000]socket通信--server和client实现的简单例子

    在C语言中就学过scanf和printf,其实理解socket就跟这两个输入输出差不多,只不过是信息的传输而已. 1.TCP服务器端(server)的默认函数调用顺序: 按照上述的调用顺序,我们可以来 ...

  4. (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 ...

  5. C# Socket TCP Server & Client & nodejs client

    要调试公司某项目里的一个功能,因为要准备测试环境,趁这个机会重温了一下Socket(全还给老师了 -_-#),做个备份. C# Server static void Main(string[] arg ...

  6. libevent 实现的socket 通信 server以及解决找不到动态库的方法

    注: client 个人觉得没必要用 libvent来实现就没写 注:由于 涉及到回调函数的使用 如有疑惑的可以先去了解回调函数的实现机理 先来说一下 libevent主要是干啥的 : 内部封装了 s ...

  7. 调试一个socket通信bug的心理过程和反思

    背景交代.最近在玩lua的服务端编码, 有项目A,B,AB都是同一个模子的.我手上有A的winsocket客户端和服务端的代码,B项目早期的一份linux下的lua client.服务端.客户端都是L ...

  8. AgileEAS.NET SOA 中间件平台.Net Socket通信框架-简单例子-实现简单的服务端客户端消息应答

    一.AgileEAS.NET SOA中间件Socket/Tcp框架介绍 在文章AgileEAS.NET SOA 中间件平台Socket/Tcp通信框架介绍一文之中我们对AgileEAS.NET SOA ...

  9. Socket通信的Python实现

    Python中实现socket通信,socket通信的服务端比较复杂,而客户端非常简单,所以客户端基本上都是用sockct模块实现,而服务 端用有很多模块可以使用.下面就说一下服务端可使用的模块. 模 ...

随机推荐

  1. One Person Game(扩展欧几里德求最小步数)

    One Person Game Time Limit: 2 Seconds      Memory Limit: 65536 KB There is an interesting and simple ...

  2. Maven模块聚合与继承

    聚合 假如有account-email和account-persist两个模块,我们想要一次构建这两个项目,这时须要用到聚合. 聚合模块 package值必须为pom 必须有元素modules mod ...

  3. Swift语言iOS开发:CALayer十则示例

    如你所知,我们在iOS应用中看到的都是视图(view),包括按钮视图.表视图.滑动条视图,还有可以容纳其他视图的父视图等. AD:[活动]Web和APP兼容性实战 Win10训练营免费报名 如你所知, ...

  4. JS中onload的各种使用

    1.最简单的调用方式 直接写到html的body标签里面,如: <html> <body onload="func()"> </body> &l ...

  5. git 无法添加文件夹下文件

    最近做项目时,发现无法提交某个子文件夹下的文件. google后发现可能是该子文件夹下有.git文件夹导致无法上传. 删除子文件夹下.git后,依然无法提交子文件夹下的文件. 继续google, 尝试 ...

  6. LeetCode:链表排序

    Sort a linked list in O(n log n) time using constant space complexity. public class Solution { publi ...

  7. 【Linux命令】数据库mysql配置命令

    # 检查MySQL服务器系统进程 ~ ps -aux|grep mysql mysql 1103 0.0 0.3 492648 51780 ? Ssl 14:04 0:21 /usr/sbin/mys ...

  8. 关于MooTools你应该熟知的6个基本知识

    MooTools是一个精简.模组化同时也面向对象的JavaScript框架,它设计给中等和进阶的JavaScript开发人员使用.使用 MooTools优美.详细而条理分明的API,可让你写出强大.富 ...

  9. 工程脚本插件方案 - c集成Python基础篇(VC++嵌入Python)

    序: 为什么要集成脚本,怎么在工程中集成Python脚本. 在做比较大型的工程时,一般都会分核心层和业务层.核心层要求实现高效和稳定的基础功能,并提供调用接口供业务层调用的一种标准的框架划分.在实际中 ...

  10. springMVC + mybatis 搜索 分页等

    mybatis-3.0.5spring-core-3.2.0.RELEASE等MyBatis3+Spring3当前Spring版本(3.0.5)中未提供对MyBatis3的支持使用第三方jar包进行整 ...