struct programmer { char namelen; char name[256]; char capabilities; }; vector programmers; /* server_fd is the server's file descriptor, and it works right */ while(1){ // client connects client_fd = accept(server_fd, ...); unsigned char namelen; while(read(client_fd, &namelen, 1) > 0){ if(namelen == 0){ // we have a requesting client while(read(client_fd, &namelen, 1)){ // send back a programmer that fits for(int i = 0; i < programmers.size(); i++){ if(programmers[i].capabilities & namelen == namelen){ write(client_fd, &programmers[i].namelen, 1); write(client_fd, programmers[i].name, programmers[i].namelen); write(client_fd, &programmers[i].capabilities, 1); programmers[i] = programmers[programmers.size()]; programmers.pop(); } } } } else { struct programmer np; np.namelen = namelen; read(client_fd, np.name, namelen); read(client_fd, &np.capabilities, 1); programmers.push_back(np); } } } // Client: /* Connect, fd is our file descriptor */ char tosend[2] = {0, 5}; write(fd, tosend, 2); char namelen; read(fd, &namelen, 1); char name[256]; read(fd, name, 1); read(fd, namelen, 1); printf("We got %s, with capabilities %x\n", name, namelen);