C++基于socket的单线程服务器客户端聊天程序(TCP)

xiaoxiao2021-02-28  32

编写服务器端的基本步骤:

初始化winsock;创建socket;绑定socket;在socket上对客户端进行监听;接受客户端的连接;收发消息;断开连接; 话不多说,直接上码 //服务器端 #include <iostream> #include "winsock2.h" #include "string.h" using namespace std; #pragma comment(lib,"ws2_32.lib") int main() {     //初始化socket     WSADATA wsaData;//改结构体包含winsock实现的信息     if (WSAStartup(MAKEWORD(2, 2), &wsaData)  !=  0)     {         cout<<"WSAStratup error!"<<endl;         exit(1);     }     //建立socket     SOCKET servers = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);     if(servers == INVALID_SOCKET)     {         cout<<"Failde to create server socet!Error code:"<<WSAGetLastError()<<endl;         WSACleanup();         exit(1);     }     //绑定socket     SOCKADDR_IN sin;     sin.sin_family = AF_INET;     sin.sin_port = htons(8888);     sin.sin_addr.S_un.S_addr = INADDR_ANY;     if (bind(servers, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR)     {         cout<<"Failed to bind server socket!Error code:"<<WSAGetLastError()<<endl;         WSACleanup();         exit(1);     }     //监听socket     if (listen(servers, 10) == SOCKET_ERROR)//消息等待队列为10     {         cout<<"Failed to listen server socket!Error code:"<<WSAGetLastError()<<endl;         WSACleanup();         exit(1);     }     cout<<"Server started successfully..."<<endl;     //接收客户端请求     SOCKET sclient;     SOCKADDR_IN clientAdd;     int cAddlen = sizeof(clientAdd);     char buf[255];//缓冲区  大小为255     char sendbuf[255];//发送缓冲区     sclient = accept(servers, (LPSOCKADDR)&clientAdd, &cAddlen);     if (sclient == SOCKET_ERROR)     {         cout<<"Failde to accept client!Error code:"<<WSAGetLastError()<<endl;         WSACleanup();         exit(1);     }     printf("接收到一个连接:%s\n", inet_ntoa(clientAdd.sin_addr));     //接收和发送数据     while (true)     {         memset(buf,0,sizeof(buf));         memset(sendbuf,0,sizeof(sendbuf));         int res = recv(sclient, buf, sizeof(buf), 0);         if (res > 0)         {             cout<<"client:"<<buf<<endl;         }         else if(res == 0)         {             cout<<"Connect close..."<<endl;             break;         }         else         {             cout<<"Failed to receive message from client!Error code:"<<WSAGetLastError()<<endl;             closesocket(sclient);             return 0;         }         cout<<"server:";         gets(sendbuf);         if (strcmp(sendbuf, "bye") == 0)         {             cout<<"Client requests to close the connection..."<<endl;             break;         }         res = send(sclient, sendbuf, strlen(sendbuf), 0);         if(res == SOCKET_ERROR)         {             cout<<"Failed to send message to client!Error code:"<<WSAGetLastError()<<endl;             closesocket(sclient);             return 0;         }     }     //关闭socket连接     closesocket(sclient);     closesocket(servers);     cout<<"socket close..."<<endl;     WSACleanup();     return 0; }

编写客户端的基本步骤:

初始化winsock;创建socket;连接服务器;收发消息;断开连接; //客户端 #include <iostream> #include "winsock2.h" #include "string.h" using namespace std; #pragma comment(lib,"ws2_32.lib") int main() { //初始化winsock WSADATA wsaData; if (WSAStartup(MAKEWORD(2,2),&wsaData) != 0) { cout<<"WSAStratup error!"<<endl; exit(1); } //创建socket SOCKET client = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if(client == INVALID_SOCKET) { cout<<"Failde to create client socet!Error code:"<<WSAGetLastError()<<endl; WSACleanup(); exit(1); } //连接服务器 SOCKADDR_IN sin; sin.sin_family = AF_INET; sin.sin_port = htons(8888);//服务器端口 sin.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//服务器IP if (connect(client, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR) { cout<<"Failde to connect with server!Error code:"<<WSAGetLastError()<<endl; WSACleanup(); exit(1); } char sendbuf[255]; char recbuf[255]; //收发消息 while (true) { memset(sendbuf,0,sizeof(sendbuf)); memset(recbuf,0,sizeof(recbuf)); cout<<"client:"; gets(sendbuf); int res = send(client, sendbuf, strlen(sendbuf),0); if (strcmp(sendbuf, "bye") == 0) break; if(res == SOCKET_ERROR) { cout<<"Failed to send message!Error code: "<<WSAGetLastError()<<endl; closesocket(client); WSACleanup(); exit(1); } res = recv(client, recbuf, 255,0); if (res > 0) { cout<<"server:"<<recbuf<<endl; } else { cout<<"Failed to receive message from server!Error code:"<<WSAGetLastError()<<endl; closesocket(client); return 0; } } //关闭socket closesocket(client); WSACleanup(); cout<<"socket close..."<<endl;     return 0; }第一次写,有不对的地方,还求大佬们指正,不喜勿喷。

转载请注明原文地址: https://www.6miu.com/read-2624880.html

最新回复(0)