《Linux环境下Server与Client交互(Socket 多线程).docx》由会员分享,可在线阅读,更多相关《Linux环境下Server与Client交互(Socket 多线程).docx(9页珍藏版)》请在金锄头文库上搜索。
1、在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#i
2、nclude#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(v
3、oid* 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;
4、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 pF
5、un = 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.so
6、ckfd = 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, newSock
7、Fd;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);mySerA
8、ddr.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 listennin
9、g!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(
10、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
11、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 = (Para
12、meters *)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)Paramet