【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萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章