linux 网络编程【二】 基本阻塞通信
来源:互联网 发布:php开发的博客 编辑:程序博客网 时间:2024/06/10 04:15
基本流程
- 服务器端
- 声明句柄fd和网络地址sockaddr_in
- 赋值sockaddr_in为服务器的端口和INADDR_ANY表明监听任意连接
- 调用socket函数创建一个socket并赋值句柄为fd
- 调用bind函数将句柄fd和网络地址sockaddr_in进行绑定
- 调用listen函数开始监听客户端的连接
- 调用accept函数获得连接的客户端
- 调用send recv函数进行数据发送和操作
- 客户端
- 声明句柄fd和网络地址server_addr
- 赋值server_addr为服务器的ip和port
- 调用connect进行连接
- 调用send recv函数进行数据的发送和接收操作
代码分析(转载)
该代码转载自点击打开链接
- Client 端代码:
/* sockclnt.c*/#include <string.h>#include <stdlib.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h> /*for struct sockaddr_in*/#define DEST_IP "65.52.207.217"#define DEST_PORT 4000int main(){ int res; int sockfd; struct sockaddr_in dest_addr; char *msg = "Hello world\n"; int len, bytes_sent; /* 取得一个套接字*/ sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd == -1) { perror("socket()"); exit(1); } /* 设置远程连接的信息*/ dest_addr.sin_family = AF_INET; /* 注意主机字节顺序*/ dest_addr.sin_port = htons(DEST_PORT); /* 远程连接端口, 注意网络字节顺序*/ dest_addr.sin_addr.s_addr = inet_addr(DEST_IP); /* 远程 IP 地址, inet_addr() 会返回网络字节顺序*/ bzero(&(dest_addr.sin_zero), 8); /* 其余结构须置 0*/ /* 连接远程主机,出错返回 -1*/ res = connect(sockfd, (struct sockaddr *)&dest_addr, sizeof(struct sockaddr_in)); if (res == -1) { perror("connect()"); exit(1); } len = strlen(msg); bytes_sent = send(sockfd, /* 连接描述符*/ msg, /* 发送内容*/ len, /* 发关内容长度*/ 0); /* 发送标记, 一般置 0*/ /* 关闭连接*/ close(sockfd);}
- Server 端的代码:
/* socksrv.c*/#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h> /* for struct sockaddr_in*/#define BACKLOG 10#define MYPORT 4000int main(){ char *addr; int sockfd; int new_fd; struct sockaddr_in my_addr, their_addr; int res; int sin_size; char *buf; /* 取得套接字描述符*/ sockfd = socket(AF_INET, /* domain*/ SOCK_STREAM, /* type*/ 0); /* protocol*/ if (sockfd == -1) { perror("socket"); exit(1); } /* Init sockaddr_in */ my_addr.sin_family = AF_INET; /* 注意: 应使用主机字节顺序*/ my_addr.sin_port = htons(MYPORT); /* 注意: 应使用网络字节顺序*/ my_addr.sin_addr.s_addr = htonl(INADDR_ANY); /* 使用自己的 IP 地址 */ bzero(&(my_addr.sin_zero), 8); /* 结构的其余的部分须置 0*/ /* 指定一个套接字使用的地址及端口*/ res = bind(sockfd, (struct sockaddr*)&my_addr, sizeof(struct sockaddr)); if (res == -1) { perror("bind"); exit(1); } /* 监听请求, 等待连接*/ res = listen(sockfd, BACKLOG); /* 未经处理的连接请求队列可容纳的最大数目*/ if (res == -1) { perror("listen"); exit(1); } /* 接受对方的连接请求, 建立连接,返回一个新的连接描述符. * 而第一个套接字描述符仍在你的机器上原来的端口 listen() */ sin_size = sizeof(struct sockaddr_in); new_fd = accept(sockfd, (void *)&their_addr, &sin_size); buf = (char *)malloc(255); if (buf == NULL) { printf("malloc failed\n"); exit(1); } /* 接受对方发来的数据*/ res = recv(new_fd, buf, 255, 0); if (res == -1) { perror("recv()"); exit(1); } /* 关闭本次连接*/ close(new_fd); /* 关闭系统监听*/ close(sockfd); printf("recv data:%s\n", buf); free(buf); return 0;}
- linux 网络编程【二】 基本阻塞通信
- linux 网络编程【二】 基本阻塞通信
- Linux 网络编程一:基本阻塞通信
- Linux 网络编程二:非阻塞select
- linux 网络编程【三】 非阻塞通信select
- linux 网络编程【四】 非阻塞通信poll
- linux 网络编程【五】 非阻塞通信epoll
- linux 网络编程【三】 非阻塞通信select
- linux 网络编程【四】 非阻塞通信poll
- linux 网络编程【五】 非阻塞通信epoll
- linux 网络编程【四】 非阻塞通信poll
- linux 网络编程【五】 非阻塞通信epoll
- 深入Linux网络编程(二):异步阻塞IO----select
- 深入linux网络编程(二):异步阻塞IO
- Windows网络编程之(二)Socket通信非阻塞模式Select(TCP和UDP)
- linux网络编程--第一弹UDP基本通信
- Linux网络编程(二) 基本TCP套接字编程
- linux 下socket编程 一对一阻塞通信
- 植物生长问题
- JAVA布局管理
- android 之 Spinner 下拉菜单的使用
- Android bound service 详解四:service绑定及生命期
- 怎么向技术大牛提问?
- linux 网络编程【二】 基本阻塞通信
- 常见的10种“瓶颈”
- Java SSH远程执行Shell脚本实现
- 用5种方式获得一个文件的扩展名(后缀名)
- linux 从xshell默认密码登陆
- android4.0.1 源码环境搭建之源码编译
- 原来BIOS放电是要在断电的情况下进行的
- 解决AI 转JPG
- UITableViewCell点击时颜色的选取