话不多说,先传代码
服务器:
#include <Winsock2.h>
#include <stdio.h>
#include <windows.h>
#include <iostream>
#include <thread>
//using namespace std;
#pragma comment(lib,"ws2_32.lib")
void main()
{
void foo(SOCKET sClient);
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVer`sionRequested = MA`KEWORD(1, 1);
err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0) {
return;
}
if (LOBYTE(wsaData.wVersion) != 1 ||
HIBYTE(wsaData.wVersion) != 1) {
WSACleanup();
return;
}
SOCKET sockSrv = socket(AF_INET, SOCK_STREAM, 0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(6000);
bind(sockSrv, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));
listen(sockSrv, 5);
SOCKADDR_IN addrClient;
int len = sizeof(SOCKADDR);
char revData[255];
char sendToData[255];
printf("等待连接...\n");
SOCKET sClient = accept(sockSrv, (SOCKADDR *)&addrClient, &len);
printf("接受到一个连接:%s \r\n", inet_ntoa(addrClient.sin_addr));
std::thread t1(foo, sClient);
t1.detach();
while (1)
{
//发送数据
memset(sendToData, 0, sizeof(sendToData));
std::cin >> sendToData;
send(sClient, sendToData, strlen(sendToData), 0);
}
closesocket(sClient);
}
void foo(SOCKET sClient){
char revData[255];
while (1)
{
//接收数据
int ret = recv(sClient, revData, 255, 0);
if (ret > 0)
{
revData[ret] = 0x00;
printf("接收消息:%s\n", revData);
}
}
}
客户端
#include <Winsock2.h>
#include <stdio.h>
#include <iostream>
#include <thread>
//using namespace std;
#pragma comment(lib,"ws2_32.lib")
void main(int argc, char* argv[])
{
void foo(SOCKET sclient);
WORD sockVersion = MAKEWORD(2, 2);
WSADATA data;
if (WSAStartup(sockVersion, &data) != 0)
{
return;
}
SOCKET sclient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sclient == INVALID_SOCKET)
{
printf("invalid socket !");
return;
}
sockaddr_in serAddr;
serAddr.sin_family = AF_INET;
serAddr.sin_port = htons(6000);
serAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
//请求服务器的地址
connect(sclient, (sockaddr *)&serAddr, sizeof(serAddr));
char recData[255];
char sendToData[255];
char* sendData = "你好,TCP服务端,我是客户端!\n";
send(sclient, sendData, strlen(sendData), 0);
std::thread t1(foo, sclient);
t1.detach();
while (1)
{
//发送数据
memset(sendToData, 0, sizeof(sendToData));
std::cin >> sendToData;
send(sclient, sendToData, strlen(sendToData), 0);
}
closesocket(sclient);
WSACleanup();
return;
}
void foo(SOCKET sclient){
char recData[255];
//接收消息
while (1)
{
int ret = recv(sclient, recData, 255, 0);
if (ret > 0)
{
recData[ret] = 0x00;
printf("接收:%s\n", recData);
}
}
}
遇到的最主要的问题就是c++11中的thread会影响到socket,形成非阻塞,这个需要去掉std;这样就能完美解决。
亲测可用,本人也是新手,以后想到什么写什么吧。