Linux TCP/IP通訊建立

原文鏈接:http://blog.csdn.net/itisyang/article/details/48209223


服務器建立:

採用了多線程方式,可連接多個客戶端,每連接一個客戶端就創建一個輸入線程和一個接受線程,使得輸入和接收互不干擾

#include<arpa/inet.h>
#include<stdio.h>
#include<stdlib.h>
#include<sys/socket.h>
#include<unistd.h>
#include<netinet/in.h>
#include<string.h>
#include<pthread.h>
#include<fcntl.h>
#include"wrap.h"

char buff[BUFSIZ];

void* thread_fun(void* arg)
{
	if(pthread_detach(pthread_self())){
		printf("thread detach fail\n");
	}
	int len;
	while(1){	
		bzero(buff,BUFSIZ);
	        len = Read((int)arg,buff,BUFSIZ);
		if(len<=0){
			printf("connect lost\n");
			close((int)arg);
			return (void*) 1;
		}		
		printf("%s\n",buff);
	}
	return (void*) 0;
}

void* thread_fun2(void* arg)
{
	char main_buff[BUFSIZ];	
	int len;
	if(pthread_detach(pthread_self())){
		printf("thread detach fail\n");
	}
	while(1){
		bzero(main_buff,BUFSIZ);			
		len = read(STDIN_FILENO,main_buff,BUFSIZ);
		Write((int)arg,main_buff,len);
	}
	return (void*)0;
}
int main()
{
	pthread_t id1,id2;

	struct sockaddr_in servaddr,clientaddr;
	socklen_t addlen;
	int clifd;
	int err;

//creat tcp option	
	int sockfd = socket(AF_INET,SOCK_STREAM,0);
	if(sockfd == -1){
		perror("socket");
		return 1;
	}
//	int opt = 1;
	int opt = SO_REUSEADDR;
	setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));
//initialization of socket()
	memset(&servaddr,0,sizeof(struct sockaddr_in));
	//bzero(&servaddr,sizeof(sockaddr_in));
	servaddr.sin_family = AF_INET;
	servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
	servaddr.sin_port = htons(8080);
	addlen = sizeof(struct sockaddr_in);

	Bind(sockfd,(struct sockaddr*)&servaddr,sizeof(servaddr));
	
	while(1){
	        Listen(sockfd,10);
		clifd = Accept(sockfd,(struct sockaddr*)&clientaddr,&addlen);	
		
		printf("new client,ip:%s,%d\n",inet_ntoa(clientaddr.sin_addr),ntohs(clientaddr.sin_port));
		if(clifd>=0){	
			pthread_create(&id1,NULL,thread_fun,(void*)clifd);
			pthread_create(&id2,NULL,thread_fun2,(void*)clifd);
		}	
	}
	psuse();
	close(clifd);
	close(sockfd);
	return 0;
}



客戶端建立:

類似服務器

#include<arpa/inet.h>
#include<stdio.h>
#include<stdlib.h>
#include<sys/socket.h>
#include<unistd.h>
#include<netinet/in.h>
#include<string.h>
#include<pthread.h>
#include<fcntl.h>
#include"wrap.h"

void* fun1(void *arg)
{
	char buff[BUFSIZ];
	while(1){
		memset(buff,0,BUFSIZ);
		int err = read((int)arg,buff,BUFSIZ);
		if(err<0)	
			printf("read error\n");
		printf("%s",buff);
	}
}

void* fun2(void* arg)
{
	char buff[BUFSIZ];
	while(1){
		memset(buff,0,BUFSIZ);
		read(STDIN_FILENO,buff,BUFSIZ);
		write((int)arg,buff,strlen(buff));
	}

}



int main(int arg,char *argv[])
{
	pthread_t id1,id2;
	struct sockaddr_in sock;
	int clifd;
	int err;

//creat tcp option	
	int sockfd = socket(AF_INET,SOCK_STREAM,0);
	if(sockfd == -1){
		perror("socket");
		return 1;
	}
//initialization of socket()
	memset(&sock,0,sizeof(struct sockaddr_in));
	sock.sin_family = AF_INET;
	sock.sin_addr.s_addr = inet_addr(argv[1]);
	sock.sin_port = htons(8080);
	err = connect(sockfd,(struct sockaddr*)&sock,sizeof(sock));
	if(err == -1){
		perror("connect");
		return -1;
	}
	pthread_create(&id1,NULL,fun1,(void *)sockfd);
	pthread_create(&id2,NULL,fun2,(void *)sockfd);
		
	pause();
	close(sockfd);
	return 0;

}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章