win+linux+socket多线程搜索服务器端文件

<p>本人正在学习socket网络编程,同时又在看多线程的编程,所以就写一段C/S通信程序。为后面从客户端发命令搜索服务器端文件并回显结果做准备。</p><p>
</p><p>一.服务器端程序(VC6.0 C程序)</p>
// TCP_Service 

#include <winsock2.h>
#include <stdio.h>
#include <windows.h>
#include <winbase.h>

// WS2_32 lib connect
#pragma comment(lib,"WS2_32.lib")
#define SENDEND "SendEnd!"

DWORD WINAPI Service_Recv_Thread(LPVOID lparam) 
{     UINT32 i=0;
	char recbuffer[256],SendEnd[256]=SENDEND;
	SOCKET ClientSocket=(SOCKET)(LPVOID)lparam; 
	while(1)
		{			
		   ::recv(ClientSocket,recbuffer,sizeof(recbuffer),0);	
			
		  //Console Input Filtering the Socket LineFeed   ASCII "10"
			if(recbuffer[strlen(recbuffer)-1]==10)
				recbuffer[strlen(recbuffer)-1]=0;
		 //end	
		   if(strcmp(recbuffer,SendEnd)== 0)
		   	{
		   	memset(recbuffer,0,sizeof(recbuffer));	   	
		   	 printf("\r\n ----->>Receive End!\n");
		   	 break;
		   	}
		   
			if(recbuffer !=NULL)
				printf(" ClientSocket=%d:recv data:%s\n",ClientSocket,recbuffer);
			memset(recbuffer,0,sizeof(recbuffer));

		}
	return 0;
         
} 

DWORD WINAPI Service_Send_Thread(LPVOID lparam)
{
	int i=0;
	char Sendbuffer[]="Function:TCP\ /IP Multithreading Remote File Search!",SendEnd[]=SENDEND;
	  
	  SOCKET ClientSocket=(SOCKET)(LPVOID)lparam; 
	  while(1)
	  	{
	  	         if(Sendbuffer!=NULL)
	  	         	{
			  ::send(ClientSocket,Sendbuffer,strlen(Sendbuffer),0); 	  
			   printf(" ClientSocket=%d:send data:%s\n",ClientSocket,Sendbuffer);
			   Sleep(1000);
			   memset(Sendbuffer,0,sizeof(Sendbuffer));
		  	   printf("\r\n-->Please Input:\n");
	  	         	}
			   gets(Sendbuffer);
			   
	  	}
	return 0;
	
}

int main(int argc,char* argv[])
{
	DWORD dwThreadId; 
	HANDLE hThread[2]; 

	//init WS2_32.DLL
	WSADATA wsaData;
	WORD sockVersion=MAKEWORD(2,0);
	::WSAStartup(sockVersion,&wsaData);

	SOCKET s=::socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
	if(s==INVALID_SOCKET)
	{
		printf("\r\nFaild sockedt() \n");
		::WSACleanup();
		return 0;
	}

	sockaddr_in sin;
	sin.sin_family =AF_INET;
	sin.sin_port=htons(8888);
	sin.sin_addr.S_un.S_addr=INADDR_ANY;
	if(::bind(s,(LPSOCKADDR)&sin,sizeof(sin)) == SOCKET_ERROR)
	{
		printf("\r\n Failed bind() \n");
		::WSACleanup();
		return 0;
	}

	if(::listen(s,2) == SOCKET_ERROR)
	{
		printf("\r\n Failed listen() \n");
		::WSACleanup();
		return 0;
	}

	sockaddr_in remoteAddr;
	int nAddrLen=sizeof(remoteAddr);

	SOCKET client;
	char szText[]="TCP Service recv data!!";
	while(TRUE)
	{  
		printf("wait Client  connet...\n");
		client=::accept(s,(SOCKADDR*)&remoteAddr,&nAddrLen);
		if(client == INVALID_SOCKET)
		{
			printf("\r\n Failed accept() \n");
			continue;
		}
		printf("client=%d Wait connet...\n",client);
                         
          hThread[0]=CreateThread(NULL,NULL,Service_Recv_Thread,(LPVOID)client,0,&dwThreadId); 
          hThread[1]=CreateThread(NULL,NULL,Service_Send_Thread,(LPVOID)client,0,&dwThreadId); 
		  
	 //  printf("\r\n client=%d,dwThreadId=%d \n",client,dwThreadId);
         
	}
	 CloseHandle(hThread);
	::closesocket(client);	 
	::closesocket(s);
	::WSACleanup();
	return 0;
}


