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;
}
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
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 –
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