0

非常に単純な C プログラムを作成しようとしています。何らかの理由で、writeFileEx を呼び出すたびに recvfrom がクラッシュするため、同じプログラム内で writeFileEx と recvfrom を使用することはできません。

関連するコードスニペットは次のとおりです

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 コンパイラを使用していますが、結果のプログラムがループの 2 回目の反復でアクセス違反 0xc0000005 でクラッシュします。recvfrom を stdin などの別の入力ソースに置き換えると、プログラムは正常に動作します。これは既知の問題ですか、それとも 2 つの関数呼び出しが一緒に存在することはできませんか?

4

2 に答える 2

0

recvfrom()'\0'to を追加しないbufため、少なくとも ()バイトをrecvfrom()読み取る場合、または最初の呼び出しで、コード スニプレットの外部で初期化されていない場合、呼び出すと UB が発生します。さらに、成功した場合、recvfrom() は受信したバイト数を返すため、条件が true になるため、あなたは間違っています。代わりに、次のようにすることができます。BUFLENbufstrlen()if( 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());
}
于 2013-08-09T10:16:33.883 に答える