分析一个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. Session、SessionId和Cookie的关系

    Session是保存在服务器中的,SessionId是保存在Cookie中的. 当用户·登录时候,系统会将"用户名"和"密码"保存到Session中,系统会给每 ...

  2. HDU 1222 Wolf and Rabbit(gcd)

    HDU 1222   Wolf and Rabbit   (最大公约数)解题报告 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid= ...

  3. LightOJ 1033 Generating Palindromes(dp)

    LightOJ 1033  Generating Palindromes(dp) 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid= ...

  4. Main function

    Main function A program shall contain a global function named main, which is the designated start of ...

  5. 对面向对象的理解—— SAP电面(1)

    对于C++面向对象的理解 面向对象是在结构化设计方法出现很多问题的情况下应运而生的.结构化设计方法求解问题的基本策略是从功能的角度审视问题域.它将应用程序看成实现某些特定任务的功能模块,其中子过程是实 ...

  6. Eclipse之报错信息及其解决方案

    一.有很多人都喜欢开发js的时候用aptana,因此在eclipse中集成aptana插件是必须的,可是,在用link方式在eclipse中安装好aptana后,启动时会报如下错误 An intern ...

  7. git配合tortoiseGit的基础使用

    转载自:http://www.cnblogs.com/ssor/archive/2012/02/04/2337823.html 一定要自己写出来才能牢记,所以我来写一下 git确实比svn好用的多了, ...

  8. C语言选择法排序

    #include <stdio.h> int main() { int i, j, p, n, q; ] = {, , , , }; //对无序数组进行排序 ; i<; i++) { ...

  9. detain ssh server 设置(也许必须是root来安装?)

    ssh connection refused 处理方法 一般这种情况是 opens server 没安装 或 没启动 检查 openssh 是否安装 su 登录root账号,安装 openssh se ...

  10. Delphi 编写系统服务(服务控制线程:开始,暂停,继续,停止)

    打开Delphi 7,新建,选择Other->Service Application 修改属性中Name和DisplayName,Name是Service的名称,决定着进程的标识,Display ...