<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;
}
#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