这个服务器程序连接客户端后就一直显示接受失败,这是为什么?
服务器代码
#include "windows.h"
#include "iostream"
#include "process.h"
#include "iostream"
#include <string>
#pragma comment(lib, "WS2_32.lib")
SOCKADDR_IN ServerAdd;//服务器地址信息结构
SOCKADDR_IN ClientAdd;//客户端地址信息结构
SOCKET ClientServer;
void Receive(void* Param)
{
while (1)
{
SOCKET revSocketClient = *(SOCKET*)(Param);
char RecBuf[2048] = {};
if (recv(revSocketClient, RecBuf, 2048, 0) == SOCKET_ERROR)
{
printf("接收数据失败!\n");
}
else
{
printf("客户端:%s\n", RecBuf);
}
}
}
void Send(void* param)
{
while (1)
{
//客户端发送数据给服务器
SOCKET clientSocket = *(SOCKET*)(param);
char RecBuf[2048] = {}; //发送缓冲区
std::cin.getline(RecBuf, 2048);
if (send(clientSocket, RecBuf, strlen(RecBuf), 0) == SOCKET_ERROR)
{
printf("发送数据失败!\n");
}
else
{
printf("自己说:%s\n", RecBuf);
}
}
}
void Load()//加载模块
{
printf("服务器\n");
printf("Loading...\n");
printf("消息:\n");
/*------------------------- 初始化套接字库 --------------------------*/
WSADATA wsaData; //WSA的数据
WORD VersionRequested = MAKEWORD(2, 2); //请求的版本
if (WSAStartup(VersionRequested, &wsaData) != 0) //判断加载套接字节是否失败
{
printf("初始化套接字节失败!\n");
exit(1); //结束程序
}
else
{
printf("初始化套接字节成功!\n");
}
if ((ClientServer = socket(AF_INET, SOCK_STREAM, 0)) == SOCKET_ERROR)
{
printf("套接字创建失败!\n");
exit(1);
}
else
{
printf("套接字创建成功!\n");
}
if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2) //判断请求加载的版本号是否符合要求
{
WSACleanup(); //不符合 关闭套接字库
exit(1); //关闭程序
}
/*-------------------------- 设置连接地址 --------------------------*/
ServerAdd.sin_family = AF_INET; //地址族
ServerAdd.sin_addr.S_un.S_addr = htonl(INADDR_ANY); //主机地址
ServerAdd.sin_port = htons(5000); //端口号
/*--------------------------- 创建套接字 ---------------------------*/
ClientServer = socket(AF_INET, SOCK_STREAM, NULL); //AF_INET 表示指定的地址族 SOCK_STREAM 表示流式套接字TCP
/*---------------------- 绑定套接字到本地接口 ----------------------*/
if (bind(ClientServer, (SOCKADDR*)&ServerAdd, sizeof(SOCKADDR)) == SOCKET_ERROR)
{
printf("绑定失败!\n");
exit(1);
}
else
{
printf("绑定成功!\n");
}
/*--------------------- 设置套接字为监听状态 -----------------------*/
if (listen(ClientServer, SOMAXCONN) == SOCKET_ERROR)
{
printf("坚听失败!");
exit(1);
}
else
{
printf("监听功能成功开启!正在监听:\n");
}
/*---------------------------- 接受连接 ----------------------------*/
int AddLen = sizeof(SOCKADDR);
if (accept(ClientServer, (SOCKADDR*)&ClientAdd, &AddLen)==SOCKET_ERROR)
{
printf("接受连接失败!");
exit(1);
}
else
{
printf("与客户端连接成功!按任意键进入聊天服务");
}
}
void Chat()
{
_beginthread(&Receive, 0, &ClientServer);
_beginthread(&Send, 0, &ClientServer);
while (1);
}
int main()
{
Load();
Chat();
WSACleanup();
}
这是客户端代码
#include "windows.h"
#include "iostream"
#include "process.h"
#include <string>
using namespace std;
#pragma comment(lib, "ws2_32.lib")
void Receive(void* param)
{
while (1)
{
//客户端接受来自服务器的数据
SOCKET clientSocket = *(SOCKET*)(param);
char RecBuf[2048] = {}; //接收缓冲区
if (recv(clientSocket, RecBuf, 2048, 0) == SOCKET_ERROR)
{
cout << "数据接受失败" << endl;
}
else
{
printf("服务器说:%s\n", RecBuf);
}
}
}
void Send(void* param)
{
while (1)
{
//客户端发送数据给服务器
SOCKET clientSocket = *(SOCKET*)(param);
char RecBuf[2048] = {}; //发送缓冲区
cin.getline(RecBuf, 2048);
if (send(clientSocket, RecBuf, strlen(RecBuf), 0) == SOCKET_ERROR)
{
cout << "发送消息失败!";
}
else
{
printf("自己说:%s\n", RecBuf);
}
}
}
int main()
{
printf("客户端\n");
printf("Loading...\n");
printf("消息:\n");
WSADATA wsa;
if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0)
{
cout << "套接字初始化失败!" << endl;
}
else
{
printf("初始化套接字节成功!\n");
}
SOCKET clientSocket;
if ((clientSocket = socket(AF_INET, SOCK_STREAM, 0)) == SOCKET_ERROR)
{
cout << "套接字创建失败!" << endl;
}
struct sockaddr_in SeverAddress; //服务器地址 也就是即将要连接的目标地址
memset(&SeverAddress, 0, sizeof(sockaddr_in));
SeverAddress.sin_family = AF_INET;
SeverAddress.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); //127.0.0.1表示本机ip地址
SeverAddress.sin_port = htons(5000);//设定端口号
//开始连接
if (connect(clientSocket, (sockaddr*)&SeverAddress, sizeof(SeverAddress)) == SOCKET_ERROR)
{
cout << "客户端:和服务器连接失败!" << endl;
return 0;
}
else
cout << "与服务器连接成功!" << endl;
//创建两个子线程
_beginthread(Receive, 0, &clientSocket);
_beginthread(Send, 0, &clientSocket);
Sleep(INFINITE); //这里采用另外一种技术避免主线程执行完退出——使其无限期休眠
// 关闭socket
if (clientSocket != INVALID_SOCKET) {
closesocket(clientSocket);
clientSocket = INVALID_SOCKET;
}
while(1);
// 终止
WSACleanup();
cout << "客户端退出!" << endl;
return 0;
}
看下哪出了问题,谢谢
不知道你这个问题是否已经解决, 如果还没有解决的话:代码实现:
//循环单链表依次输出最小值并删除节点
#include<iostream>
using namespace std;
typedef struct lnode{
int data;
struct lnode *next;
}lnode,*linklist;
int a[5]={3,5,2,7,1};
int n=5;
void buildlist(linklist &L)
{
L=(linklist)malloc(sizeof(lnode));
lnode *s,*r=L;
for(int i=0;i<n;i++)
{
s=(lnode *)malloc(sizeof(lnode));
s->data=a[i];
r->next=s;
r=r->next;
}
r->next=L;
}
void disp(linklist L)
{
lnode *s=L->next;
while(s!=L)
{
cout<<s->data<<" ";
s=s->next;
}
cout<<endl;
}
void deletelist(linklist &L)
{
lnode *p,*r,*min,*mp;
while(L->next!=L)
{
p=L->next,r=L,min=p,mp=r;
while(p!=L)
{
if(p->data<min->data)
{
min=p;
mp=r;
}
else
{
r=p;
p=p->next;
}
}
cout<<min->data<<" ";
mp->next=min->next;
free(min);
}
free(L);
}
int main()
{
linklist L;
buildlist(L);
cout<<"L:"<<endl;
disp(L);
deletelist(L);
return 0;
}