功能描述

利用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,不然无法成功连接。或者改为本地回环地址。

GitHub 加速计划 / li / linux-dash
10.39 K
1.2 K
下载
A beautiful web dashboard for Linux
最近提交(Master分支:2 个月前 )
186a802e added ecosystem file for PM2 4 年前
5def40a3 Add host customization support for the NodeJS version 4 年前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