static int n2s_sender_thread(void *data) { char buf[N2S_SEND_FRAGMENT]; REAL_EB_socket *rs = (REAL_EB_socket *)data; while(!rs->closed && !rs->status) { int count; SDL_Delay(rs->pollperiod); count = sfifo_used(&rs->fifo); if(!count) continue; while(count) { int res; int n = count; if(n > N2S_SEND_FRAGMENT) n = N2S_SEND_FRAGMENT; sfifo_read(&rs->fifo, buf, n); res = NET2_TCPSend(rs->n2socket, buf, n); if(res < 0) { rs->status = EEL_XDEVICEWRITE; break; } count -= n; } } // Detach from the EEL wrapper object rs->sender = NULL; return 0; }
static EEL_xno n2_tcp_send(EEL_vm *vm) { EEL_value *args = vm->heap + vm->argv; EB_socket *ebs; int i, count = 0; if(EEL_TYPE(args) != md.net2_socket_cid) return EEL_XWRONGTYPE; ebs = o2EB_socket(args->objref.v); if(!ebs->rs) return EEL_XDEVICECLOSED; if(ebs->rs->status) return ebs->rs->status; for(i = 1; i < vm->argc; ++i) { void *buf; int bsize; EEL_value *v = args + i; switch((EEL_classes)EEL_TYPE(v)) { case EEL_CREAL: { int n; #if SDL_BYTEORDER == SDL_BIG_ENDIAN char lb[sizeof(EEL_real)]; *((EEL_real *)&lb) = v->real.v; #else union { EEL_real r; char c[sizeof(EEL_real)]; } cvt; char lb[sizeof(EEL_real)]; cvt.r = v->real.v; for(n = 0; n < sizeof(EEL_real); ++n) lb[n] = cvt.c[sizeof(EEL_real) - 1 - n]; #endif buf = &lb; bsize = sizeof(EEL_real); break; } case EEL_CINTEGER: { EEL_uint32 cvt; SDLNet_Write32(eel_v2l(v), &cvt); buf = &cvt; bsize = 4; break; } case EEL_CSTRING: case EEL_CDSTRING: { buf = (void *)eel_v2s(v); bsize = eel_length(v->objref.v); break; } default: return EEL_XARGUMENTS; } if(ebs->rs->sender) { /* Buffered, non-blocking */ if(sfifo_space(&ebs->rs->fifo) < bsize) return EEL_XBUFOVERFLOW; sfifo_write(&ebs->rs->fifo, buf, bsize); } else { /* Direct, blocking */ int n = NET2_TCPSend(ebs->rs->n2socket, buf, bsize); if(n < 0) return EEL_XDEVICEWRITE; } count += bsize; } eel_l2v(vm->heap + vm->resv, count); return 0; }
int main(int argc, char **argv) { SDL_Event ev; char welcome[] = "Test de connexion PerudOnLan"; char buf[1024]; int len = 0; int count = 0; int s = -1; int next[0xffff]; int n = -1; IPaddress *monIP = NULL; memset(next, 0, sizeof(next)); mySDLInitOrQuit(SDL_INIT_EVENTTHREAD | SDL_INIT_VIDEO | SDL_INIT_NOPARACHUTE); if((NET2_ResolveHost(monIP,"localhost",6666))!=0 || monIP==NULL) { fprintf(stderr,"errreur à la récupération de l'IP"); return EXIT_FAILURE; } NET2_TCPAcceptOn(monIP->port); while (FE_WaitEvent(&ev)) { switch (ev.type) { case SDL_USEREVENT: switch (NET2_GetEventType(&ev)) { case NET2_TCPACCEPTEVENT: count++; printf("accept(%d)\n", NET2_GetSocket(&ev)); s = NET2_GetSocket(&ev); if (-1 == NET2_TCPSend(s, welcome, sizeof(welcome) - 1)) { printf("WELCOME SEND FAILED\n"); } next[s] = 0; break; case NET2_TCPRECEIVEEVENT: s = NET2_GetSocket(&ev); while (0 != (len = NET2_TCPRead(s, buf, sizeof(buf)))) { int i; n = next[s]; for (i = 0; i < len; i++) { if (welcome[n] != buf[i]) { printf("\nout of sync %c != %c\n", welcome[n], buf[i]); exit(0); } n = (n + 1) % (sizeof(welcome) - 1); } next[s] = n; if (-1 == NET2_TCPSend(s, buf, len)) { printf("RECIEVE SEND FAILED\n"); } } break; case NET2_TCPCLOSEEVENT: printf("close(%d)\n", NET2_GetSocket(&ev)); NET2_TCPClose(NET2_GetSocket(&ev)); count--; /*if (0 >= count) { exit(0); } */ break; case NET2_ERROREVENT: printf("Error: %s(%d)\n", NET2_GetEventError(&ev), NET2_GetSocket(&ev)); exit(0); break; } break; case SDL_QUIT: mySDL_Quit(); exit(0); break; } } mySDL_Quit(); }