本文共 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/