linux socket编程的问题
linux   socket编程,怎样才能实现一个基本的聊天程序,可以聊天   ,也可以发文件?希望达人指导~最好能贴出源码~
------解决方案--------------------这东东可大可小,你把要求说详细点。
------解决方案--------------------这是UDP传文件的一个sever端的程序:仅供参考: 
 如果改成Linux下,只需要改其中的一小部分就可以了。。。就是初始化那一些。。。   
 /****************************************************************** 
 *FILENAME:		 sever.cpp 
 *DESCRIPTION:	 本文件用来接收一个UDP传输来的文件 , 并且可以保证可靠 
 				 性传输. 
 *AUTHOR:		 roading 
 *DATE:			 2007-4-12 
 *****************************************************************/ 
 #include  <stdio.h>  
 #include  <winsock2.h>  
 #include  <string.h>  
 #include  <winbase.h>  
 #include  <process.h>  
 #include  <time.h>  
 #include  <conio.h>    
 #define BUFLEN	20460	//除去五个标志位和一个结束符,其它的都可以用来传输数据 
 #define ADDR	 "192.168.6.106 " 
 #define SRVPORT	8026	//服务器端口号 
 #define CILPORT 8025	//客户端端口号 
 #define FILE_SEND_END 633   
 #define SENDLEN 6		//发送数据长度 
 #define PIONIT_NULL 100  //错误号,指针为空 
 #define SENDNUM 500 //最多重发的次数   
 time_t BeginTime, EndTime, UsrTime;   
 int GetID(char *);  //获得报文的ID号 
 void SetID(char *,int); //设定报文的ID号   
 int main() 
 {   
 	int Timer2 = SENDNUM; 
 	WSAData wsadata; 
 	FILE *frecv; 
 	sockaddr_in clientaddr, srvaddr; 
 	SOCKET s; 
 	int nRc, clientlen = sizeof(clientaddr), Serial = 0 ,ACKnum = 0;  
 	char RecvBuf[BUFLEN] = {0} ,SendBuf[SENDLEN];  	   
 	//初始化winsocket 
 	nRc = WSAStartup(MAKEWORD(2, 2), &wsadata); 
 	if(nRc) 
 	{ 
 			printf( "error in init the winsock \n "); 
 			return ERROR_NO_NETWORK; 
 	} 
 	printf( "winsock initialized!\n ");   
 	//创建udp socket 
 	s = socket(AF_INET, SOCK_DGRAM, 0); 
 	if (s  ==  INVALID_SOCKET) 
 	{ 
 		printf( "socket create error!\n "); 
 		WSACleanup(); 
 		return ERROR_NO_NETWORK; 
 	} 
 	printf( "socket created sucess!\n ");   
 	//绑定一个本地端口 
 	srvaddr.sin_family = AF_INET; 
 	srvaddr.sin_port = htons(SRVPORT);	 
 	srvaddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY); 
 	nRc = bind(s, (LPSOCKADDR)&srvaddr, sizeof(srvaddr));     
 	if (nRc  ==  SOCKET_ERROR) 
 	{ 
 		printf( "port bind error !\n "); 
 		closesocket(s); 
 		WSACleanup(); 
 		return ERROR_NO_NETWORK; 
 	} 
 	printf( "port bind ok !\n ");    	 
 	clientaddr.sin_family = AF_INET; 
 	clientaddr.sin_port = htons(CILPORT); 
 	clientaddr.sin_addr.S_un.S_addr = inet_addr(ADDR);   
 	frecv = fopen( "recv ",  "wb "); 
 	if (frecv == NULL) 
 	{ 
 		printf( " file open error !\n ");  
 	}   
 	unsigned long K = 1; 
 	SetID(SendBuf, ACKnum); 
 	time(&BeginTime); 
 	printf( "请确认客户端是开放的, 按任意键开始传输\n ");  
 	getch(); 
 	printf( "文件传输开始,开始时间:%s\n ", ctime(&BeginTime));  
 	//向服务器端发送数据 
 	while (1) 
 	{  		 
 		//清空缓冲区 
 		memset(RecvBuf, '\0 ',BUFLEN);  		 
 		//设置非阻塞模式 
 		ioctlsocket(s,FIONBIO,&K);  		  		 
 		nRc = recvfrom(s, RecvBuf, BUFLEN, 0, (SOCKADDR *)&clientaddr, &clientlen);   
 		//判断是否已经重传到最大次数 
 		if (Timer2 == 0) 
 		{ 
 			printf( "文件传输失败,网络断开或者对方终止传输 \n "); 
 			return ERROR_NETWORK_UNREACHABLE; 
 		}  		 
 		//判断是否接收成功 
 		if (RecvBuf[0] !=  '\0 ') 
 		{ 
 			Timer2 = SENDNUM;   			 
 			Serial = GetID(RecvBuf); 
 			//如果接收的不是ACKnum,重发 
 			if