linux 网络编程【二】 基本阻塞通信
来源:互联网 发布:青岛飞拉利和淘宝比 编辑:程序博客网 时间:2024/04/30 07:34
基本流程
- 服务器端
- 声明句柄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 4000
- int 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 4000
- int 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;
- }
0 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编程 一对一阻塞通信
- 浅谈SIFT特征描述子
- 自适应页面设计(Responsive Web Design)
- 打开和关闭sqlplus的屏幕输出
- linux 网络编程【一】 socket地址
- Java 开发环境搭建
- linux 网络编程【二】 基本阻塞通信
- linux 网络编程【三】 非阻塞通信select
- hadoop dfs下文件的操作
- linux 网络编程【四】 非阻塞通信poll
- CSS架构
- system库函数调用
- linux 网络编程【五】 非阻塞通信epoll
- lambda的一些用法
- Chromium的连接管理