【TCP网络编程】C语言实现TCP服务器和客户端之间的通信(linux)

功能描述

利用TCP网络通信实现客户端服务器的通信
服务器代码
server.c

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

#define LINE     10

//创建TCP服务器实现服务器和客户端的通信

int main()
{

//创建socket套接字
	int serfd=0;
	serfd=socket(AF_INET,SOCK_STREAM,0);
	if(serfd<0)
	{
		perror("socket failed");
		return -1;
	}
	printf("socket ok!\n");
//通过调用bind绑定IP地址和端口号
	int ret=0;
	struct sockaddr_in seraddr={0};
	seraddr.sin_family=AF_INET;
	seraddr.sin_port=htons(8888);
	seraddr.sin_addr.s_addr=inet_addr("192.168.59.131");
	ret=bind(serfd,(struct sockaddr *)&seraddr,sizeof(seraddr));
	if(ret<0)
	{
		perror("bind failed");
		close(serfd);
		return -1;
	}
	printf("bind success\n");
//通过调用listen将套接字设置为监听模式
	int lis=0;
	lis=listen(serfd,LINE);
	if(lis<0)
	{
		perror("listen failed");
		close(serfd);
		return -1;
	}
	printf("listen success\n");
//服务器等待客户端连接中,游客户端连接时调用accept产生一个新的套接字
	int confd=0;
	socklen_t addrlen;
	struct sockaddr_in clientaddr={0};
	addrlen=sizeof(clientaddr);
	confd=accept(serfd,(struct sockaddr *)&clientaddr,&addrlen);
	if(confd<0)
	{
		perror("accept failed");
		close(serfd);
		return -1;
	}
	printf("connect success!\n");
	printf("ip=%s,port=%u\n",inet_ntoa(clientaddr.sin_addr),ntohs(clientaddr.sin_port));
//调用recv接收客户端的消息
while(1)
{
	int rev=0;
	int sed=0;
	char buf[1024]={0};
	rev=recv(confd,buf,sizeof(buf),0);
	if(rev>0)
	{
	printf("本次收到了%d个字节\n",rev);
	printf("receive: %s\n",buf);
	}
	
	memset(buf,0,sizeof(buf));
	gets(buf);
	sed=send(confd,buf,strlen(buf),0);
	if(sed<0)
	{
		perror("send failed");
		close(serfd);
		return -1;
	}
	printf("send success\n");
}
	close(confd);
	close(serfd);
	
	return 0;
}

客户端代码
client.c

#include<stdio.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<string.h>
#include<unistd.h>
#include<netinet/in.h>


//创建TCP服务器实现服务器和客户端的通信


int main()
{

//创建socket套接字
	int clientfd=0;
	clientfd=socket(AF_INET,SOCK_STREAM,0);
	if(clientfd<0)
	{
		perror("socket failed");
		return -1;
	}
	printf("socket ok!\n");
//客户端可以不绑定IP地址和端口号,系统会随机分配
//客户端连接服务器
	int ret=0;
	int addrlen=0;
	struct sockaddr_in seraddr={0};
	seraddr.sin_family=AF_INET;
	seraddr.sin_port=htons(8888);
	seraddr.sin_addr.s_addr=inet_addr("192.168.59.131");
	addrlen=sizeof(seraddr);
	ret=connect(clientfd,(struct sockaddr *)&seraddr,addrlen);
	if(ret<0)
	{
		perror("connect failed");
		close(clientfd);
		return -1;
	}
	printf("connect success\n");
//调用send向服务器发送消息
while(1)
{	
	int sed=0;
	int rev=0;
	char buf[1024]={0};
	gets(buf);
	sed=send(clientfd,buf,strlen(buf),0);
	if(sed<0)
	{
		perror("send failed");
		close(clientfd);
		return -1;
	}
	printf("send success\n");
	
	memset(buf,0,sizeof(buf));
	rev=recv(clientfd,buf,sizeof(buf),0);
	if(rev>0)
	{
	printf("本次收到了%d个字节\n",rev);
	printf("receive: %s\n",buf);
	}
	
}
	close(clientfd);


	return 0;

}

注意

使用时需要将其中的IP地址换成自己的IP,不然无法成功连接。或者改为本地回环地址。

发布了34 篇原创文章 · 获赞 41 · 访问量 1万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章