关于c++中socket通信的问题望大神来给解决下
#include<iostream>#include<Windows.h>#pragmacomment(lib,"ws2_32.lib")usingnamespacest...
#include <iostream>
#include <Windows.h>
#pragma comment(lib,"ws2_32.lib")
using namespace std;
#define PORT 4000
#define IP_ADDRESS "192.0.0.1"
DWORD WINAPI ClientThread(LPVOID IpParameter)
{
SOCKET ClientScocket = (SOCKET)IpParameter;
int Ret = 0;
char RecvBuffer[MAX_PATH];
while(true)
{
//将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值, 块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作, 其返回值为指向S的指针。
memset(RecvBuffer,0x00,sizeof(RecvBuffer));
//recv函数返回其实际copy的字节数。如果recv在copy时出错,那么它返回SOCKET_ERROR;如果recv函数在等待协议接收数据时网络中断了,那么它返回0。
Ret = recv(ClientScocket,RecvBuffer,MAX_PATH,0);
if (Ret == 0 || Ret == SOCKET_ERROR)
{
cout <<"客户端退出!"<< endl;
break;
}
cout <<"接收到客户端的信息为:"<< RecvBuffer <<endl;
}
return 0;
}
int main(int argc,char *argv[])
{
//这个结构被用来存储被WSAStartup函数调用后返回的Windows Sockets数据。它包含Winsock.dll执行的数据。
WSADATA Ws;
SOCKET ServerSocket,ClientScocket;
//此数据结构用做bind、connect、recvfrom、sendto等函数的参数,指明地址信息
struct sockaddr_in LocalAddr,ClientAddr;
int Ret = 0;
int AddrLen = 0;
HANDLE hThread = NULL;
//初始化windows套接字
//使用Socket的程序在使用Socket之前必须调用WSAStartup函数。该函数的第一个参数指明程序请求使用的Socket版本,其中高位字节指明副版本、低位字节指明主版本;操作系统利用第二个参数返回请求的Socket的版本信息
if (WSAStartup(MAKEWORD(2,2),&Ws) != 0)
{
cout <<"初始化windows套接字失败::" << GetLastError() << endl;
return -1;
}
//创建套接字
ServerSocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if (ServerSocket == INVALID_SOCKET)
{
cout <<"创建windows套接字失败::" << GetLastError() << endl;
return -1;
}
LocalAddr.sin_family = AF_INET;
LocalAddr.sin_addr.s_addr = inet_addr(IP_ADDRESS);
LocalAddr.sin_port = htons(PORT);
memset(LocalAddr.sin_zero,0x00,8);
//捆绑套接字
Ret = bind(ServerSocket,(struct sockaddr *)&LocalAddr,sizeof(LocalAddr));
if (Ret != 0)
{
cout <<"捆绑套接字失败::" << GetLastError() << endl;
return -1;
}
Ret = listen(ServerSocket,10);
if (Ret != 0)
{
cout <<"监听套接字失败::" << GetLastError() << endl;
return -1;
}
cout <<"服务端已启动....."<< endl;
while(true)
{
AddrLen = sizeof(ClientAddr);
ClientScocket = accept(ServerSocket,(struct sockaddr *)&ClientAddr,&AddrLen);
if (ClientScocket == INVALID_SOCKET)
{
cout <<"接收失败::" << GetLastError() << endl;
break;
}
cout <<"客户端连接::"<<inet_ntoa(ClientAddr.sin_addr)<<":"<<ClientAddr.sin_port<<endl;
hThread = CreateThread(NULL,0,ClientThread,(LPVOID)ClientScocket,0,NULL);
if (hThread == NULL)
{
cout <<"创建线程失败!"<< endl;
break;
}
CloseHandle(hThread);
}
closesocket(ServerSocket);
closesocket(ClientScocket);
WSACleanup();
system("pause");
return 0;
}
运行的话有个问题,报错误捆绑套接字失败即:
if (Ret != 0)
{
cout <<"捆绑套接字失败::" << GetLastError() << endl;
return -1;
}
这个函数报错,我实在不知道为什么,求解 展开
#include <Windows.h>
#pragma comment(lib,"ws2_32.lib")
using namespace std;
#define PORT 4000
#define IP_ADDRESS "192.0.0.1"
DWORD WINAPI ClientThread(LPVOID IpParameter)
{
SOCKET ClientScocket = (SOCKET)IpParameter;
int Ret = 0;
char RecvBuffer[MAX_PATH];
while(true)
{
//将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值, 块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作, 其返回值为指向S的指针。
memset(RecvBuffer,0x00,sizeof(RecvBuffer));
//recv函数返回其实际copy的字节数。如果recv在copy时出错,那么它返回SOCKET_ERROR;如果recv函数在等待协议接收数据时网络中断了,那么它返回0。
Ret = recv(ClientScocket,RecvBuffer,MAX_PATH,0);
if (Ret == 0 || Ret == SOCKET_ERROR)
{
cout <<"客户端退出!"<< endl;
break;
}
cout <<"接收到客户端的信息为:"<< RecvBuffer <<endl;
}
return 0;
}
int main(int argc,char *argv[])
{
//这个结构被用来存储被WSAStartup函数调用后返回的Windows Sockets数据。它包含Winsock.dll执行的数据。
WSADATA Ws;
SOCKET ServerSocket,ClientScocket;
//此数据结构用做bind、connect、recvfrom、sendto等函数的参数,指明地址信息
struct sockaddr_in LocalAddr,ClientAddr;
int Ret = 0;
int AddrLen = 0;
HANDLE hThread = NULL;
//初始化windows套接字
//使用Socket的程序在使用Socket之前必须调用WSAStartup函数。该函数的第一个参数指明程序请求使用的Socket版本,其中高位字节指明副版本、低位字节指明主版本;操作系统利用第二个参数返回请求的Socket的版本信息
if (WSAStartup(MAKEWORD(2,2),&Ws) != 0)
{
cout <<"初始化windows套接字失败::" << GetLastError() << endl;
return -1;
}
//创建套接字
ServerSocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if (ServerSocket == INVALID_SOCKET)
{
cout <<"创建windows套接字失败::" << GetLastError() << endl;
return -1;
}
LocalAddr.sin_family = AF_INET;
LocalAddr.sin_addr.s_addr = inet_addr(IP_ADDRESS);
LocalAddr.sin_port = htons(PORT);
memset(LocalAddr.sin_zero,0x00,8);
//捆绑套接字
Ret = bind(ServerSocket,(struct sockaddr *)&LocalAddr,sizeof(LocalAddr));
if (Ret != 0)
{
cout <<"捆绑套接字失败::" << GetLastError() << endl;
return -1;
}
Ret = listen(ServerSocket,10);
if (Ret != 0)
{
cout <<"监听套接字失败::" << GetLastError() << endl;
return -1;
}
cout <<"服务端已启动....."<< endl;
while(true)
{
AddrLen = sizeof(ClientAddr);
ClientScocket = accept(ServerSocket,(struct sockaddr *)&ClientAddr,&AddrLen);
if (ClientScocket == INVALID_SOCKET)
{
cout <<"接收失败::" << GetLastError() << endl;
break;
}
cout <<"客户端连接::"<<inet_ntoa(ClientAddr.sin_addr)<<":"<<ClientAddr.sin_port<<endl;
hThread = CreateThread(NULL,0,ClientThread,(LPVOID)ClientScocket,0,NULL);
if (hThread == NULL)
{
cout <<"创建线程失败!"<< endl;
break;
}
CloseHandle(hThread);
}
closesocket(ServerSocket);
closesocket(ClientScocket);
WSACleanup();
system("pause");
return 0;
}
运行的话有个问题,报错误捆绑套接字失败即:
if (Ret != 0)
{
cout <<"捆绑套接字失败::" << GetLastError() << endl;
return -1;
}
这个函数报错,我实在不知道为什么,求解 展开
展开全部
看打印出来的 错误码 GetLastError() 是多少,WSANOTINITIALISED:在使用此API之前应首先成功地调用WSAStartup()。
WSAENETDOWN:WINDOWS套接口实现检测到网络子系统失效。
WSAEADDRINUSE:所定端口已在使用中(参见setoption()中的SO_REUSEADDR选项)。
WSAEFAULT:namelen参数太小(小于sockaddr结构的大小)。
WSAEINPROGRESS:一个阻塞的WINDOWS套接口调用正在运行中。
WSAEAFNOSUPPORT:本协议不支持所指定的地址族。
WSAEINVAL:该套接口已与一个地址捆绑。
WSAENOBUFS:无足够可用缓冲区,连接过多。
WSAENOTSOCK:描述字不是一个套接口。
看情况 如果代码无误的话,最大的可能是端口被占用!
WSAENETDOWN:WINDOWS套接口实现检测到网络子系统失效。
WSAEADDRINUSE:所定端口已在使用中(参见setoption()中的SO_REUSEADDR选项)。
WSAEFAULT:namelen参数太小(小于sockaddr结构的大小)。
WSAEINPROGRESS:一个阻塞的WINDOWS套接口调用正在运行中。
WSAEAFNOSUPPORT:本协议不支持所指定的地址族。
WSAEINVAL:该套接口已与一个地址捆绑。
WSAENOBUFS:无足够可用缓冲区,连接过多。
WSAENOTSOCK:描述字不是一个套接口。
看情况 如果代码无误的话,最大的可能是端口被占用!
追问
#define IP_ADDRESS "192.0.0.1"我自己找到了,是网址给错了。。。。无语
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
GetLastError()没有错误信息吗?
追问
#define IP_ADDRESS "192.0.0.1"我自己找到了,是网址给错了。。。。无语
追答
这是一个提供很好检错的 函数。
host 一般可以定义为127.0.0.1
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询