




已阅读5页,还剩4页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
在Linux环境下实现客户端与服务器端交互的程序,可以扩展成多个客户端与服务器端交互.运用Socket与多线程实现.用法:1. 先分别编译程序.可以运用G+命令: g+ -g-o Server Server.cpp lpthread, g+ -g-o Client Client.cpp lpthread分别编译服务器端与客户端源码。2. 打开两个终端,终端的当前路径必须包括Server跟Client程序。服务器端的终端运行./Server就可以了。客户端运行./Client “你的主机名”就可以了。3. 在这两个终端输入字符串可以实现通信。Server代码:#include#include#include#include#include#include#include#define ERROR ERROR:#define RECEIVE RECEIVE:#define INFO INFO:#define MYPORT 3490#define BACKLOG 10#define ARRAY_SIZE 256using namespace std;typedef struct sockaddr_in SockAddr;typedef struct Parameters_tFILE* fp;int sockfd; Parameters;void* ReceiveData_Server(void* param)Parameters* pParam = (Parameters*)param;char recvsARRAY_SIZE;int n = 0;/coutINFOpParams sockfd is (*pParam).sockfdendl;while(1)if(n = recv(*pParam).sockfd, recvs, ARRAY_SIZE, 0) = 0)return NULL;else if(n 0)coutINFOFail to receive message 0)recvsn-1 = 0;coutRECEIVErecvsendl;coutn is nendl;return NULL;void* SendData_Server(void* param)char sendsARRAY_SIZE = 0;int n = 0;Parameters* pParam = (Parameters*)param;while(1)if(fgets(sends, ARRAY_SIZE, (*pParam).fp) != NULL)send(*pParam).sockfd, sends, strlen(sends), 0);bool CreateThread(FILE* fp, int sockfd)typedef void* (*Fun)(void *);Fun pFun = NULL;Parameters param1, param2;pthread_t pThread1, pThread2;int ret;param1.fp = fp;param1.sockfd = sockfd;pFun = ReceiveData_Server;ret = pthread_create(&pThread1, NULL, ReceiveData_Server, ¶m1);if(ret != 0)coutERRORFail to create receive thread!endl;return false;param2.fp = stdin;param2.sockfd = sockfd;ret = pthread_create(&pThread2, NULL, SendData_Server, ¶m2);if(ret != 0)coutERRORFail to create send thread!endl;return false;/wait for child-threads to exitpthread_join(pThread1, NULL);pthread_join(pThread2, NULL);return true; int main(int args, char* argv)int ret, sockfd, newSockFd;SockAddr mySerAddr, theirAddr;socklen_t sockLen = sizeof(SockAddr);socklen_t sin_size = sizeof(SockAddr);pid_t pid=1;sockfd = socket(AF_INET, SOCK_STREAM, 0);if(sockfd 0)coutERRORFail to creat socket in server!endl;return -1;mySerAddr.sin_family = AF_INET;mySerAddr.sin_port = htons(MYPORT);mySerAddr.sin_addr.s_addr = htonl(INADDR_ANY);bzero(&(mySerAddr.sin_zero), 8); ret = bind(sockfd, (const struct sockaddr *)&mySerAddr, sockLen);if(ret 0)coutERRORFail to bind socket!endl;return -1;ret = listen(sockfd, BACKLOG);if(ret 0)coutERRORFail to listen!endl;return -1;elsecoutINFOServer is listenning!endl;while(1)if(pid != 0)newSockFd = accept(sockfd, (struct sockaddr *)&theirAddr, &sin_size);if(newSockFd 0)coutERRORerror in acceptendl;coutpid is pidendl;return -1;elsecoutpid is pidendl;coutINFOCreate new socket for client:(*(SockAddr*)&theirAddr).sin_addr.s_addrendl;if(pid = fork() = 0)close(sockfd);CreateThread(stdin, newSockFd);close(newSockFd);else/wait for child-process to exit.pid_t pid2;pid2 = wait(NULL);coutParent process catch child process id:!pid2endl;close(newSockFd);close(sockfd);客户端代码:#include#include#include#include#include#include#includeusing namespace std;#define ERROR ERROR:#define SEND SEND:#define RECEIVE RECEIVE:#define INFO INFO#define CLIENT_PORT 3490#define ARRAY_SIZE 256typedef struct sockaddr_in SockAddr;typedef struct Parameters_tFILE* fp;int sockfd;Parameters;void* SendData_Client(void* param)char sendsARRAY_SIZE = 0;int n = 0;Parameters* pParam = (Parameters *)param;while(1)if(fgets(sends,ARRAY_SIZE,(*pParam).fp) != NULL)send(*pParam).sockfd, sends, strlen(sends),0);void* ReceiveData_Client(void* param)Parameters* pParam = (Parameters*)param;char recvsARRAY_SIZE;int n = 0;while(1)if(n = recv(*pParam).sockfd, recvs, ARRAY_SIZE, 0) = 0) return NULL;else if(n 0)coutINFOFail to receive message 0)recvsn-1 = 0;coutRECEIVErecvsendl;return NULL;bool CreateThread(FILE* fp, int sockfd)Parameters param1, param2;pthread_t thread1, thread2;int ret;param1.sockfd = sockfd;param1.fp = fp;ret = pthread_create(&thread1, NULL, SendData_Client, ¶m1);if(ret 0)coutERRORFail to create sending data thread!endl;return false;param2.sockfd = sockfd;param2.fp = stdout;ret = pthread_create(&thread2, NULL, ReceiveData_Client, ¶m2);if(ret 0)coutERRORFail to create Receive data thread!endl;return false;/wait for child-threads to exit;pthread_join(thread1, NULL);pthread_join(thread2, NULL);/pthread_join(thread1, NULL);return true;int main(int argc, char* argv)int sockfd, ret;SockAddr sockAddr;struct hostent* phost;if(argc 2)coutERRORInvalid parameters!endl;return -1;if(phost = gethostbyname(argv1) = NULL)coutERRORFail to get hostname!h_addr_list;for(; *addrs != NULL; addrs+)sockfd = socket(AF_INET, SOCK_STREAM, 0);if(sockfd 0)coutERRORFail to create socket!endl;continue;sockAddr.sin_family = AF_INET;sockAddr.sin_port = htons(CLIENT_PORT);memcpy(&sockAddr.sin_addr, *addrs, sizeof(struct in_addr);bzero(sockAddr.sin_zero, 8);ret = connect(sockfd, (struct sockaddr*)&sockAddr, sizeof(struct sockaddr);if(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 食品质量保证协议书
- 三亚互联网营销方案设计
- 大理展台的搭建咨询方案
- 国企改革方案咨询
- 6.城市雕塑教学设计-2025-2026学年小学美术六年级下册人美版(常锐伦、欧京海)
- 3.1 排列、组合与二项式定理说课稿-2025-2026学年中职数学拓展模块人教版
- 2025国际汉语教师证书考试跨文化交际能力培养与训练试卷及答案
- 山东省惠州市惠东县梁化中学九年级化学上册 4.1 原子的构成说课稿 新人教版
- 中考化学无锡试卷及答案
- 四年级数学(小数加减运算)计算题专项练习与答案汇编
- 地质灾害治理工程单元、分部、分项工程划分(完整资料)
- 拌合站拆除作业安全技术交底
- 胰岛素的种类及应用(共26张PPT)
- 数学教师简历模板3篇
- YY/T 1269-2015血液透析和相关治疗用水处理设备常规控制要求
- GB/T 96.1-2002大垫圈A级
- 2022年湖南食品药品职业学院单招综合素质考试笔试试题及答案解析
- 完整版隧道项目消防工程施工组织设计方案
- 《内科学》人卫第9版教材
- 赤峰元宝山电厂超低排放改造在建脱硫吸收塔“3.23”火灾事故报告
- 金坛区苏科版四年级心理健康教育第2课《别人眼中的我》课件(定稿)
评论
0/150
提交评论