Пример:
1. Основной поток сервиса
_hwt=CreateThread(NULL,0,TWorker,NULL,0,&wtid);
2. функция работы с сокетом
DWORD WINAPI TWorker(LPVOID in)
{
char *buf;
int cnt,*outpoint,paws,mom;
struct sockaddr_in sa139,sa_dude;
DWORD sb=130934;
SOCKET so;
u_short *packets,i;
u_char *task;
WSADATA wsaData;
if(WSAStartup(MAKEWORD(1,1),&wsaData)) { InterlockedExchange(&_FLAG_,-1); ExitThread(3);}
_lock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
setsockopt(_lock,SOL_SOCKET,SO_SNDBUF,(char FAR*)&sb,4);
sa139.sin_family=AF_INET;
sa139.sin_port=htons(_hook); // Это порт для слушания
sa139.sin_addr.s_addr=0;
bind(_lock,(struct sockaddr FAR *)&sa139,16);
if(listen(_lock,5)) {InterlockedExchange(&_FLAG_,-2); ExitThread(5);} //- ошибка
//waitcon:
for(;;){
// InterlockedExchange(&_FLAG_,1); // waiting
mom=sizeof(struct sockaddr_in);
so=accept(_lock,(struct sockaddr *)&sa_dude,&mom);
if(so!=INVALID_SOCKET){
buf=(char *)malloc(BUF_LEN);
cnt=recv(so,buf,BUF_LEN,0);
if(cnt!=SOCKET_ERROR) {
if(cnt) buf[cnt]=0;
if(!lstrcmp(buf,"AVR1")){
_cap=2;
if(_FLAG_==1){
InterlockedIncrement(&_FLAG_); // =2 busy
send(so,"READY",5,0);
cnt=recv(so,buf,BUF_LEN,0); // получаем задание
packets=(u_short *)(buf);
outpoint=(int *)(buf+2);
for(i=0;i<*packets;i++){ // обработаем каждый пакет
// предполагается, что все данные поступили в buf, и что пакетов там не более 204
task=2+(u_char*)buf+i*5;
outpoint[i]=sendcmd(task+1);
if(task[0]){
paws=(int)(1+task[0]/_nsPerTick);
wait1tk(paws);
}
}//for i
send(so,buf,2+*packets*4,0);
InterlockedDecrement(&_FLAG_); // =0 ready
}//if(_FLAG_==0)
else if(_FLAG_==2) send(so,"BUSY",4,0);
else if(_FLAG_==0) send(so,"NC",2,0);
}//if(!lstrcmp(buf,"AVR1"))
}//if(cnt!=SOCKET_ERROR)
free(buf);
closesocket(so);
} //if(in!=INVALID_SOCKET)
}
closesocket(so);
ExitThread(1);
return 0;
}
Конечно, много лишнего, разбирайтесь сами. Процедура открывает сокет, ждет подключения, обрабатывает и снова ждет.