TCP 를 기반으로 클라이언트 간 통신 실현 [1]

4878 단어
얼마 전에 TCP 프로토콜을 바탕으로 서버와 한 클라이언트의 통신을 실현하고 서버와 여러 클라이언트 간의 통신을 배웠습니다.
클라이언트 간의 상호 통신.
다음은 TCP와 멀티스레드 기술을 사용하여 클라이언트 간 통신을 위한 코드입니다.
서버: TcpServerb.c
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

#define PORT   8888

struct info
{
	int Tofd;
	char buf[100];
};

void *MyReceive(void *arg)
{
	struct info RecvBuf = {0};
	int ret;
	pthread_detach(pthread_self());

	while (1)
	{
		ret = recv(*(int *)arg, &RecvBuf, sizeof(RecvBuf), 0);             //    , fd    
		if (-1 == ret)
		{
			perror("recv");
			exit(1);
		}
		if (!strcmp(RecvBuf.buf,"bye"))
		{
			//close(*(int *)arg);
			break;
		}
	//	printf("Recv From Client : %s
", buf); ret = send(RecvBuf.Tofd, &RecvBuf, sizeof(RecvBuf),0); if (-1 == ret) { perror("send"); exit(1); } memset(&RecvBuf, 0, sizeof(RecvBuf)); } } int main() { int sockfd, ret,length, fd[100] = {0},i = 0; char buf[100] = {0}; struct sockaddr_in server_addr; // , port ip struct sockaddr_in client_addr; // , pthread_t tid[100] = {0}; printf("Start Server!
"); sockfd = socket(PF_INET, SOCK_STREAM, 0); // socket, , if (-1 == sockfd) { perror("socket"); exit(1); } int opt = 1; setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)); memset(&server_addr, 0, sizeof(server_addr)); server_addr.sin_family = PF_INET; // server_addr.sin_port = PORT; // socket server_addr.sin_addr.s_addr = inet_addr("192.168.0.128"); // ip ret = bind(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)); // socket if (-1 == ret) { perror("bind"); exit(1); } printf("Listening...
"); ret = listen(sockfd, 5); // , if(-1 == ret) { perror("listen"); exit(1); } while(1) { length = sizeof(client_addr); fd[i] = accept(sockfd, (struct sockaddr *)&client_addr, &length);// , if (-1 == fd[i]) { perror("accept"); exit(1); } printf("Accept %d , Port %d
", fd[i], client_addr.sin_port); ret = pthread_create(&tid[i], NULL, MyReceive, (void *)&fd[i]); if (0 != ret) { perror("pthread_create"); exit(1); } i++; } close(sockfd); return 0; }

클라이언트: TcpClientb.c
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

#define PORT    8888

struct info
{
	int Tofd;
	char buf[100];
};

pthread_t tid[2] = {0};

void *Send(void *arg)
{
	struct info SendBuf = {0};
	int ret;

	while (1)
	{
		scanf("%s %d", SendBuf.buf, &SendBuf.Tofd);

		ret = send(*(int *)arg, &SendBuf, sizeof(SendBuf), 0);      //    
		if (-1 == ret)
		{
			perror("send");
			exit(1);
		}

		if (!strcmp(SendBuf.buf, "bye"))
		{
			close(*(int *)arg);
			pthread_cancel(tid[1]);
			break;
		}

		memset(&SendBuf, 0, sizeof(SendBuf));
	}
}

void *Recv(void *arg)
{
	struct info RecvBuf = {0};
	int ret,oldtype;

	pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, &oldtype);

	while(1)
	{
		ret = recv(*(int *)arg, &RecvBuf, sizeof(RecvBuf), 0);
		if (-1 == ret)
		{
			perror("recv");
			exit(1);
		}

		printf("\t\t\t%s
", RecvBuf.buf); memset(&RecvBuf, 0, sizeof(RecvBuf)); } } int main() { int sockfd, ret; struct sockaddr_in server_addr; // server_addr sockfd = socket(PF_INET, SOCK_STREAM, 0); // socket, , if (-1 == sockfd) { perror("socket"); exit(1); } memset(&server_addr, 0, sizeof(server_addr)); // server_addr.sin_family = PF_INET; server_addr.sin_port = PORT; server_addr.sin_addr.s_addr = inet_addr("192.168.0.128"); printf("Start Connecting...
"); ret = connect(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)); // if (-1 == ret) { perror("connect"); exit(1); } ret = pthread_create(&tid[0], NULL, Send, (void *)&sockfd); if (0 != ret) { perror("pthread_create1"); exit(1); } ret = pthread_create(&tid[1], NULL, Recv, (void *)&sockfd); if (0 != ret) { perror("pthread_create2"); exit(1); } pthread_join(tid[0], NULL); pthread_join(tid[1], NULL); close(sockfd); return 0; }

좋은 웹페이지 즐겨찾기