编写服务器端的基本步骤:
- 初始化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;
}
第一次写,有不对的地方,还求大佬们指正,不喜勿喷。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)