gpt4 book ai didi

c - Windows writeFileEx 和 recvfrom 程序崩溃

转载 作者:行者123 更新时间:2023-11-30 17:49:02 33 4
gpt4 key购买 nike

我正在尝试编写一个非常简单的 C 程序。由于某种原因,我无法在同一程序中使用 writeFileEx 和 receivevfrom,因为每次调用 writeFileEx 都会导致 receivevfrom 崩溃。

这是相关的代码片段

struct sockaddr_in server, client_address;
int client_length, recv_len;
char buf[BUFLEN];
WSADATA wsa;
if (WSAStartup(MAKEWORD(2,2),&wsa) != 0 )
{
//Error
}

SOCKET s = socket (AF_INET, SOCK_DGRAM, 0);
if (s == INVALID_SOCKET)
{
//invalid socket error
}

server.sin_family = AF_INET;
server.sin_addr.s_addr= INADDR_ANY;
server.sin_port = htons (PORT);

if (bind(s, (stuct sockaddr* ) &server, sizeof(server)) == SOCKET_ERROR)
{
//bind error
}

OVERLAPPED ovWrite;
memset(&ovWrite,0,sizeof(ovWrite));
ovWrite.offset=0;
ovWrite.OffsetHigh=0;
ovWrite.hEvent = CreateEvent (0,TRUE,0,0);

memset(buf,'\0',BUFLEN);


while (1)
{
if (!recvfrom(s, buf, BUFLEN,0,(struct sockaddr *) &client_address, &client_length)
{
fprintf(stderr, "Recvfrom Failed %d\n", WSAGetlastError());
}

if (!WriteFileEx(serialHandle, buf, strlen(buf),&ovWrite,NULL))
{
fprintf(stderr, "Error writing to COM port %d\n", GetlastError());
}
memset(buf,'\0', BUFLEN);
}

我正在使用 lcc 编译器,生成的程序在循环的第二次迭代中崩溃,出现访问冲突 0xc0000005。当我用另一个输入源(例如 stdin)替换 recvfrom 时,程序运行正常。这是一个已知问题还是两个函数调用根本不能同时存在?

最佳答案

recvfrom() 不会将 '\0' 添加到 buf,因此至少() if recvfrom( ) 读取 BUFLEN 字节,或者在第一次调用时,如果 buf 未在代码片段之外初始化,则调用 strlen() 导致 UB。此外,您的 if(recvfrom( ... ) ) 是错误的,因为如果成功,`recvfrom() 返回收到的字节数,因此条件为真。相反,你可以这样做:

size_t received;

....

if ((received = recvfrom(s, buf, BUFLEN,0,(struct sockaddr *) &client_addres, &client_length)) <= 0 )
{
fprintf(stderr, "Recvfrom Failed %d\n", WSAGetlastError());
}

if (!WriteFileEx(serialHandle, buf, received,&ovWrite,NULL))
{
fprintf(stderr, "Error writing to COM port %d\n", GetlastError());
}

关于c - Windows writeFileEx 和 recvfrom 程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18144171/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com