2016-03-29 18 views
0

Amaç: Benim kodum, bir soket oluşturmak ve bir istemciden bir paket almaktır (bu istemci her 500 ms'de bir ileti yayınlar). Olgu: Soket bir ana bilgisayar soketi olarak oluşturulduğunda, doğrudan revfrom() işlevi, revfrom işlevinden -1 döndürecektir. ancak, eğer herhangi bir paketle sendto() işlevini kullanırsam, o zaman revfrom() öğesini hemen kullanın. Bu ihtiyacım olan paketi bulmaya yardımcı olacak. googled, bir istemci soketine benziyor, ama ben bir sunucu soketi olarak yarattım. kodları aşağıdadır, lütfen herhangi bir öneri verin, takdir et! Kod:UDP soketi revfrom() dönüş hatası

SOCKET s; 
sockaddr_in addrDest; 
sockaddr_in addrLocal; 
int result; 
char udp_buff[AMP_MAX_PACKET_SIZE]; 

WSADATA wsaData; 
wchar_t msgbuf[100]; 

int addrDestSize = sizeof(SOCKADDR_IN); 

// initialize winsock 
result = WSAStartup(MAKEWORD(2, 2), &wsaData); 
if (result != NO_ERROR) { 
    wprintf(L"WSAStartup failed with error: %d\n", result); 
    //return 1; 
} 

// create the socket 
s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); // UDP socket 

u_long iMode = 1; 
result = ioctlsocket(s, FIONBIO, &iMode); 
if (result != NO_ERROR) 
    printf("ioctlsocket failed with error: %ld\n", result); 

addrLocal.sin_family = AF_INET; 
addrLocal.sin_port = htons(16717); 
addrLocal.sin_addr.s_addr = htonl(INADDR_ANY); // zero-init sin_addr to tell it to use all available adapters on the local host 

               // associate this socket with local UDP port 16717 
result = bind(s, (struct sockaddr*)&addrLocal, sizeof(addrLocal)); 

addrDest.sin_family = AF_INET; 
addrDest.sin_port = htons(16717); 
inet_pton(AF_INET, "192.168.99.255", &(addrDest.sin_addr)); 

uint8_t node_address_temp[6] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };  //array 
std::vector<uint8_t> node_address(node_address_temp, node_address_temp + sizeof(node_address_temp)/sizeof(uint8_t)); 
//formatDataPack("MID", dataPack, node_address); 
//SendCMDToGauge(&s, &dataPack, &addrDest); 
result = sendto(s, " ", strlen(" ") + 1, 0, (SOCKADDR *)&addrDest, sizeof(addrDest)); 

result = -1; 
while (result < 0) { 
    result = recvfrom(s, (char*)&udp_buff, sizeof(udp_buff), 0, (SOCKADDR *)&addrDest, &addrDestSize); 
    //result = recv(s, (char*)&udp_buff, sizeof(udp_buff), 0); 
    swprintf(msgbuf, 100, L"Revfrom Result: %d\n", result); 
    OutputDebugString(msgbuf); 
    Sleep(500); 
    if (result = 36) 
     result = -1; 
} 
+0

dürüstçe, nasıl tanımlanacağından emin değilim. Benim uygulamamda, bilgisayarımın ağdaki bir wifi cihazıyla konuşması, mac adresini, sürekli olarak gönderdiği paketinden alması gerekiyor. ve daha sonra PC'den bazı formatlanmış paketler göndererek bu cihazı kontrol edecektir. Yani uygulamadan, bir sunucu olduğunu tahmin ediyorum? – Jacob

+0

Farkın, "ana bilgisayar soketi", "istemci soketi" ve "sunucu soketi" arasında olduğunu düşündüğüm şeyi soruyorum. Kodunuzun davranış şekli üzerinde bir etkisi olan iki (veya belki üç) farklı soket türü hakkında konuşuyor gibisiniz. Bu terimlerle ne demek istediğini anlamıyorum. Tam olarak "istemci soketi" nedir? Yanlış şartlar kullanmış olsaydım –

+0

beni affeder. Bu terimlerden bağımsız olarak, temel olarak ağdan veri almak için recfrom() işlevinin nasıl kullanıldığını anlamaya çalışıyorum. – Jacob

cevap

1

Gördüğünüz davranış beklenmektedir. Soketi bloke etmediniz. Yani, recvfrom'u ararsanız ve o anda alınacak bir şey yoksa, engellemek yerine -1 döner.

+0

Soketi çok yeni kullanıyorum, eğer davayı ele almak için bazı örnek kodlar sağlayabilseydiniz gerçekten takdir ediyorum. – Jacob

+0

Yapmanız gereken özel bir şey yok. Beklenen davranış. Kodunuz zaten onu ele alıyor, bunun gerçekleştiğine şaşırmış görünüyorsun. –

+0

@Jacob Evet .. beklemeyi isteseydiniz, neden engellemeyi engellemediniz? –