新手C++ WINsocket编程 卡在recv那里
#include <WinSock2.h>
void SocketTest(){
WSADATA wsaData;
//初始化socket库
WSAStartup(MAKEWORD(2, 0), &wsaData);
//创建
SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
SOCKADDR_IN sa;
sa.sin_family = AF_INET;
//设置链接服务端的端口
sa.sin_port = htons(80);//端口号
sa.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
//尝试连接服务器
if (connect(sock, (SOCKADDR*)&sa, sizeof(sa)) == SOCKET_ERROR)
{
MessageBoxA(0, "卧槽 炸了", "", 0);
}
//与服务器进行通信
char aSendString[] =
"GET /announcement.html HTTP/1.1\r\n"
"User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/110.0\r\n";
char result;
send(sock, aSendString, sizeof(aSendString) - 1, 0);//发包测试
recv(sock, result, sizeof(result) - 1, 0);
MessageBoxA(0, result, 0, 0);
}
新手socket编程,执行到recv(sock, result, sizeof(result) - 1, 0);那一步就卡住 卡了几十秒后服务器就会返回一个408 然后软件这里提示一行乱码
端口和ip我用浏览器连都是正常的
软件recv后服务器也有一条日志
127.0.0.1 - - "GET /announcement.html HTTP/1.1" 408 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/110.0"
但是就是返回408 recv卡死我也是服了 截取浏览器与服务器通信的HTTP包 一对比就知道了 aSendString的结尾再增加"\r\n",应该就可以了,参见http协议的请求报文格式
1》楼主的socket client代码没有大问题的,可以正常收发。(检查一下服务器代码)
2》测试代码
// TestSocketClinet.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "TestSocketClinet.h"
#include <WinSock2.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// 唯一的应用程序对象
CWinApp theApp;
using namespace std;
void SocketTest(){
WSADATA wsaData;
//初始化socket库
WSAStartup(MAKEWORD(2, 0), &wsaData);
//创建
SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
SOCKADDR_IN sa;
sa.sin_family = AF_INET;
//设置链接服务端的端口
sa.sin_port = htons(80);//端口号
sa.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
//尝试连接服务器
if (connect(sock, (SOCKADDR*)&sa, sizeof(sa)) == SOCKET_ERROR)
{
MessageBoxA(0, "卧槽 炸了", "提示", 0);
}
//与服务器进行通信
char aSendString[] =
"GET /announcement.html HTTP/1.1\r\n"
"User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/110.0\r\n";
char result = { 0 };
//send(sock, aSendString, sizeof(aSendString)-1, 0);//发包测试
send(sock, aSendString, strlen(aSendString), 0);//发包测试
//recv(sock, result, sizeof(result)-1, 0);
recv(sock, result, 128, 0);
MessageBoxA(0, result, "提示", 0);
}
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;
HMODULE hModule = ::GetModuleHandle(NULL);
if (hModule != NULL)
{
// 初始化 MFC 并在失败时显示错误
if (!AfxWinInit(hModule, NULL, ::GetCommandLine(), 0))
{
// TODO:更改错误代码以符合您的需要
_tprintf(_T("错误:MFC 初始化失败\n"));
nRetCode = 1;
}
else
{
// TODO:在此处为应用程序的行为编写代码。
SocketTest();
}
}
else
{
// TODO:更改错误代码以符合您的需要
_tprintf(_T("错误:GetModuleHandle 失败\n"));
nRetCode = 1;
}
return nRetCode;
}
3》sizeof是c语言函数,一般参数是数据类型或对象,目的求数据类型占用字节数。不要用于求数组大小。
顺祝楼主:学习进步、天天向上。 本帖最后由 稻海香 于 2022-12-31 10:26 编辑
michaelgao 发表于 2022-12-31 09:30
1》楼主的socket client代码没有大问题的,可以正常收发。(检查一下服务器代码)
正解,,应该是服务器问题。 你没设置异步模式, 默认就是同步!
recv没收到消息肯定一直阻塞的! 可以使用select函数查询一下IO口是否可读。 谢谢各位,解决了,确实是服务器的问题。
页:
[1]