📄 subnodes.h
字号:
/*
* ensure all of data on socket comes through. f==read || f==write
*/
// http://awgn.antifork.org/codes/usr8550.c
/*
ssize_t
atomicio(f, fd, _s, n)
ssize_t(*f) ();
int fd;
void *_s;
size_t n;
{
char *s = _s;
ssize_t res, pos = 0;
while (n > pos) {
res = (f) (fd, s + pos, n - pos);
switch (res) {
case -1:
if (errno == EINTR || errno == EAGAIN)
continue;
else
fatal("atomicio(): %s\n", strerror(errno));
case 0:
return (res);
default:
pos += res;
}
}
return (pos);
}
*/
int setnonblock(SOCKET sock,int to)
{
#ifdef WIN32
setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO,(char*) &to, sizeof(int));
#else
struct timeval timeout;
timeout.tv_sec = to/1000;
timeout.tv_usec=0;
if (setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO,(char*) &timeout, sizeof(timeout)))
return 0;
#endif
return 1;
}
int StartUpWinsock()
{
#ifdef WIN32
WSADATA wsadata;
if((WSAStartup(MAKEWORD(1,1),&wsadata))!=0 || (LOBYTE(wsadata.wVersion )!=1 || HIBYTE(wsadata.wVersion)!=1))
return 0;
#endif
return 1;
}
void EmptySocketBuffer(SOCKET sock)
{
char* msg;
msg = malloc(100000);
recv(sock,msg,100000,0);
FREE(msg);
}
int ConnectToAllSubNodes()
{
unsigned int i;
StartUpWinsock();
for(i=0; i<subNodesStruct.saddrElements; i++)
{
subNodesStruct.socks[i] = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if ( connect( (SOCKET)subNodesStruct.socks[i], (LPSOCKADDR) &subNodesStruct.saddrSubNodes[i], sizeof(SOCKADDR_IN) ) == SOCKET_ERROR)
{
printf("Node %d: Failed\n",i+1);
subNodesStruct.isConnected[i]=0;
closesocket(subNodesStruct.socks[i]);
}
else
{
printf("Node %d: OK\n",i+1);
subNodesStruct.isConnected[i]=1;
setnonblock(subNodesStruct.socks[i], 50);
/*
{
int nonblocking = 1;
ioctlsocket(subNodesStruct.socks[i], FIONBIO, &nonblocking);
}
*/
}
}
return 1;
}
/* ricerca OOI: invia a tutti nodi l'array delle parole che formano la query */
void SendAMessageToAllNodesOOI(unsigned int* query, int words)
{
unsigned int i;
int res;
int* msg;
/* alloca il messaggio che invieremo della lunghezza dell'array + il primo
valore del pacchetto che identifica la lunghezza
PROTOCOLLO: | b | numero parole | word1 | word2 | ... | wordN |
*/
msg = malloc(sizeof(int)*(words+2));
msg[0] = words;
memcpy(msg+1,query,sizeof(int)*words);
for(i=0; i<subNodesStruct.saddrElements; i++)
{
if(subNodesStruct.isConnected[i])
{
res = SEND(subNodesStruct.socks[i], "b");
/* un nodo si
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -