TCP通信示例程序

原文地址::http://blog.csdn.net/durongjian/article/details/5445657

 

 

服务器端程序:

  1. /* 
  2. 程序名称:TCP通信示例程序服务器端 
  3. 作者:天行健 
  4. 完成时间:2010-4-2  17:00 
  5. */  
  6. #include <iostream>  
  7. #include <WINSOCK2.h>  
  8. using namespace std;  
  9. #pragma comment(lib,"wsock32.lib")  
  10. #define BUF_SIZE 64  
  11.   
  12. void main()  
  13. {  
  14.     WSADATA wsd;                //WSADATA变量  
  15.     SOCKET sServer,sClient;        //服务器端和客户端套接字  
  16.     int retVal;                    //返回值  
  17.     char buf[BUF_SIZE];            //存放客户端发来的字符的缓冲区  
  18.   
  19.     //第一步:初始化套接字动态库  
  20.     if(WSAStartup(MAKEWORD(2,2),&wsd)!=0)  
  21.     {  
  22.         cout<<"WSAStartup failed!"<<WSAGetLastError()<<endl;  
  23.         return;  
  24.     }  
  25.   
  26.       
  27.     sServer=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);  
  28.     if(sServer==INVALID_SOCKET)  
  29.     {  
  30.         cout<<"socket failed:"<<WSAGetLastError()<<endl;  
  31.         WSACleanup();            //释放套接字资源  
  32.         return;  
  33.     }  
  34.   
  35.     //第二步:绑定套接字  
  36.     SOCKADDR_IN addrServer;        //服务器套接字地址信息  
  37.     addrServer.sin_family=AF_INET;  
  38.     addrServer.sin_port=htons(4999);  
  39.     addrServer.sin_addr.s_addr=INADDR_ANY;  
  40.   
  41.     retVal=bind(sServer,(LPSOCKADDR)&addrServer,sizeof(SOCKADDR_IN));  
  42.     if(SOCKET_ERROR==retVal)  
  43.     {  
  44.         cout<<"bind failed:"<<WSAGetLastError()<<endl;  
  45.         closesocket(sServer);  
  46.         WSACleanup();  
  47.         return;  
  48.     }  
  49.   
  50.     //第三步:监听   
  51.     retVal=listen(sServer,5);  
  52.     if(SOCKET_ERROR==retVal)  
  53.     {  
  54.         cout<<"listen failed:"<<WSAGetLastError()<<endl;  
  55.         closesocket(sServer);    //半闭套接字  
  56.         WSACleanup();            //释放套接字资源  
  57.         return;  
  58.     }  
  59.       
  60.     //第四步:接受客户端连接  
  61.     sockaddr_in addrClient;  
  62.     int addrClientlen=sizeof(addrClient);  
  63.     sClient=accept(sServer,(sockaddr FAR*)&addrClient,&addrClientlen);  
  64.     if(INVALID_SOCKET==sClient)  
  65.     {  
  66.         cout<<"accept failed:"<<WSAGetLastError()<<endl;  
  67.         closesocket(sServer);  
  68.         WSACleanup();  
  69.         return;  
  70.     }  
  71.   
  72.     //第五步:接收并显示数据  
  73.     ZeroMemory(buf,BUF_SIZE);  
  74.     retVal=recv(sClient,buf,BUF_SIZE,0);  
  75.     if(SOCKET_ERROR==retVal)  
  76.     {  
  77.         cout<<"recv failed:"<<WSAGetLastError()<<endl;  
  78.         closesocket(sServer);  
  79.         WSACleanup();  
  80.         return;  
  81.     }  
  82.   
  83.     cout<<buf<<endl;  
  84.   
  85.     //第六步:退出  
  86.     closesocket(sServer);        //半闭套接字  
  87.     closesocket(sClient);        //半闭套接字  
  88.     WSACleanup();                //释放套接字资源  
  89. }  

 

 客户端程序:

  1. /* 
  2. 程序名称:TCP通信示例程序客户端 
  3. 作者:天行健 
  4. 完成时间:2010-4-2  17:00 
  5. */  
  6. #include <iostream>  
  7. #include <WINSOCK2.h>  
  8. using namespace std;  
  9. #pragma comment(lib,"wsock32.lib")  
  10. #define BUF_SIZE 64  
  11.   
  12. void main()  
  13. {  
  14.     WSADATA wsd;  
  15.     SOCKET sServer;  
  16.     SOCKADDR_IN addrServer;  
  17.     int retVal;  
  18.     char buf[BUF_SIZE];  
  19.   
  20.     //第一步:创建套接字  
  21.     if(WSAStartup(MAKEWORD(2,2),&wsd)!=0)  
  22.     {  
  23.         cout<<"WSAStartup failed!"<<WSAGetLastError()<<endl;  
  24.         return;  
  25.     }  
  26.   
  27.     sServer=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);  
  28.     if(sServer==INVALID_SOCKET)  
  29.     {  
  30.         cout<<"socket failed:"<<WSAGetLastError()<<endl;  
  31.         WSACleanup();  
  32.         return;  
  33.     }  
  34.   
  35.     //第二步:连接服务器  
  36.     addrServer.sin_family=AF_INET;  
  37.     addrServer.sin_port=htons(4999);  
  38.     addrServer.sin_addr.s_addr=inet_addr("127.0.0.1");  
  39.   
  40.     retVal=connect(sServer,(struct sockaddr*)&addrServer,sizeof(addrServer));  
  41.     if(SOCKET_ERROR==retVal)  
  42.     {  
  43.         cout<<"connect failed:"<<WSAGetLastError()<<endl;  
  44.         closesocket(sServer);  
  45.         WSACleanup();  
  46.         return;  
  47.     }  
  48.   
  49.     //第三步:发送数据  
  50.     ZeroMemory(buf,BUF_SIZE);  
  51.     strcpy(buf,"MY TCP");  
  52.     retVal=send(sServer,buf,strlen(buf),0);  
  53.     if(SOCKET_ERROR==retVal)  
  54.     {  
  55.         cout<<"send failed:"<<WSAGetLastError()<<endl;  
  56.         closesocket(sServer);  
  57.         WSACleanup();  
  58.         return;  
  59.     }  
  60.   
  61.     //第四步:退出  
  62.     closesocket(sServer);  
  63.     WSACleanup();  
  64. }  

 

运行方法:

在DOS窗口中运行服务器端代码编译后生成的EXE程序,然后双击编译客户端代码后生成的EXE程序,即可在DOS窗口中看到 MY TCP 字符,即表示运行成功

 

 

//======================================================================================================================

备注::

1>客户端跟服务器建立SOCKET连接后,客户端要收服务器发过来的数据就要对建立的SOCKET连接进行监视-----用SELECT来判断有没数据过来,客户端不用LISTEN来监听;服务器端初始化后就用LISTEN来监听客户端有没要连接,有连接就ACCEPT然后再用SOCKET收发数据就可以了

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值