网络编程实现双人聊天

通过线程实现客户端与服务端的简易双人聊天

头文件

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

1,客户端主函数代码

int main()
{
	//监听套接字文件描述符
	int listenFd = -1;
	//连接套接字的文件描述符
	int connFd = -1;
	//服务器的地址结构
	struct sockaddr_in servAddr = {0};
	//客户端的地址结构
	struct sockaddr_in cliAddr = {0};
	socklen_t len = sizeof(cliAddr);
	int ret;
	char buf[100] = {0};

	//创建套接字
	listenFd = socket(PF_INET, SOCK_STREAM, 0);
	if(listenFd < 0)
	{
		perror("socket error!\n");
		return -1;
	}
	printf("socket ok!\n");
	//绑定ip地址和端口号
	servAddr.sin_family = PF_INET;
	servAddr.sin_port = htons(10086);
	servAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
	ret = bind(listenFd, (struct sockaddr *)&servAddr, sizeof(servAddr));
	if(ret < 0)
	{
		perror("bind error!");
		close(listenFd);
		return -1;
	}
	printf("bind ok!\n");
	//创建监听队列(使得主动的套接字变成可以被连接的被动套接字)
	ret = listen(listenFd, 1);
	if(ret < 0)
	{
		perror("listen error");
		close(listenFd);
		return -1;
	}
    printf("listening....\n");
	//等待并建立连接
	connFd = accept(listenFd, (struct sockaddr *)&cliAddr, &len);
	if(connFd < 0)
	{
		perror("accept error!");
		close(listenFd);
		return -1;
	}
//	printf("IP:%s,PORT:%d accept ok!\n", inet_ntoa(cliAddr.sin_addr), ntohs(cliAddr.sin_port));i
	while(1)
	{
	pthread_t tid;
	pthread_create(&tid,NULL,thread,&connFd);
	}
	return 0;
}
void *thread(void *vargp)
{
 
pthread_t tid1,tid2;
int connfd = *((int *)vargp);
int idata;
char temp[100];
pthread_create(&tid1,NULL,threadsend,vargp);
pthread_create(&tid2,NULL,threadrecv,vargp);
return NULL;
}

2,服务端主函数代码

int main()
{
	int sockFd = -1;
	//服务器的地址结构
	struct sockaddr_in servAddr = {0};
	int ret;
	char buf[100] = {0};

	//创建套接字
	sockFd = socket(PF_INET, SOCK_STREAM, 0);
	if(sockFd < 0)
	{
		perror("socket error!\n");
		return -1;
	}
	printf("socket ok!\n");
	//按照服务器的ip地址和端口号连接服务器
	servAddr.sin_family = PF_INET;
	servAddr.sin_port = htons(10086);
	servAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
	ret = connect(sockFd, (struct sockaddr *)&servAddr, sizeof(servAddr));
	if(ret < 0)
	{
		perror("connect error!");
		close(sockFd);
		return -1;
	}
	printf("connect ok!\n");
pthread_t tid1,tid2;
printf("connected\n");
while(1){
pthread_create(&tid1,NULL,threadsend,&sockFd);

pthread_create(&tid2,NULL,threadrecv,&sockFd);
}

return 0;
}

 3,接受发送信息函数

void *thread(void *vargp)
{
 
pthread_t tid1,tid2;
int connfd = *((int *)vargp);
int idata;
char temp[100];
pthread_create(&tid1,NULL,threadsend,vargp);
pthread_create(&tid2,NULL,threadrecv,vargp);
return NULL;
}

	void *threadsend(void *vargp)
	{
		int connFd = *((int *)vargp);
		int idata;
		char temp[100];
		while(1)
		{
		fgets(temp,sizeof(temp),stdin);
		send(connFd,temp,sizeof(temp),0);
		printf("send ok\r\n");
		}
		printf("server send\n");
		return NULL;
	}
void *threadrecv(void *vargp)
{
	char temp[100];
	int connFd = *((int *)vargp);
	while(1)
	{
		int idata = 0;
		idata = recv(connFd,temp,sizeof(temp),0);
		if(idata > 0)
		{
			printf("recv :%s\r\n",temp);
		}
	}
	return NULL;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现双人聊天室需要使用socket编程中的TCP协议。以下是一个简单的c语言程序,实现了基本的双人聊天室功能。 ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <errno.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #define PORT 8888 // 聊天室端口号 int main(int argc, char *argv[]) { int fd, ret; struct sockaddr_in server_addr, client_addr; socklen_t client_addr_size = sizeof(client_addr); // 创建socket fd = socket(AF_INET, SOCK_STREAM, 0); if (fd == -1) { perror("socket"); exit(EXIT_FAILURE); } // 设置服务端地址 memset(&server_addr, 0, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = htonl(INADDR_ANY); server_addr.sin_port = htons(PORT); // 绑定socket到地址 ret = bind(fd, (struct sockaddr *)&server_addr, sizeof(server_addr)); if (ret == -1) { perror("bind"); exit(EXIT_FAILURE); } // 监听socket ret = listen(fd, 1); // 同时只能连接一个客户端 if (ret == -1) { perror("listen"); exit(EXIT_FAILURE); } printf("Waiting for connection...\n"); // 接受客户端连接 int client_fd = accept(fd, (struct sockaddr *)&client_addr, &client_addr_size); if (client_fd == -1) { perror("accept"); exit(EXIT_FAILURE); } printf("Connected!\n"); // 开始聊天 char buf[1024]; while (1) { // 接收客户端消息 ret = recv(client_fd, buf, sizeof(buf), 0); if (ret == -1) { perror("recv"); exit(EXIT_FAILURE); } else if (ret == 0) { printf("Client disconnected.\n"); break; } else { printf("Received: %s", buf); } // 发送消息给客户端 printf("Say something: "); fgets(buf, sizeof(buf), stdin); ret = send(client_fd, buf, strlen(buf), 0); if (ret == -1) { perror("send"); exit(EXIT_FAILURE); } } // 关闭socket close(client_fd); close(fd); return 0; } ``` 运行该程序后,服务端将等待客户端连接。当客户端连接成功后,服务端和客户端就可以开始聊天了。 客户端程序也非常简单,只需要连接到服务端并发送和接收消息即可。以下是客户端程序的代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <errno.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #define SERVER_IP "127.0.0.1" // 服务端IP地址 #define PORT 8888 // 聊天室端口号 int main(int argc, char *argv[]) { int fd, ret; struct sockaddr_in server_addr; // 创建socket fd = socket(AF_INET, SOCK_STREAM, 0); if (fd == -1) { perror("socket"); exit(EXIT_FAILURE); } // 设置服务端地址 memset(&server_addr, 0, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = inet_addr(SERVER_IP); server_addr.sin_port = htons(PORT); // 连接到服务端 ret = connect(fd, (struct sockaddr *)&server_addr, sizeof(server_addr)); if (ret == -1) { perror("connect"); exit(EXIT_FAILURE); } // 开始聊天 char buf[1024]; while (1) { // 发送消息给服务端 printf("Say something: "); fgets(buf, sizeof(buf), stdin); ret = send(fd, buf, strlen(buf), 0); if (ret == -1) { perror("send"); exit(EXIT_FAILURE); } // 接收服务端消息 ret = recv(fd, buf, sizeof(buf), 0); if (ret == -1) { perror("recv"); exit(EXIT_FAILURE); } else if (ret == 0) { printf("Server disconnected.\n"); break; } else { printf("Received: %s", buf); } } // 关闭socket close(fd); return 0; } ``` 运行服务端程序后,再运行两个客户端程序,就可以在各个客户端之间进行聊天了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值