博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
写出一个TCP服务器,实现可以让两个TCP客户端通信(C/C++)简易版
阅读量:3949 次
发布时间:2019-05-24

本文共 2041 字,大约阅读时间需要 6 分钟。

今天又是无聊的一天。

想了想,可以写一个游戏。并且能实现两个人联网互动。
因为希望可以两个人通过云服务器来实现通信。
所以我选择在云服务器上,写一个TCP服务器,再将两个人的TCP信息互相转发。
那么说干就干。
首先,云服务器是Linux系统,所以库函数是在Linux下的。并且使用C/C++进行开发。
先来一个最简单的版本。就是只能两个人通信。
先放出代码。

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
int fd[2];void *pthread_fun(void *arg){ while(1) { char buf[128] = ""; int ret = recv(fd[0],buf,sizeof(buf), 0 ); if(ret == 0) { char *a = "close"; send(fd[1],a,strlen(a),0); exit(1); } send(fd[1],buf,strlen(buf),0); }}int main(int argc,char const *argv[]){ if(argc < 2){ fprintf(stderr,"usage: %s
\n",argv[0]); exit(1);}int sockfd,acceptfd;struct sockaddr_in serveraddr,clientaddr;socklen_t addrlen = sizeof(serveraddr);if((sockfd = socket(AF_INET,SOCK_STREAM,0)) < 0 ){ perror("fail to socket");}int on = 1;if(setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on)) < 0 ){ perror("fail to set sockopt ");}serveraddr.sin_family = AF_INET;serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);serveraddr.sin_port = htons(atoi(argv[1]));if(bind(sockfd,(struct sockaddr *)&serveraddr,addrlen) < 0){ perror("fail to bind");}if(listen(sockfd,20) < 0){ perror("fail to listen");} if((acceptfd = accept(sockfd,(struct sockaddr *)&clientaddr,&addrlen)) < 0) { perror("fail to accept"); } fd[0] = acceptfd; if((acceptfd = accept(sockfd,(struct sockaddr *)&clientaddr,&addrlen)) < 0) { perror("fail to accept"); } fd[1] = acceptfd; pthread_t thread ; if(pthread_create(&thread,NULL,pthread_fun,NULL) != 0) { perror("fail to pthread_create"); } pthread_detach(thread);while (1){ char buf[128] = ""; int ret = recv(fd[1],buf,sizeof(buf), 0 ); if(ret == 0) { char *a = "close"; send(fd[0],a,strlen(a),0); exit(1); } send(fd[0],buf,strlen(buf),0); }return 0 ;}

再讲解思路。

由于,希望写出最简单的双人TCP客户端通信。所以采用文件描述符数组的方式,来让双方获取到对方的文件描述符,以便发送。
在其余部分,获取前两次TCP连接,将一个TCP客户端通过线程分离单独处理。
由于数组是全局变量,在一个进程中所有线程函数共享全局变量,所以在获得到两个TCP客户端后,就可以通过对方的文件描述符进行发送,只需要接收自己文件描述符发来的数据进行转发数据。就可以实现这个功能了。然后也要对任意一方退出时进行处理。
如果用Python写的话,会更加简便。
在这里插入图片描述

转载地址:http://ruewi.baihongyu.com/

你可能感兴趣的文章
Android开发:一些有用的库(第一部分)
查看>>
Android 默认暗码
查看>>
Android 系列 1.3了解Android版本
查看>>
Android 系列 6.28使用正确的复数格式化
查看>>
Android 系列 6.29创建在两个活动之间显示的加载屏幕
查看>>
Android的Gradle技巧 1.2配置SDK版本和其他默认值
查看>>
Android的Gradle技巧 1.3从命令行执行Gradle构建
查看>>
Android的Gradle技巧 1.4从Android Studio执行Gradle构建
查看>>
Android的Gradle技巧 1.5添加Java库依赖关系
查看>>
Android的Gradle技巧 1.6使用Android Studio添加库依赖关系
查看>>
Android的Gradle技巧 1.7配置存储库
查看>>
android Collections 排序,
查看>>
Android的Gradle技巧 2.1设置项目属性
查看>>
Android的Gradle技巧 2.2将应用程序从Eclipse ADT移植到Android Studio
查看>>
Android的Gradle技巧 2.3从Eclipse移植应用程序ADT使用Eclipse
查看>>
昂山素季 Aung San Suu Kyi
查看>>
AI 人工智能第一课 从贝叶斯定理开始
查看>>
朴素贝叶斯python实现
查看>>
Logistic回归原理及公式推导
查看>>
并发性与并行性 并发性与并行性
查看>>