二.客户是linux程序

   

#include <stdio.h>   
#include <pthread.h> // pthread_create
#include <stdlib.h>   
#include <unistd.h>   
#include <sys/types.h>   
#include <sys/socket.h>   
#include <netinet/in.h>   
#include <arpa/inet.h>   
#include <string.h>   
  
#define SIZE 256   
#define PORT 8888   
#define ReceiveDataEnd    "SendEnd!"

void * Client_Receive_Data_Thread(void *lparam)
{// 线程函数
     int i,Client_socketfd;   
     char buffer[SIZE],SendEnd[256]=ReceiveDataEnd;	 
    Client_socketfd=(int)lparam; 
    while(1)
    	{
    	   read(Client_socketfd,buffer,sizeof(buffer));// Receive Service Data
    	   
	  //Console Input Filtering the Socket LineFeed   ASCII "10"
		if(buffer[strlen(buffer)-1]==10)
			buffer[strlen(buffer)-1]=0;
	 //end	    	   
	   if(strcmp(buffer,SendEnd)== 0)
	   	{
	   	memset(buffer,0,sizeof(buffer));	   	
	   	 printf("\r\n ----->>Receive End!\n");
	   	 break;
	   	}
	       if(buffer != NULL)
		   	printf("\r\nReceiving:\n -->[%s]\n",buffer);	   
	   	memset(buffer,0,sizeof(buffer));		
    	}

 return 0;
}

void * Client_Send_Data_Thread(void *lparam)
{// 线程函数
     int Client_socketfd,i=0;   
     char buffer[SIZE]="This is Client!";	 
    Client_socketfd=(int)lparam; 
    while(1)
    	{
    	 printf("\r\n Please input:\n");
    	  fgets(buffer,SIZE,stdin);  		 	
	   if(buffer != NULL)	  
	   	{
   	  write(Client_socketfd,buffer,sizeof(buffer));//把数据传给服务器  
  	  printf("Send-->%s \n",buffer);    
	   memset(buffer,0,sizeof(buffer));	  
	  usleep( 1000);	  
	   	}
    	}

 return 0;
}


int main()  
{  
   pthread_t id[2];
    int socketfd;  
    int ret;  
    struct sockaddr_in address;  
  
    socketfd = socket(AF_INET, SOCK_STREAM, 0);//创建一个套接字   
  
    address.sin_family = AF_INET;//设置为因特网协议   
    address.sin_port = htons(PORT);//设置端口号   
    inet_pton(AF_INET, "172.168.0.35", &address.sin_addr.s_addr);//设置ip地址   

	printf("\r\n connect Service...\n");
	ret = connect(socketfd, (struct sockaddr*) &address, sizeof(address));//连接服务器     
	if (ret == -1)  
	{  
	printf("can't connect!\n");  
	exit(0);  
	}  
	   
	   //Receive
	ret = pthread_create(&id[0], NULL, Client_Receive_Data_Thread, (void *)socketfd);// 创建一个线程
	if( ret != 0)
	{
	printf( "Create pthread error!\n");
	exit( 1);
	}
	
	//Send
	ret = pthread_create(&id[1], NULL, Client_Send_Data_Thread, (void *)socketfd);// 创建一个线程
	if( ret != 0)
	{
	printf( "Create pthread error!\n");
	exit( 1);
	}

	 pthread_join( id[0], NULL); // 等待tid为id的线程退出执行
	 pthread_join( id[1], NULL); // 等待tid为id的线程退出执行
	 
    close(socketfd);//关闭套接字   
  
    return 0;  
}  

Makefile:

    

all:TCP_Client
.PHONY : all

TCP_Client:TCP_Client.c
	@cc TCP_Client.c -lpthread -o TCP_Client

.PHONY:clean	
clean:
	@rm TCP_Client	




  

   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值