TCP服务器、客户端之间的相互通信
来源:互联网 发布:蜗居 知乎 编辑:程序博客网 时间:2024/05/22 03:18
TCP服务器、客户端之间的相互通信
之前的版本只能实现TCP服务器之间单发单收,此版本能实现TCP服务器和客户端之间的相互通信。
见下面的程序:
tcp_server.c
#include <stdio.h>#include <string.h>#include <stdlib.h>#include <sys/types.h>#include <sys/socket.h>#include <errno.h>#include <arpa/inet.h>#define PORT 3333int main(){ int sockfd; int sock_fd; struct sockaddr_in server_addr; struct sockaddr_in client_addr; int addrlen = sizeof(struct sockaddr); int addrinlen = sizeof(struct sockaddr_in); int recvbytes; char buf[512]; char buf1[1024]; //服务器创建套接字 if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { fprintf(stderr, "socket error:%s\n", strerror(errno));exit(1); } //服务器填充sockaddr结构 bzero(&server_addr, addrinlen); server_addr.sin_family = AF_INET; //server_addr.sin_addr.s_addr = htonl(INADDR_ANY);//INADDR_ANY表示可以接收任意IP地址的数据,即绑定所有的IP server_addr.sin_addr.s_addr = inet_addr("192.168.1.222");//用于绑定到一个固定的IP,inet_addr用于把数字加格式的IP转化为整形IP server_addr.sin_port = htons(PORT); //绑定socket到IP地址 if(bind(sockfd, (struct sockaddr *)&server_addr, addrlen) < 0) { fprintf(stderr, "bind error:%s\n", strerror(errno));exit(1); } //设置允许连接的最大客户端数目 if(listen(sockfd, 5) < 0) { fprintf(stderr, "listen error:%s\n", strerror(errno));exit(1); } while(1) { //建立连接if((sock_fd = accept(sockfd, (struct sockaddr *)&client_addr, &addrinlen)) < 0){ fprintf(stderr, "accept error:%s\n", strerror(errno)); exit(1);}if((recvbytes = recv(sock_fd, buf, 512, 0)) < 0){ fprintf(stderr, "recv error:%s\n", strerror(errno)); close(sockfd); close(sock_fd); exit(1); } buf[recvbytes] = '\0'; printf("receive from client is %s", buf);sleep(1);printf("Please input:");fgets(buf1, 1024, stdin);if(send(sock_fd, buf1, 1024, 0) < 0){ fprintf(stderr, "send error:%s\n", strerror(errno)); close(sockfd); close(sock_fd); exit(1); }//通讯结束 close(sock_fd); } //关闭 close(sockfd); return 0;}
tcp_client.c
#include <stdio.h>#include <string.h>#include <stdlib.h>#include <sys/types.h>#include <sys/socket.h>#include <errno.h>#include <arpa/inet.h>#define PORT 3333int main(){ int sockfd; struct sockaddr_in server_addr; int addrlen = sizeof(struct sockaddr); int addrinlen = sizeof(struct sockaddr_in); char buf[512]; char buf1[1024]; //客户端程序创建套接字 if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { fprintf(stderr, "socket error:%s\n", strerror(errno));exit(1); } //客户端程序填充服务器的资料 bzero(&server_addr, addrlen);//初始化,置0 server_addr.sin_family = AF_INET;//IPv4 //server_addr.sin_addr.s_addr = htonl(INADDR_ANY);// server_addr.sin_addr.s_addr = inet_addr("192.168.1.222"); server_addr.sin_port = htons(PORT);//将本机的short数据转化为网络上的short数据——端口号 //服务器发起连接请求 if(connect(sockfd, (struct sockaddr *)&server_addr, addrlen) < 0) { fprintf(stderr, "bind error:%s\n", strerror(errno));exit(1); } while(1) { //连接成功 printf("Please input:"); fgets(buf, 512, stdin); //发送数据 if(send(sockfd, buf, 512, 0) < 0) { fprintf(stderr, "send error:%s\n", strerror(errno));close(sockfd);exit(1); } //write(sockfd, buf, strlen(buf)); memset(buf1, 0, sizeof(buf1)); if(read(sockfd, buf1, sizeof(buf1)) < 0) { fprintf(stderr, "listen error:%s\n", strerror(errno));close(sockfd);exit(1); } printf("receice from server is %s", buf1); close(sockfd); } //关闭套接字 close(sockfd); return 0;}
运行结果:
0 0
- TCP服务器、客户端之间的相互通信
- Java基于TCP实现服务器和多客户端之间的通信
- 实现客户端和服务器之间的通信(TCP协议、多线程)
- TCP实现客户端和服务器的通信
- 基于TCP的服务器/客户端通信
- UDP服务器客户端相互通信
- Android客户端与服务器之间的通信
- Qt中利用TCP实现多个客户端之间相互发送消息系以及服务器的群发信息
- Qt中利用TCP实现多个客户端之间相互发送消息系以及服务器的群发信息
- C#基于TCP&UDP实现服务器与多个客户端之间的通信(客户端之间直接通信,不靠服务器端转发消息)
- 服务器和客户端 tcp通信
- TCP服务器客户端进程通信
- TCP服务器客户端网络通信
- 基于TCP的客户端与服务器端之间的通信
- linux 网络编程:客户端与服务器通过TCP协议相互通信 + UDP
- linux 网络编程:客户端与服务器通过TCP协议相互通信
- linux 网络编程:客户端与服务器通过TCP协议相互通信
- c++做服务器,java当客户端,采用 tcp协议之相互通信demo
- EL 表达式获取 Bean 对象中 POJO 列表的某个元素的方法
- build.gradle配置学习笔记
- mysql只导出触发器及导入
- build.gradle笔记
- DPDK ACL算法介绍(转载)
- TCP服务器、客户端之间的相互通信
- 读取当前金税盘、税控盘设备里面的企业信息
- hdu1559 最大子矩阵和
- linux编写shellcode
- 【Java笔试题】输出字符串的所有组合
- AngularJS:实现页面滚动到底自动加载数据的功能
- 图像灰度的双三次插值的MATLAB实现
- Mysql的root账户忘记密码或mysqladmin: connect to server at 'localhost' failed解决方案
- Codeforces Round #379 (Div. 2)-D. Anton and Chess