C++ socket编程 实现服务端与客户端的通讯





    服务器端程序:


    [cpp]  view plain copy
    1. // Server.cpp : Defines the entry point for the console application.  
    2. //  
    3.   
    4. #include "winsock2.h"  
    5. #pragma comment(lib, "ws2_32.lib")  
    6. #include <iostream>  
    7. using namespace std;  
    8. int main(int argc, char* argv[])  
    9. {  
    10.     const int BUF_SIZE = 64;  
    11.     WSADATA         wsd;            //WSADATA变量  
    12.     SOCKET          sServer;        //服务器套接字  
    13.     SOCKET          sClient;        //客户端套接字  
    14.     SOCKADDR_IN     addrServ;;      //服务器地址  
    15.     char            buf[BUF_SIZE];  //接收数据缓冲区  
    16.     char            sendBuf[BUF_SIZE];//返回给客户端得数据  
    17.     int             retVal;         //返回值  
    18.     //初始化套结字动态库  
    19.     if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)  
    20.     {  
    21.         cout << "WSAStartup failed!" << endl;  
    22.         return 1;  
    23.     }  
    24.       
    25.     //创建套接字  
    26.     sServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);      
    27.     if(INVALID_SOCKET == sServer)  
    28.     {  
    29.         cout << "socket failed!" << endl;  
    30.         WSACleanup();//释放套接字资源;  
    31.         return  -1;  
    32.     }  
    33.       
    34.     //服务器套接字地址   
    35.     addrServ.sin_family = AF_INET;  
    36.     addrServ.sin_port = htons(4999);  
    37.     addrServ.sin_addr.s_addr = INADDR_ANY;        
    38.     //绑定套接字  
    39.     retVal = bind(sServer, (LPSOCKADDR)&addrServ, sizeof(SOCKADDR_IN));  
    40.     if(SOCKET_ERROR == retVal)  
    41.     {     
    42.         cout << "bind failed!" << endl;  
    43.         closesocket(sServer);   //关闭套接字  
    44.         WSACleanup();           //释放套接字资源;  
    45.         return -1;  
    46.     }  
    47.       
    48.     //开始监听   
    49.     retVal = listen(sServer, 1);  
    50.     if(SOCKET_ERROR == retVal)  
    51.     {  
    52.         cout << "listen failed!" << endl;         
    53.         closesocket(sServer);   //关闭套接字  
    54.         WSACleanup();           //释放套接字资源;  
    55.         return -1;  
    56.     }  
    57.       
    58.     //接受客户端请求  
    59.     sockaddr_in addrClient;  
    60.     int addrClientlen = sizeof(addrClient);  
    61.     sClient = accept(sServer,(sockaddr FAR*)&addrClient, &addrClientlen);  
    62.     if(INVALID_SOCKET == sClient)  
    63.     {  
    64.         cout << "accept failed!" << endl;         
    65.         closesocket(sServer);   //关闭套接字  
    66.         WSACleanup();           //释放套接字资源;  
    67.         return -1;  
    68.     }  
    69.       
    70.     while(true)  
    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!" << endl;       
    78.             closesocket(sServer);   //关闭套接字  
    79.             closesocket(sClient);   //关闭套接字       
    80.             WSACleanup();           //释放套接字资源;  
    81.             return -1;  
    82.         }  
    83.         if(buf[0] == '0')  
    84.             break;  
    85.         cout << "客户端发送的数据: " << buf <<endl;  
    86.           
    87.         cout << "向客户端发送数据: " ;  
    88.         cin >> sendBuf;  
    89.           
    90.         send(sClient, sendBuf, strlen(sendBuf), 0);  
    91.     }  
    92.       
    93.     //退出  
    94.     closesocket(sServer);   //关闭套接字  
    95.     closesocket(sClient);   //关闭套接字  
    96.     WSACleanup();           //释放套接字资源;  
    97.       
    98.     return 0;  
    99. }  


    客户端程序:


    [cpp]  view plain copy
    1. #include "winsock2.h"  
    2. #include <iostream>  
    3. #pragma comment(lib, "ws2_32.lib")  
    4.   
    5. using namespace std;  
    6. BOOL RecvLine(SOCKET s, char* buf); //读取一行数据  
    7.   
    8. int main(int argc, char* argv[])  
    9. {  
    10. const int BUF_SIZE = 64;  
    11.   
    12. WSADATA wsd; //WSADATA变量  
    13. SOCKET sHost; //服务器套接字  
    14. SOCKADDR_IN servAddr; //服务器地址  
    15. char buf[BUF_SIZE]; //接收数据缓冲区  
    16. char bufRecv[BUF_SIZE];  
    17. int retVal; //返回值  
    18. //初始化套结字动态库  
    19. if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)  
    20. {  
    21. cout << "WSAStartup failed!" << endl;  
    22. return -1;  
    23. }  
    24. //创建套接字  
    25. sHost = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);  
    26. if(INVALID_SOCKET == sHost)  
    27. {  
    28. cout << "socket failed!" << endl;  
    29. WSACleanup();//释放套接字资源  
    30. return  -1;  
    31. }  
    32.   
    33. //设置服务器地址  
    34. servAddr.sin_family =AF_INET;  
    35. servAddr.sin_addr.s_addr = inet_addr("127.0.0.1");  
    36. servAddr.sin_port = htons((short)4999);  
    37. int nServAddlen  = sizeof(servAddr);  
    38.   
    39. //连接服务器  
    40. retVal=connect(sHost,(LPSOCKADDR)&servAddr, sizeof(servAddr));  
    41. if(SOCKET_ERROR == retVal)  
    42. {  
    43. cout << "connect failed!" << endl;  
    44. closesocket(sHost); //关闭套接字  
    45. WSACleanup(); //释放套接字资源  
    46. return -1;  
    47. }  
    48. while(true)  
    49. {  
    50. //向服务器发送数据  
    51. ZeroMemory(buf, BUF_SIZE);  
    52. cout << " 向服务器发送数据:  ";  
    53. cin >> buf;  
    54. retVal = send(sHost, buf, strlen(buf), 0);  
    55. if (SOCKET_ERROR == retVal)  
    56. {  
    57. cout << "send failed!" << endl;  
    58. closesocket(sHost); //关闭套接字  
    59. WSACleanup(); //释放套接字资源  
    60. return -1;  
    61. }  
    62. //RecvLine(sHost, bufRecv);  
    63. ZeroMemory(bufRecv, BUF_SIZE);  
    64. recv(sHost, bufRecv,BUF_SIZE , 0); // 接收服务器端的数据, 只接收5个字符  
    65. cout << endl <<"从服务器接收数据:"<< bufRecv;  
    66. cout<<"\n";  
    67. }  
    68. //退出  
    69. closesocket(sHost); //关闭套接字  
    70. WSACleanup(); //释放套接字资源  
    71. return 0;  
    72. }  
    • 0
      点赞
    • 8
      收藏
      觉得还不错? 一键收藏
    • 2
      评论

    “相关推荐”对你有帮助么?

    • 非常没帮助
    • 没帮助
    • 一般
    • 有帮助
    • 非常有帮助
    提交
    评论 2
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

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

    抵扣说明:

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

    余额充值