recv() WSAGetLasterror 10038错误求助

淡定莫慌w 2019-05-15 09:30:43
本人初学网络编程,想实现一个回射服务器的功能,代码如下:

服务器端代码
#include<stdio.h>
#include<WinSock2.h>
#pragma comment (lib,"WS2_32.lib")
#define PORT 8888
#define ADDR "127.0.0.1"

int main()
{
char buf[100];
int iResult = 0;
SOCKET sconnection = INVALID_SOCKET;
struct sockaddr_in serAddr;
//套接字初始化
WSADATA mydata;
if (WSAStartup(MAKEWORD(2, 2), &mydata) != 0)
{
printf("套接字初始化失败:%d\n", WSAGetLastError());
exit(0);
}
printf("初始化成功.......\n");
//创建套接字
if ((sconnection = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
{
printf("创建套接字失败:%d\n", WSAGetLastError());
WSACleanup();
return 0;
}
printf("TCP套接字创建成功......\n");

//设置服务器地址结构
serAddr.sin_family = AF_INET;
serAddr.sin_port = htons(PORT);
serAddr.sin_addr.S_un.S_addr = inet_addr(ADDR);

//连接到服务器
printf("正在连接到%s:%d\n", inet_ntoa(serAddr.sin_addr), htons(serAddr.sin_port));
if (connect(sconnection, (struct sockaddr*) & serAddr, sizeof(serAddr)) == SOCKET_ERROR)
{
printf("连接失败:%d\n", WSAGetLastError());
closesocket(sconnection);
WSACleanup();
return 0;
}
printf("连接成功.......\n");
printf("准备发送数据....\n");


//发送缓冲区中的数据
while(1)
(
memset(buf, 0, sizeof(buf));//初始化缓冲区
printf("想要发送的数据为:\n");
gets(buf);
if (iResult = send(sconnection, buf, sizeof(buf), 0) == SOCKET_ERROR)
{
printf("发送数据失败:%d\n", WSAGetLastError());
closesocket(sconnection);
WSACleanup();
return 0;
}
printf("数据发送成功到%s\n", inet_ntoa(serAddr.sin_addr));
memset(buf, 0, sizeof(buf));//初始化缓冲区

//接收服务器返回的数据
if (iResult = recv(sconnection, buf, strlen(buf), 0) == SOCKET_ERROR)
{
printf("接收数据失败:%d\n", WSAGetLastError());
}
printf("来自%s的数据已被成功接收\n", inet_ntoa(serAddr.sin_addr));
printf(buf);
);
printf("准备关闭连接.....\n");
closesocket(sconnection);
WSACleanup();
return 0;
}



客户端代码:
#include<stdio.h>
#include<WinSock2.h>
#pragma comment (lib,"WS2_32.lib")
#define PORT 8888
#define ADDR "127.0.0.1"

int main()
{
char buf[100];
int iResult = 0;
SOCKET sconnection = INVALID_SOCKET;
struct sockaddr_in serAddr;
//套接字初始化
WSADATA mydata;
if (WSAStartup(MAKEWORD(2, 2), &mydata) != 0)
{
printf("套接字初始化失败:%d\n", WSAGetLastError());
exit(0);
}
printf("初始化成功.......\n");
//创建套接字
if ((sconnection = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
{
printf("创建套接字失败:%d\n", WSAGetLastError());
WSACleanup();
return 0;
}
printf("TCP套接字创建成功......\n");

//设置服务器地址结构
serAddr.sin_family = AF_INET;
serAddr.sin_port = htons(PORT);
serAddr.sin_addr.S_un.S_addr = inet_addr(ADDR);

//连接到服务器
printf("正在连接到%s:%d\n", inet_ntoa(serAddr.sin_addr), htons(serAddr.sin_port));
if (connect(sconnection, (SOCKADDR *) & serAddr, sizeof(serAddr)) == SOCKET_ERROR)
{
printf("连接失败:%d\n", WSAGetLastError());
closesocket(sconnection);
WSACleanup();
return 0;
}
printf("连接成功.......\n");
printf("准备发送数据....\n");


//发送缓冲区中的数据
for (int i = 0;; i++)
{
memset(buf, 0, sizeof(buf));//初始化缓冲区
printf("想要发送的数据为:\n");
gets(buf);
if (iResult = send(sconnection, buf, sizeof(buf), 0) == SOCKET_ERROR)
{
printf("发送数据失败:%d\n", WSAGetLastError());
closesocket(sconnection);
WSACleanup();
return 0;
}
printf("数据发送成功到%s\n", inet_ntoa(serAddr.sin_addr));
//memset(buf, 0, sizeof(buf));//初始化缓冲区

//接收服务器返回的数据
if (iResult = recv(sconnection, buf, strlen(buf), 0) == SOCKET_ERROR)
{
printf("接收数据失败:%d\n", WSAGetLastError());
}
printf("来自%s的数据已被成功接收\n", inet_ntoa(serAddr.sin_addr));
printf(buf);
}
printf("准备关闭连接.....\n");
closesocket(sconnection);
WSACleanup();
return 0;
}


调试结果:
一旦调试客户端时,服务器端还没接收数据就显示这个错误。在网上找了很多资料,说是套接字问题,但有点看不太懂,希望大哥们给点建议思路啥的,不然我自己时解决不了这个问题哈。
...全文
314 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
淡定莫慌w 2019-05-16
  • 打赏
  • 举报
回复
服务器端代码: #include<stdio.h> #include<WinSock2.h> #pragma comment (lib,"WS2_32.lib") #define PORT 8888 #define ADDR "127.0.0.1" int main() { char buf[100]; int iResult = 0; SOCKET listensocket = INVALID_SOCKET; SOCKET newconnection=INVALID_SOCKET; SOCKADDR_IN serAddr, cliAddr; int cliAddrLen = sizeof(cliAddr); //套接字初始化 WSADATA mydata; if (WSAStartup(MAKEWORD(2, 2), &mydata) != 0) { printf("套接字初始化失败:%d\n", WSAGetLastError()); exit(0); } printf("初始化成功.......\n"); //创建套接字 if ((listensocket = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) { printf("创建套接字失败:%d\n", WSAGetLastError()); WSACleanup(); return 0; } printf("TCP套接字创建成功......\n"); //设置服务器地址结构 serAddr.sin_family = AF_INET; serAddr.sin_port = htons(PORT); serAddr.sin_addr.S_un.S_addr = inet_addr(ADDR); //绑定套接字 if (bind(listensocket, (struct sockaddr*) & serAddr, sizeof(serAddr))==SOCKET_ERROR) { printf("套接字绑定失败:%d\n", WSAGetLastError()); closesocket(listensocket); WSACleanup(); return 0; } printf("绑定套接字成功......\n"); //启动监听 if (listen(listensocket, 5) == SOCKET_ERROR) { printf("监听失败:%d\n", WSAGetLastError()); closesocket(listensocket); WSACleanup(); return 0; } printf("等待来自一个端口为%d的请求\n", PORT); //接收客户端连接请求 if (newconnection = accept(listensocket, (struct sockaddr *) & cliAddr, &cliAddrLen)==INVALID_SOCKET) { printf("接受请求失败:%d\n", WSAGetLastError()); closesocket(listensocket); WSACleanup(); return 0; } printf("成功接受一个来自%s:%d的请求\n", inet_ntoa(cliAddr.sin_addr),ntohs(cliAddr.sin_port)); closesocket(listensocket); printf("等待接收数据.......\n"); //存储接收到的数据 memset(buf, 0, sizeof(buf));//格式化缓冲区 for(int i=0;;i++) { if((iResult=recv(newconnection, buf, sizeof(buf), 0))==SOCKET_ERROR) { printf("接收数据失败:%d\n", WSAGetLastError()); closesocket(newconnection); WSACleanup(); return 0; } //显示收到的数据 printf(buf); printf("\n"); //返回接收到的数据 if (iResult = send(newconnection, buf, strlen(buf), 0) == SOCKET_ERROR) { printf("发送数据失败:%d\n", WSAGetLastError()); } } //关闭套接字 closesocket(newconnection); WSACleanup(); system("pause"); return 0; }
淡定莫慌w 2019-05-16
  • 打赏
  • 举报
回复
哦哦,复制没完全,马上改
zgl7903 2019-05-16
  • 打赏
  • 举报
回复
10038 WSAENOTSOCK 服务器端代码怎么没有看到 listen accept 呢?

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