服务端:

#include 
#include 
#include 
#pragma comment(lib,"ws2_32.lib")
#include 


SOCKET sckt;	
struct sockaddr_in scktinf;

//SOCKET clnt;
	
struct clntStrc
{
	
	int nmr;
	char nm[0x20];
	SOCKET sckt;

}clntAr[100];	

int flg;

int rmSnd();
int rmRcv(struct clntStrc *);
int rmLstn();

char *IMPSTNMR="_IMPSTNMR@%d";

int c;





int rmRcv(struct clntStrc *clnt)
{

	char strg[0x1000],strg2[0x1000];
	
	int f;
	
	//pthread_t thrSnd;
	//pthread_create(&thrRcv,NULL,rmSnd,sckt);
	
	
	int t;
	int n;
	
	
	
	while (1)
	{
		
		f=recv(clnt->sckt,strg,0x100,0);
		//printf("%s\n",strg);
		
		if (f<0) break;
		
		switch(strg[0])
		{
			case '&':
			{
				t=strtol(strg+1,NULL,10);
				sprintf(strg2,"*%d%s\n",clnt->nmr,strchr(strg,'@'));
				send(clntAr[t].sckt,strg2,strlen(strg),0); 
			
				break;
			}
			default:
			{
				printf("CLIENT#%d:%s\n",clnt->nmr,strg);
				strcpy(strg,"");
			}
				
		}
		
						

		//clnt=accept(sckt,NULL,NULL);
		//flg=1;
		
		/*
		f=-1;
		
		if (recv(clnt->sckt,strg,0x100,0)>=0)
		{
			printf("CLIENT#%d:%s\n",clnt->nmr,strg);
			strcpy(strg,"");				
		}
		*/
	}
	
}

int rmSnd()
{
	
	char strg[0x1000],strg2[0x1000];
	
	
	int n;
	
	while (1)
	{

		gets(strg);
		
		
		switch (strg[0])
		{
			case '&':
			{
				n=strtol(strg+1,NULL,10);
				
				strcpy(strg2,strchr(strg,'@'));
				
				//printf("ECHO:%s\n",strg2);
				
				send(clntAr[n].sckt,strg2,strlen(strg2),0);	
			}
			case '_':
			{
				
			}
		}
		//sprintf(strg,"%d@%s",n,strg2);
		
		//if (send(sckt,strg,strlen(strg),0)>=0)
		//{
		//	flg=1;
		//}
		 
	}
}

int rmLstn()
{
	SOCKET clnt,tclnt;
	
	c=0;
	
	char strg[0x1000];
	
	char tNmr[0x10];
	
	int f;
	
	pthread_t thrRcv,thrSnd;
	
	pthread_create(&thrSnd,NULL,rmSnd,NULL);
	
	SOCKET *tClnt;
	
	int tLen=sizeof(scktinf);
	
	char msgNmr[0x1000];
	
	
	while (1)
	{
		c+=1;
		
		clntAr[c].sckt=accept(sckt,&scktinf,&tLen);
		
		clntAr[c].nmr=c;
		
		//memcpy()
		
		//tClnt=malloc(sizeof(SOCKET));
		//memcpy(tClnt,&clnt,sizeof(SOCKET));
		
		pthread_create(&thrRcv,NULL,rmRcv,clntAr+c);
		
		sprintf(msgNmr,IMPSTNMR,c);
		
		send(clntAr[c].sckt,msgNmr,strlen(msgNmr),0);
		
		
		/*
		if (clnt>=0)
		{
			//printf("LEGATO#%d\n",clnt&0xFF);
			
			//printf("LEGATO\n");
			
			//c++;
			
			//itoa(c,tNmr,10);
			
			//while (send(clnt,tNmr,strlen(tNmr),0)<0);
			//f=recv(clnt,strg,0x1000,0);
			
			
			//pthread_create(&thrSnd,NULL,rmSnd,clnt);			
		}
		*/
	}
 } 
 
