TCP Echo 服务器

来源:互联网 发布:贪吃蛇算法思想 编辑:程序博客网 时间:2024/05/21 09:58

Windows版的EchoServer

#include<stdio.h>#include<winsock2.h>#include<windows.h>#pragma comment(lib,"ws2_32.lib")BOOL InitSock();//加载winsock第一个版本进行版本协商int main(){ system("color 4f");    InitSock();//加载winsock第一个版本进行版本协商 //创建套接字  SOCKET m_SrvSocket=socket(AF_INET,SOCK_STREAM,0); SOCKADDR_IN m_SrvAddr; m_SrvAddr.sin_addr .S_un .S_addr =htonl(INADDR_ANY); // m_SrvAddr.sin_addr .S_un .S_addr =inet_addr("10.0.2.10"); m_SrvAddr.sin_family =AF_INET; m_SrvAddr.sin_port =htons(5554); bind(m_SrvSocket,(SOCKADDR*)&m_SrvAddr,sizeof(SOCKADDR));//绑定端口号 if(SOCKET_ERROR==listen(m_SrvSocket,10))//监听客户端的请求 {  ::MessageBox(NULL,"监听失败","failed",0);  closesocket(m_SrvSocket);     WSACleanup();  return 0; } SOCKADDR_IN m_ClientAddr; int len=sizeof(SOCKADDR); //char Recv[200];  //char SendBuf[200]; //SOCKET connect=accept(m_SrvSocket,(SOCKADDR*)&m_ClientAddr,&len); printf("....服务器启动.../n");// printf("%s/n",m_SrvAddr.sin_addr .S_un .S_addr); /*SOCKET connect=accept(m_SrvSocket,(SOCKADDR*)&m_ClientAddr,&len);//与客户端建立连接 if(connect== INVALID_SOCKET ) {   ::MessageBox(NULL,"连接失败","ERROR",0);   closesocket(m_SrvSocket);   WSACleanup();   return 0; }*/ //closesocket(connect); char buffer[2048]; memset(buffer,0,sizeof(buffer)); char Buf[2048]; memset(Buf,0,sizeof(Buf));  while(1) {SOCKET connect=accept(m_SrvSocket,(SOCKADDR*)&m_ClientAddr,&len);//与客户端建立连接printf("==============recvclient========message/n");     recv(connect,buffer,2048,0);     sprintf(Buf,"%s say : %s",inet_ntoa(m_ClientAddr.sin_addr),buffer);     printf("%s/n",Buf);      send(connect,buffer,strlen(Buf)+1,0); }  //closesocket(connect); closesocket(m_SrvSocket); WSACleanup(); return 0;}BOOL InitSock(){  //加载winsock第一个版本进行版本协商 WORD wVersionRequested; WSADATA wsaData; int err;  wVersionRequested = MAKEWORD( 2, 2 );  err = WSAStartup( wVersionRequested, &wsaData ); if ( err != 0 ) {  /* Tell the user that we could not find a usable */  /* WinSock DLL.                                  */  return false; }  /* Confirm that the WinSock DLL supports 2.2.*/ /* Note that if the DLL supports versions greater    */ /* than 2.2 in addition to 2.2, it will still return */ /* 2.2 in wVersion since that is the version we      */ /* requested.                                        */  if ( LOBYTE( wsaData.wVersion ) != 2 ||        HIBYTE( wsaData.wVersion ) != 2 ) {  /* Tell the user that we could not find a usable */  /* WinSock DLL.                                  */  WSACleanup( );  return false;  }  /* The WinSock DLL is acceptable. Proceed. */ return true;}



 Linux版本的 EchoServer

#include <iostream>#include<sys/socket.h>#include<sys/select.h>#include<sys/ioctl.h>#include<sys/types.h>#include<stdint.h>#include<sys/time.h>#include<arpa/inet.h>#include<fcntl.h>#include<pthread.h>using namespace std;//const char gServerAddr[] = "127.0.0.1";const short gServerPort =  3555;const size_t   gRecvBufferLength = 1024;int serverSockId;sockaddr_in serverAddr;int initSocket(){    serverSockId = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);    if(-1 == serverSockId)    {//INVALID_SOCKET        return -1;    }        serverAddr.sin_addr.s_addr =  INADDR_ANY;    serverAddr.sin_family =AF_INET ;    serverAddr.sin_port =  htons(gServerPort);        if(-1==::bind(serverSockId,(sockaddr*)&serverAddr,sizeof(sockaddr)))    {        return -1;    }        if(-1==listen(serverSockId,5))    {        return -1;    }    return 0;}void doRecvWrite(){    do    {        sockaddr_in clientSocket;        socklen_t addrlen = 0;        int clientSocketId = ::accept(serverSockId,(sockaddr*)&clientSocket,&addrlen);        if(clientSocketId == -1)            continue;        cout<<"connecting from :"<<inet_ntoa(clientSocket.sin_addr)<<endl;        while(1)        {            char recvData[gRecvBufferLength] = {0};            int recvLength = recv(clientSocketId, recvData,gRecvBufferLength,0);            if(recvLength>0)            {                send(clientSocketId,recvData,gRecvBufferLength,0);            }            else if(recvLength ==0)            {                cout<<"disconnected :"<<inet_ntoa(clientSocket.sin_addr)<<endl;                break;            }        }                   } while (1);}int main(int argc, const char * argv[]){    if(-1==initSocket())    {        cout<<"init failed"<<endl;    }    else    {        cout<<"server running"<<endl;        doRecvWrite();    }    return 0;}

原创粉丝点击