客户端连接不到服务器
客户端
#include<winsock2.h>
#include<ws2tcpip.h>
#include<stdio.h>
#pragma comment(lib,"Ws2_32.lib")
#define DEFAULT_PORT "2701590"
#define DEFAULT_BUFLEN 512
int main(int argc,char**argv)
{
//初始化winsock
WSADATA wsadata;
int text;
text = WSAStartup(MAKEWORD(2, 2), &wsadata);
if (text != 0)
{
printf("wsastartup失败%d\n", text);
return 1;
}
//创建套接字
addrinfo* result = NULL, * prt = NULL, hints;//保存主机地址信息
ZeroMemory(&hints, sizeof(hints));
text = getaddrinfo(argv[1], DEFAULT_PORT, &hints, &result);//床底服务器名称的IP地址
if (text != 0)
{
printf("getaddrinfo失败%d\n", text);
WSACleanup();//关闭DLL
return 1;
}
SOCKET Connectsocaet = INVALID_SOCKET;
prt = result;
//创建用于连接到服务器的 SOCKET
Connectsocaet = socket(prt->ai_family, prt->ai_socktype, prt->ai_protocol);
if (Connectsocaet == INVALID_SOCKET)
{
printf("socket错误%ld\n", WSAGetLastError());
freeaddrinfo(result);
WSACleanup();
return 1;
}
text = connect(Connectsocaet, prt->ai_addr, (int)prt->ai_addrlen);
if (text == SOCKET_ERROR)
{
closesocket(Connectsocaet);
Connectsocaet = INVALID_SOCKET;
}
//如果失败打印错误信息
freeaddrinfo(result);
if (Connectsocaet == INVALID_SOCKET)
{
printf("无法连接到服务器\n");
WSACleanup();
return 1;
}
//在客户端上发送和接受数据
int recvbuflen = DEFAULT_BUFLEN;
const char* sendbuf = "this is a text";
char recvbuf[DEFAULT_BUFLEN];
//int iResult;
//发送初始缓冲区
text = send(Connectsocaet, sendbuf, (int)strlen(sendbuf), 0);
if (text == SOCKET_ERROR)
{
printf("send失败%d\n", WSAGetLastError());
closesocket(Connectsocaet);
WSACleanup();
return 1;
}
do
{
text = recv(Connectsocaet, recvbuf, recvbuflen, 0);//接收数据
if (text > 0)
printf("接受的字节数:%d\n", text);
else if (text == 0)
printf("连接已关闭\n");
else
printf("recv失败%d\n", WSAGetLastError());
} while (text > 0);
//断开客户端的链接
text = shutdown(Connectsocaet, SD_SEND);
if (text == SOCKET_ERROR)
{
printf("shutdown失败%D\n", WSAGetLastError());
closesocket(Connectsocaet);
WSACleanup();
return 1;
}
//关闭套接字
closesocket(Connectsocaet);
WSACleanup();
return 0;
}
服务器端
#include<winsock2.h>
#include<ws2tcpip.h>
#include<stdio.h>
#pragma comment(lib,"Ws2_32.lib")
#define DEFAULT_PORT "2701590"
#define DEFAULT_BUFLEN 512
int main()
{
//初始化winsock
WSADATA wsadata;
int text;
text = WSAStartup(MAKEWORD(2, 2), &wsadata);
if (text != 0)
{
printf("失败%d\n", text);
return 1;
}
//创建套接字
addrinfo *result = NULL, * ptr = NULL, hints;
ZeroMemory(&hints, sizeof(hints));
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;
hints.ai_flags = AI_PASSIVE;
//解析服务器要使用的本地地址和端口
text = getaddrinfo(NULL, DEFAULT_PORT, &hints, &result);
if (text != 0)
{
printf("getaddrinfo失败%d\n", text);
WSACleanup();
return 1;
}
//创建SOCKET对象,以侦听客户端连接
SOCKET ListenSocket = INVALID_SOCKET;
ListenSocket = socket(result->ai_family, result->ai_socktype, result->ai_protocol);
if (ListenSocket == INVALID_SOCKET)
{
printf("socket失败%ld\n", WSAGetLastError());
freeaddrinfo(result);
WSACleanup();
return 1;
}
// 设置 TCP 侦听套接字
text = bind(ListenSocket, result->ai_addr, (int)result->ai_addrlen);
if (text == SOCKET_ERROR)
{
printf("bind失败%d\n", WSAGetLastError());
freeaddrinfo(result);
closesocket(ListenSocket);
WSACleanup();
return 1;
}
freeaddrinfo(result);
//将套接字置于侦听传入连接的状态
if (listen(ListenSocket, SOMAXCONN) == SOCKET_ERROR)
{
printf("listen错误%ld\n", WSAGetLastError());
closesocket(ListenSocket);
WSACleanup();
return 1;
}
//接受套接字上的链接
SOCKET ClientSocket;
ClientSocket = INVALID_SOCKET;
//接受客户端套接字
ClientSocket = accept(ListenSocket, NULL, NULL);
if (ClientSocket == INVALID_SOCKET)
{
printf("accept失败%d\n", WSAGetLastError());
closesocket(ListenSocket);
WSACleanup();
return 1;
}
//在套接字上接收和发送数据
char recvbuf[DEFAULT_BUFLEN];
int iResult, iSendResult;
int recvbuflen = DEFAULT_BUFLEN;
//接收,知道客户端关闭连接
do
{
iResult = recv(ClientSocket, recvbuf, recvbuflen, 0);
if (iResult > 0)
{
printf("接受到的字节数:%d\n", iResult);
//将蝗虫去回显给发送方
iSendResult = send(ClientSocket, recvbuf, recvbuflen, 0);
if (iSendResult == SOCKET_ERROR)
{
printf("send 失败: %d\n", WSAGetLastError());
closesocket(ClientSocket);
WSACleanup();
return 1;
}
printf("发送的字节数%d\n", iSendResult);
}
else if (iResult == 0)
printf("链接正在关闭...\n");
else
{
printf("连接失败%d\n", WSAGetLastError());
closesocket(ClientSocket);
WSACleanup();
return 1;
}
} while (iResult > 0);
//断开服务器连接
//关闭连接的发送部分
iResult = shutdown(ClientSocket, SD_SEND);
if (iResult == SOCKET_ERROR) {
printf("shutdown失败: %d\n", WSAGetLastError());
closesocket(ClientSocket);
WSACleanup();
return 1;
}
closesocket(ClientSocket);
WSACleanup();
return 0;
}
服务器端可以运行,但客户端connect连接不上 报错“无法连接到服务器”