int main() 
{
	
	WSADATA WSD;	
	WSAStartup(MAKEWORD(2,2),&WSD);
	
	char adrs[0x20];
	
	scanf("%s",adrs);
	while (adrs[strlen(adrs)-1]=='\r' || adrs[strlen(adrs)-1]=='\n') 
	{
		adrs[strlen(adrs)-1]='\0';
	}
	
	scktinf.sin_addr.s_addr=inet_addr(adrs);
	scktinf.sin_port=htons(2070);
	scktinf.sin_family=2;
	 
	sckt=socket(2,1,0);
	
	bind(sckt,&scktinf,sizeof(scktinf));
	
	listen(sckt,10);
	
	flg=0;
	
	pthread_t thrdLstn;
	pthread_create(&thrdLstn,NULL,rmLstn,NULL);
	
	pthread_join(thrdLstn,NULL);
	
	//pthread_t thrdRcv,thrdSnd;
	
	//pthread_create(&thrdRcv,NULL,rmRcv,NULL);
	
	//pthread_create(&thrdSnd,NULL,rmSnd,NULL); 
	
	//pthread_join(thrdRcv,NULL);
	
	//pthread_join(thrdSnd,NULL);
	
}

客户端:

#include 
#include 
#include 
#include  
#pragma comment(lib,"ws2_32.lib")
#include 

SOCKET sckt;

struct sockaddr_in scktinf;

int flg;

int n;

int i;

int rmRcv();
int rmSnd();
int rmLg();
int rmAnlz(char *);

char *IMPSTNMR="_IMPSTNMR@";
char *CNTNT="@";


int rmAnlz(char *strg)
{
	
	int t;
	
	//printf("%s\n",strg);
	
	switch(strg[0])
	{
		case '@':
		{
			
			printf("SERVER%s\n",strg);
			return 3;
			break;
		}

	
		case '_':
		{
			
			if (strstr(strg,"_IMPSTNMR@")!=NULL)
			{
				//i=
				printf("SERVER_NMR@%s\n",strg+10);
				i=strtol(strg+9,NULL,10);
			}
			
			//i=
			return 0;
			break;		
		}
		
		case '*':
		{
			t=strtol(strg+1,NULL,10);
			printf("*%d@%s\n",t,strchr(strg,'@')+1);
			return 3;
			break;
		}

		default:
			return -1;
	}
}

int rmRcv()
{
	char *strg;
	
	pthread_t *pThrdAnlz;
	
	
	while (1)
	{
		
		strg=malloc(0x1000);
		
		memset(strg,0,0x1000);
		
		while (flg==1 && recv(sckt,strg,0x1000,0)>=0)
		{
			//printf("SERVER:%s\n",strg);
			pthread_create(NULL,NULL,rmAnlz,strg);
			//
			
		}
	}
}

int rmSnd()
{
	
	char strg[0x1000],strg2[0x1000];
	
	
	int n;
	
	while (1)
	{

		gets(strg);
		
		
		
		//sprintf(strg,"%d@%s",n,strg2);
		
		send(sckt,strg,strlen(strg),0); 
		 
	}
}

int rmLg()
{
	while (connect(sckt,&scktinf,sizeof(scktinf))<0);
	//printf("CONNECTED\n");
	flg=1;
	
	//char tNmr[0x10];
	//recv(sckt,tNmr,0x10,0);
	
	//printf("SISTEMA@%s\n",tNmr);
	
	//n=atoi(tNmr);
	
	pthread_t thrdSnd,thrdRcv;
	pthread_create(&thrdSnd,NULL,rmSnd,NULL);
	pthread_create(&thrdRcv,NULL,rmRcv,NULL);
	
	
	pthread_join(thrdSnd,NULL);
	pthread_join(thrdRcv,NULL);
	//pthread_create(&thrdRcv,NULL,rmRcv,NULL);
}

int main() 
{
	
	WSADATA WSD;	
	WSAStartup(MAKEWORD(2,2),&WSD);
	
	char adrs[0x20];
	
	
	//scanf("DIGITAL ");
	scanf("%s",adrs); 
	while (adrs[strlen(adrs)-1]=='\r' || adrs[strlen(adrs)-1]=='\n') 
	{
		adrs[strlen(adrs)-1]='\0';
	}
	

	
	scktinf.sin_addr.s_addr=inet_addr(adrs);
	scktinf.sin_port=htons(2070);
	scktinf.sin_family=2;
	 
	sckt=socket(2,1,0);
	
	pthread_t thrdLg;
	
	pthread_create(&thrdLg,NULL,rmLg,NULL);
	
	pthread_join(thrdLg,NULL);
	//pthread_t thrdRcv,thrdSnd;
	
	//pthread_create(&thrdRcv,NULL,rmRcv,NULL);
	
	//pthread_create(&thrdSnd,NULL,rmSnd,NULL);
	
	//pthread_join(thrdRcv,NULL);
	
	//pthread_join(thrdSnd,NULL);

	
}