TCP的服务器与客户端

 server.c

socket:建立套接字   bind:绑定  listen:监听  accept:接受网络请求

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <pthread.h>
#include <string.h>


#define PORT 8000


void *ClientHandler(void *arg)
{
	pthread_detach(pthread_self());   //线程分离,线程结束自动释放
	
	int ret;
	int fd=*(int *)arg;
	char buf[32]={0};
	ret=recv(fd, buf, sizeof(buf),0);
	if(-1==ret)
	{
		perror("recv");
	}	
	
	printf("recv from %d client %s!\n",fd,buf);
	memset(buf, 0 ,sizeof(buf));
}

int main()
{
	int sockfd,ret;
	struct sockaddr_in server_addr;
	struct sockaddr_in client_addr;
	
	int fd[1000]={0},i=0;
	pthread_t tid;
	
	
	//创建一个sockfd
	sockfd = socket(AF_INET,SOCK_STREAM,0);
	if(-1==sockfd)
	{
		perror("socket");          //如果创建失败
		exit(1);
	}
	
	int length=sizeof(server_addr);
	server_addr.sin_family=AF_INET;
	server_addr.sin_port=PORT;   //端口号必须是网络字节序,有时需要大小端转换
	server_addr.sin_addr.s_addr=inet_addr("192.168.1.10");  
   
    //进行绑定	
	ret=bind(sockfd, (struct sockaddr *)&server_addr, length); 
	if(-1==ret)
	{
		perror("bind");             //如果绑定失败
		exit(2);
	}
		
	/**********定义服务器的最大可连接数目*******/
	ret=listen(sockfd,5);
	if(-1==ret)                 //5为等待的数目
	{
		perror("listen");       //监听套接字
		exit(3);
	}
	
	length=sizeof(client_addr);
	while(1)
	{
		memset(&client_addr,0,sizeof(client_addr));
		fd[i]=accept(sockfd, (struct sockaddr *)&client_addr, &length);
		if(-1==fd[i])
		{
			perror("accept");
			exit(4);
		}
		
		printf("accept port %d fd %d!\n",&client_addr.sin_port,fd);
		ret=pthread_create(&tid, NULL,ClientHandler,&fd[i]);
		if(ret!=0)
		{
			perror("pthread_create");
		}		
	}
	return 0;	
}

client.c

socket:建立套接字   connect:链接  

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <string.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <pthread.h>

#define PORT 8000

int main()
{
	int sockfd,ret;
	struct sockaddr_in server_addr;
	char buf[32]={0};
	
	sockfd = socket(AF_INET,SOCK_STREAM,0);
	if(-1==sockfd)
	{
		perror("socket");          //如果创建失败
		exit(1);
	}
	
	int length=sizeof(server_addr);
	server_addr.sin_family=AF_INET;
	server_addr.sin_port=PORT;   //端口号必须是网络字节序    有时需要大小端转换
	server_addr.sin_addr.s_addr=inet_addr("192.168.1.10");        
	ret=connect(sockfd, (struct sockaddr *)&server_addr, length);
	if(-1==ret)
	{
		perror("connect");             //如果绑定失败
		exit(1);
	}
	while(1)
	{
		scanf("%s",buf);
		ret=send(sockfd, buf, strlen(buf), 0);
		if(-1==ret)
		{
			perror("send");
		}
		memset(buf, 0 ,sizeof(buf));
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/zys15195875600/article/details/81460398