Socket通信学习(自用笔记)
一.windows下的socket通信实践
1.实现要求:在windows下分别创建Socket服务端和客户端;客户端给服务器发送数据,服务器有反馈接收信息;服务器断线重连;客户端具有断线提醒
2.参考资料:socket是什么?套接字是什么? (biancheng.net);(5条消息) windows下的socket编程(C++代码实现)_其实我是C先生--的博客-CSDN博客
3.实现效果
4.代码
server.cpp
#include<WinSock2.h>
#include<iostream>
#include<string>
using namespace std;
#pragma comment(lib,"ws2_32.lib")
int main(int arg, char* argv[])
{
cout << "Socket服务端" << endl;
//初始化DLL
WORD sockVersion = MAKEWORD(2, 2);
WSADATA wsdata;
if (WSAStartup(sockVersion, &wsdata) != 0)
{
return 1;
}
//创建套接字
SOCKET serversocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
//绑定套接字
sockaddr_in server_addr;
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(8888);
server_addr.sin_addr.S_un.S_addr = INADDR_ANY;
bind(serversocket, (sockaddr*)&server_addr, sizeof(server_addr));
//建立通信套接字标识符
SOCKET clientsocket;
sockaddr_in client_addr;
int len = sizeof(client_addr);
while (true)
{
if (listen(serversocket, 5) == SOCKET_ERROR)
{
cout << "Bind Error" << endl;
break;
}
//建立连接
clientsocket = accept(serversocket, (sockaddr*)&client_addr, &len);
if (clientsocket != INVALID_SOCKET)
{
cout << "连接到:" << inet_ntoa(client_addr.sin_addr) << endl;
}
//进入接收消息循环
char msg[100];//接收消息缓冲区
string check; //设置反馈消息
check = "a";
const char *ch;
ch = check.c_str();
while (true)
{
int num = recv(clientsocket, msg, 100, 0);
if (num > 0)
{
msg[num] = '\0';
cout << "客户端:" << msg << endl;
send(clientsocket, ch, strlen(ch), 0);
}
else
{
break;
}
}
}
closesocket(clientsocket);
closesocket(serversocket);
WSACleanup();
return 0;
}
client.cpp
#include<WinSock2.h>
#include<iostream>
#include<string>
using namespace std;
#pragma comment(lib,"ws2_32.lib")
int main()
{
cout << "Socket客户端" << endl;
//初始化DLL
WORD sockVersion = MAKEWORD(2, 2);
WSADATA data;
if (WSAStartup(sockVersion, &data) != 0)
{
return 1;
}
//创建客户端socket
SOCKET clientsocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
sockaddr_in client_addr;
client_addr.sin_family = AF_INET;
client_addr.sin_port = htons(8888);
client_addr.sin_addr.S_un.S_addr = inet_addr("10.40.129.40");//本机的ip地址
//建立连接
//connect(clientsocket, (sockaddr*)&client_addr, sizeof(client_addr));
if (connect(clientsocket, (sockaddr*)&client_addr, sizeof(client_addr)) == SOCKET_ERROR)
{
cout << "服务器未开启" << endl;
cout << "请先开启服务器" << endl;
system("pause");
return 1;
}
char check[50];
//进入循环发送
while (true)
{
string text;
const char *msg;
cout << "请输入:" << endl;
cin >> text;
msg = text.c_str();
send(clientsocket, msg, strlen(msg),0 );
int num = recv(clientsocket, check, 100, 0);
if (num ==-1)
{
cout << "连接断开" << endl;
system("pause");
return 1;
}
}
closesocket(clientsocket);
WSACleanup();
return 0;
}
5.问题总结:在VS2015中会报错一些代码存在安全问题
参考网上的解决办法,
1.吧报错的函数替用新的函数替用,注意增加对应的头文件,并且对于 inet_pton()、InetPton()函数的用法,还没有继续深究
2.将vs中的检查功能关掉(项目属性中,SDL检查改为否)
6.接下来,在Linux中尝试,并且实现两个系统中的Socket通信.......