linux-网络编程-实验-基于C语言

要求:使用多进程的方法编写程序实现基于TCP的聊天通讯软件和基于UDP的聊天通讯软件。

TCP 实现

tcp server 代码:

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

void *recv_message(void* plt){
	char buf[128] = {0};
	while(1)
	{
		bzero(buf,sizeof(buf));
		recv(*(int *)plt ,buf,sizeof(buf) - 1,0);
		if (strcmp(buf, "") == 0){
			continue;
		}
		printf("recv: %s",buf);
	}
}


int main( int argc, char **argv )
{
	pthread_t thread1;
	
	
	int sid = socket(AF_INET,SOCK_STREAM,0);
	struct sockaddr_in addr = {0};
	addr.sin_family = AF_INET;
	addr.sin_port = htons(8080);
	
	addr.sin_addr.s_addr = inet_addr("127.0.0.1");
	int res = bind(sid,(struct sockaddr *)&addr,sizeof(struct sockaddr));

	
	printf("bind res = %d\n",res);
	listen(sid,10);
	
	char buf[128] = {0};
	int len,cid;
	
	printf("input q to exit \n");	
	
	while(1)
	{
		cid = accept(sid,NULL,NULL);
		pthread_create(&thread1, NULL, &recv_message, &cid);
		bzero(buf,sizeof(buf));
		while(strcmp(buf,"q\n") != 0)
		{
			bzero(buf,sizeof(buf));
			fgets(buf,sizeof(buf),stdin);
			send(cid,buf,strlen(buf),0);

		}
		close(cid);
	}
	close(sid);	
        return 0;
}

tcp client代码:

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

void *recv_message(void* plt){
	char buf[128] = {0};
	while(1)
	{
		bzero(buf,sizeof(buf));
		recv(*(int *)plt ,buf,sizeof(buf) - 1,0);
		if (strcmp(buf, "") == 0){
			continue;
		}
		printf("recv: %s",buf);
	}
}

int main(int argc,char **argv)
{
	pthread_t thread1;

	int cid = socket(AF_INET,SOCK_STREAM,0);
	struct sockaddr_in saddr = {0};
	saddr.sin_family = AF_INET;
	saddr.sin_port = htons(8080);
	saddr.sin_addr.s_addr = inet_addr("127.0.0.1");

	int res = connect(cid,(struct sockaddr *)&saddr,sizeof(struct sockaddr));
	printf("connect res = %d\n",res);
	
	pthread_create(&thread1, NULL, &recv_message, &cid);
	char buf[128] = {0};
	int len;
	while(strcmp(buf,"q\n") != 0)
	{
		bzero(buf,sizeof(buf));
		fgets(buf,sizeof(buf),stdin);
		send(cid,buf,strlen(buf),0);
	}
	close(cid);
        return 0;
}

实验结果

UDP 实现

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

struct Pack{
	int cid;
	struct sockaddr_in addr; 
} pack;

void *recv_message(void* plt){
	struct Pack p = *(struct Pack*) plt;
	int size = sizeof(struct sockaddr);
	char buf[128] = {0};
	while(1)
	{
		memset(buf,0,sizeof(buf)/sizeof(char));
		recvfrom(p.cid,buf,sizeof(buf) - 1,0,(struct sockaddr *)&(p.addr),&size);
		printf("recv: %s \n", buf);
		if (strcmp(buf, "") == 0){
			continue;
		}
	}
}

int main(int argc,char **argv)
{
	if(argc < 3)
	{
		perror("param must >= 3");
		return -1;
	}
	pthread_t thread1;	

	int cid = socket(AF_INET,SOCK_DGRAM,0);
	pack.cid = cid;
	if(cid < 0)
	{
		perror("socket error");
		return -1;
	}
	
	struct sockaddr_in addr = {0},sendaddr = {0};

	addr.sin_family = AF_INET;
	addr.sin_port = htons(atoi(argv[1]));
	addr.sin_addr.s_addr = inet_addr("127.0.0.1");

	sendaddr.sin_family = AF_INET;
	sendaddr.sin_port = htons(atoi(argv[2]));
	sendaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
	
	pack.addr = sendaddr;

	pthread_create(&thread1, NULL, &recv_message, &pack);

	int res = bind(cid,(struct sockaddr *)&sendaddr,sizeof(struct sockaddr));

	char sender[80];
	char buf[128] = {0};
	int size = sizeof(struct sockaddr);
	
	printf("start cheat\n");
	while (1){ 
		memset(sender,0,sizeof(sender)/sizeof(char));
		scanf("%s", &sender);
		
		if (strcmp(sender, "q") == 0){
			break;
		}

		sendto(cid,sender,strlen(sender),0,(struct sockaddr *)&addr,size);
		
	}

	close(cid);
        return 0;
}

实验结果

posted @ 2020-08-07 21:19  漫漫长夜何时休  阅读(915)  评论(0编辑  收藏  举报