【发布时间】:2013-08-09 10:00:39
【问题描述】:
我正在尝试编写一个非常简单的 C 程序。出于某种原因,我不能在同一个程序中使用 writeFileEx 和 recvfrom,因为每次调用 writeFileEx 都会导致 recvfrom 崩溃。
这里是相关代码sn -p
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。 当我用另一个输入源(如标准输入)替换 recvfrom 时,程序运行良好。 这是一个已知问题还是 2 个函数调用根本不能同时存在?
【问题讨论】:
-
'这是一个已知问题还是两个函数调用根本不能同时存在?' - 两者都不。您的代码有错误。
-
为什么完成例程的地址为NULL?
-
我已经尽可能简化以消除任何错误,但仍然崩溃。您能找出上述 sn-p 中的错误吗?
-
它为空,因为目前我不打算在完成 WriteFileEx 后做任何事情 - 继续监听更多数据。
-
请说明 buf 和 ovWrite 在何处声明为已分配 - 重叠 I/O 调用必须为每个调用使用不同的 OVL 块,并且几乎总是使用不同的缓冲区。通常,我将缓冲区和 OVL 结构作为一个类的成员,用 new 实例化一个,用“this”指针加载 OVL 的 hEvent 参数,然后发出调用。在完成例程中,可以通过再次转换 hEvent 轻松检索实例。
标签: c windows sockets serial-port