编写服务器端的基本步骤:
初始化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; }第一次写,有不对的地方,还求大佬们指正,不喜勿喷。