




已阅读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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年公路水运工程试验检测专业技术人员职业常考试题库及完整答案
- Python大模型基础与智能应用(微课版)课件第4章 机器学习模型与实现
- 护士2025年度考核个人总结5篇
- 社区网格员消防知识培训课件
- 江西省南昌市高新区2024-2025学年五年级下册期末考试语文试卷(有答案)
- 瓷砖铺贴合同范本
- 小区消防监控合同范本
- 办学资质租赁合同范本
- 美甲店工作安全合同范本
- 塘渣购销合同范本
- GB/T 14337-2008化学纤维短纤维拉伸性能试验方法
- 平行平板的多光束干涉
- 广西壮族自治区瑶药材质量标准第一卷
- 催化重整装置大赛题库(技师、高级技师)
- 如何预防四季豆中毒
- 柯桥区高校毕业生引聚政策实施细则(暂行)
- 新员工安全培训试题2
- 硫酸法钛白生产工艺操作规程
- TSG 81-2022 场(厂)内专用机动车辆安全技术规程
- 柴油供货合同范本模板
- 2022年软件项目实施方案书模板(投标版)(完整版)
评论
0/150
提交评论