服务端
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <WinSock2.h>
#include <Windows.h>
#pragma comment(lib, "ws2_32.lib")
using namespace std;
#define NUM 1024
int ct;
SOCKET clientSocket[NUM];
void tongxin(int index);
int main() {
ct = 0;
cout << "服务端" << endl;
//1)确定网络协议版本
WSADATA wsaData;
WSAStartup(MAKEWORD(2, 2), &wsaData);
if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2) {
cout << "确定网络协议版本失败:" << GetLastError() << endl;
return -1;
}
cout << "确定网络协议版本成功!" << endl;
//2)创建Socket
SOCKET serverSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (serverSocket == SOCKET_ERROR) {
cout << "创建socket失败:" << GetLastError() << endl;
//9)清理协议版本信息
WSACleanup();
return -1;
}
cout << "创建socket成功!" << endl;
//3)确定服务器协议地址簇
SOCKADDR_IN addr = { 0 };
addr.sin_family = AF_INET;
//设置IP地址啦!
addr.sin_addr.S_un.S_addr = inet_addr("10.0.0.200");
addr.sin_port = htons(9200);
//4)绑定
int r = bind(serverSocket, (sockaddr*)&addr, sizeof(addr));
if (r == -1) {
cout << "绑定失败:" << GetLastError() << endl;
//8)关闭socket
closesocket(serverSocket);
//9)清理协议版本信息
WSACleanup();
return -1;
}
cout << "绑定成功" << endl;
//5)监听
r = listen(serverSocket, 10);
if (r == -1) {
cout << "监听失败:" << GetLastError() << endl;
//8)关闭socket
closesocket(serverSocket);
//9)清理协议版本信息
WSACleanup();
return -1;
}
cout << "监听成功" << endl;
//6)接受客户端连接
for (int i = 0; i < NUM; i++) {
clientSocket[i] = accept(serverSocket, (sockaddr*)NULL, NULL);
if (r == -1) {
cout << "服务器崩溃:" << GetLastError() << endl;
//8)关闭socket
closesocket(serverSocket);
//9)清理协议版本信息
WSACleanup();
return -1;
}
cout << "有客户端" << i << "连接服务器啦!" << endl;
ct++;
CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)tongxin, (LPVOID)i, NULL, NULL);
}
//8)关闭socket
closesocket(serverSocket);
//9)清理协议版本信息
WSACleanup();
return 0;
}
void tongxin(int index) {
//7)通信
//如何解决并发执行的问题?等待客户端连接的同时,也要能通信。
//异步IO,IO多路复用,多线程
int r;
char buff[56];
char temp[80];
while (1) {
Sleep(500);
r = recv(clientSocket[index], buff, 55, NULL);
if (r > 0) {
buff[r] = '\0';
cout << "客户端[" << index << "]说:" << buff << endl;
memset(temp, 0, 80);
sprintf(temp, "客户端%d说:%s", index, buff);
//同时发送给所有连上服务器的客户端
for (int i = 0; i < ct; i++) {
send(clientSocket[i], temp, strlen(temp), NULL);
}
}
}
}
客户端
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include <iostream>
#include <string>
#include <sstream>
#include <WinSock2.h>
#include <graphics.h>
#pragma comment(lib, "ws2_32.lib")
using namespace std;
SOCKET serverSocket;
void mySend() {
//7)通信
char buff[56];
//循环发送数据
while (1) {
cin.getline(buff, sizeof(buff));
send(serverSocket, buff, strlen(buff), NULL);
}
}
int main() {
cout << "客户端" << endl;
initgraph(500, 500, SHOWCONSOLE);
int len = 0;//显示当前位置
//1)确定网络协议版本
WSADATA wsaData;
WSAStartup(MAKEWORD(2, 2), &wsaData);
if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2) {
cout << "确定网络协议版本失败:" << GetLastError() << endl;
return -1;
}
cout << "确定网络协议版本成功!" << endl;
//2)创建Socket
serverSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (serverSocket == SOCKET_ERROR) {
cout << "创建socket失败:" << GetLastError() << endl;
//9)清理协议版本信息
WSACleanup();
return -1;
}
cout << "创建socket成功!" << endl;
//3)确定服务器协议地址簇
SOCKADDR_IN addr = { 0 };
addr.sin_family = AF_INET;
//设置IP地址啦!
addr.sin_addr.S_un.S_addr = inet_addr("123.182.43.129");
addr.sin_port = htons(9200);
//4)连接
int r = connect(serverSocket, (sockaddr*)&addr, sizeof(addr));
if (r == -1) {
cout << "服务器连接失败:" << GetLastError() << endl;
//8)关闭socket
closesocket(serverSocket);
//9)清理协议版本信息
WSACleanup();
return -1;
}
cout << "服务器连接成功!" << endl;
//7)通信
CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)mySend, NULL, NULL, NULL);
char temp[60];
while (1) {
//接受服务器发来的数据并显示
r = recv(serverSocket, temp, 59, NULL);
if (len % 25 == 0) {
cleardevice();
len = 0;
}
if (r > 0) {
temp[r] = '\0';
outtextxy(1, len * 20, temp);
len++;
}
}
//8)关闭socket
closesocket(serverSocket);
//9)清理协议版本信息
WSACleanup();
return 0;
}

网络编程九大步骤
【服务端】1)确定网络协议版本,2)创建Socket,3)确定服务器协议地址簇,4)绑定,5)监听,6)接受客户端连接,7)通信,8)关闭socket,9)清理协议版本信息
【客户端】1)确定网络协议版本,2)创建Socket,3)确定服务器协议地址簇,4)连接服务器,5)通信,6)关闭socket,7)清理协议版本信息
© 版权声明
若无特殊说明,文章版权归作者所有,请勿转载至任何平台。
THE END
暂无评论内容