0

ソケットを介して、同じ Windows 7 PC で実行されている別のプログラムからプログラムのデータを受信しようとしています。このために、送信用と受信用の2つの別々のプログラムを作成しました.送信プログラムは成功を示していますが、受信プログラムは無期限に待機しています.受信ソケットを非ブロックモードにすると、エラーコード10035、つまりリソー​​スが利用できなくなります. ファイアウォールなど、私がしなければならないシステム設定はありますか。ファイアウォールを無効にした後も同じエラーが発生します。stackoverflow.com を検索しましたが、問題の解決策を得ることができませんでした。送受信機能のコードを以下に示します。 送信機能の場合:

#include "stdafx.h"
#ifndef UNICODE
#define UNICODE
#endif
#define WIN32_LEAN_AND_MEAN
#include <winsock2.h>
#include <Ws2tcpip.h>
#include <stdio.h>
// Link with ws2_32.lib
#pragma comment(lib, "Ws2_32.lib")
using namespace System;
int main(array<System::String ^> ^args)
{   
    char ch;
    int iRun =1;
    int iResult;
    WSADATA wsaData;
    SOCKET SendSocket = INVALID_SOCKET;
    sockaddr_in RecvAddr;
    unsigned short Port = 51234;
    char SendBuf[1024]="Testing";
    int BufLen = 1024;
    //----------------------
    // Initialize Winsock
    iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (iResult != NO_ERROR) {
        wprintf(L"WSAStartup failed with error: %d\n", iResult);
        return 1;
    }
    //---------------------------------------------
    // Create a socket for sending data
    SendSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    if (SendSocket == INVALID_SOCKET) {
        wprintf(L"socket failed with error: %ld\n", WSAGetLastError());
        WSACleanup();
        return 1;
    }
    //---------------------------------------------
    // Set up the RecvAddr structure with the IP address of
    // the receiver (in this example case "178.0.0.100")
    // and the specified port number.
    RecvAddr.sin_family = AF_INET;
    RecvAddr.sin_port = htons(Port);
    RecvAddr.sin_addr.s_addr = inet_addr("178.0.0.100");
    //---------------------------------------------
    // Send a datagram to the receiver
    wprintf(L"Sending a datagram to the receiver...\n");
    while(iRun) {
        iResult = sendto(SendSocket,
                     SendBuf, BufLen, 0, (SOCKADDR *) & RecvAddr, sizeof (RecvAddr));
       if (iResult == SOCKET_ERROR) {
        wprintf(L"sendto failed with error: %d\n", WSAGetLastError());
        //closesocket(SendSocket);
        //WSACleanup();
        //return 1;
    }
        wprintf(L"send success :data bytes: %d\n", iResult);
    } 
    //---------------------------------------------
    // When the application is finished sending, close the socket.
    wprintf(L"Finished sending. Closing socket.\n");
    iResult = closesocket(SendSocket);
    if (iResult == SOCKET_ERROR) {
        wprintf(L"closesocket failed with error: %d\n", WSAGetLastError());
        WSACleanup();
        return 1;
    }
    //---------------------------------------------
    scanf("enter any number to terminate %c",&ch);
    // Clean up and quit.
    wprintf(L"Exiting.\n");
    WSACleanup();
    return 0;   
    //Console::WriteLine(L"Hello World");
    //return 0;
}

受信機能の場合

#include "stdafx.h"    
#ifndef UNICODE
#define UNICODE
#endif    
#define WIN32_LEAN_AND_MEAN    
#include <winsock2.h>
#include <Ws2tcpip.h>
#include <stdio.h>    
// Link with ws2_32.lib
#pragma comment(lib, "Ws2_32.lib")    
using namespace System;    
int main(array<System::String ^> ^args)
{
    char ch;
    int iRun =1;
    int iResult = 0;    
    WSADATA wsaData;
    DWORD nonBlocking =1;    
    SOCKET RecvSocket;
    sockaddr_in RecvAddr;    
    unsigned short Port = 51234;    
    char RecvBuf[1024];
    int BufLen = 1024;    
    sockaddr_in SenderAddr;
    int SenderAddrSize = sizeof (SenderAddr);    
    //-----------------------------------------------
    // Initialize Winsock
    iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (iResult != NO_ERROR) {
        wprintf(L"WSAStartup failed with error %d\n", iResult);
        return 1;
    }
    //-----------------------------------------------
    // Create a receiver socket to receive datagrams
    RecvSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    if (RecvSocket == INVALID_SOCKET) {
        wprintf(L"socket failed with error %d\n", WSAGetLastError());
        return 1;
    }
            // Setting socket to non blocking mode
    if(ioctlsocket(RecvSocket, FIONBIO, &nonBlocking)!= 0)
            printf("can't Set socket to non blocking mode \n");
    //-----------------------------------------------
    // Bind the socket to any address and the specified port.
    RecvAddr.sin_family = AF_INET;
    RecvAddr.sin_port = htons(Port);
    RecvAddr.sin_addr.s_addr = htonl(INADDR_ANY);    
    iResult = bind(RecvSocket, (SOCKADDR *) & RecvAddr, sizeof (RecvAddr));
    if (iResult != 0) {
        wprintf(L"bind failed with error %d\n", WSAGetLastError());
        return 1;
    }
    //-----------------------------------------------
    // Call the recvfrom function to receive datagrams
    // on the bound socket.
    wprintf(L"Receiving datagrams...\n");
    while(iRun) {
    iResult = recvfrom(RecvSocket,
                       RecvBuf, BufLen, 0, (SOCKADDR *) & SenderAddr, &SenderAddrSize);
        if (iResult == SOCKET_ERROR) {
        wprintf(L"recvfrom failed with error %d\n", WSAGetLastError());
        Sleep(10);
        }
        //wprintf(L"recvfrom Success %d\n", iResult);
        //wprintf(L"Received Data %s \n",RecvBuf[BufLen]);
    }     
    //-----------------------------------------------
    // Close the socket when finished receiving datagrams
    wprintf(L"Finished receiving. Closing socket.\n");
    iResult = closesocket(RecvSocket);
    if (iResult == SOCKET_ERROR) {
        wprintf(L"closesocket failed with error %d\n", WSAGetLastError());
        return 1;
    }    
    //-----------------------------------------------
   scanf("enter any number to terminate %c",&ch);
    // Clean up and exit.
    wprintf(L"Exiting.\n");
    WSACleanup();
    return 0;

    //Console::WriteLine(L"Hello World");
    //return 0;
}

誰でも助けてください。

よろしく

マヘンドラ

4

1 に答える 1

0

調べましたか?Winsock エラー コード 10035 はWSAEWOULDBLOCK. ノンブロッキング モードであり、送信時に送信バッファーがいっぱいであるか、受信時に受信バッファーが空であるため、実行しようとしている操作を完了できません。

于 2013-04-05T03:29:46.627 に答える