网络编程:(五)TCP实现示例

需要用到的头文件:

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

客户端实现:

int main(int sragc,char**argv)
{
	//(1)创建套接字  socket()
	int sock_fd = socket(AF_INET,SOCK_STREAM,0);
	if(sock_fd == -1)
	{
		perror("server socket error:");
		return -1;
	}
	
	//(2)准备服务器的网络地址
	struct sockaddr_in server_addr;
	server_addr.sin_family = AF_INET;
	server_addr.sin_port = htons(atoi(argv[2]));
	inet_aton(argv[1],&server_addr.sin_addr);
	//addr.sin_addr.s_addr = htonl(INADDR_ANY);//自动获取本机IP
	
	//(3)连接服务器 connect()
	int re = connect(sock_fd,(const struct sockaddr *)&server_addr,sizeof(server_addr));
	if(re == -1)
	{
		perror("connect error:");
		close(sock_fd);
		return -1;
	}
	printf("connect success\n");
	
	
	//(4)进行通信  (读写,发送接收)
	char buf[128] = {0};
	fgets(buf,128,stdin);
	re = sendto(sock_fd,buf,strlen(buf),0,(struct sockaddr *)&server_addr,sizeof(server_addr));
	if(re == -1)
	{
		perror("sendto error:");
		close(sock_fd);
		return -1;
	}

	
	char recv_buf[128] = {0};
	//不需要对方地址
	//ssize_t recvfrom(sock_fd,recv_buf,128,0,NULL,NULL);
	struct sockaddr_in addr;
	int len = sizeof(addr);
	recvfrom(sock_fd,recv_buf,128,0,(struct sockaddr *)&addr,&len);
	
	printf("recv_buf = %s\n",recv_buf);
	//(5)断开连接  close
	close(sock_fd);
	
}

服务端实现:

int main(int sragc,char**argv)
{
	//(1)创建套接字  socket()
	int sock_fd = socket(AF_INET,SOCK_STREAM,0);
	if(sock_fd == -1)
	{
		perror("server socket error:");
		return -1;
	}
	
	//(2)准备服务器的网络地址
	struct sockaddr_in server_addr;
	server_addr.sin_family = AF_INET;
	server_addr.sin_port = htons(atoi(argv[2]));
	inet_aton(argv[1],&server_addr.sin_addr);
	//addr.sin_addr.s_addr = htonl(INADDR_ANY);//自动获取本机IP
	
	//设置套接字的选项
	int val = 1;
	setsockopt(sockfd,SOL_SOCKET,SO_REUSEPORT,(void*)&val,sizeof(int));
	
	//(3)绑定服务器 bind()
	int re = bind(sock_fd, (const struct sockaddr *)&server_addr,sizeof(server_addr));
	if(re == -1)
	{
		perror("bind error:");
		return -1;
	}
	printf("bind success\n");
	
	//(4)监听客户端的请求  listen()
	re = listen(sock_fd, 3);
	if(re == -1)
	{
		perror("listen error:");
		return -1;
	}
	printf("listen success\n");
	
	//(5)接受客户端的请求  accept()
	struct sockaddr_in client_addr;
	socklen_t len = sizeof(client_addr);
	int clinet_fd = accept(sock_fd,(struct sockaddr*)&client_addr,&len);
	if(clinet_fd == -1)
	{
		perror("accept error:");
		return -1;
	}
	printf("accept success\n");
	printf("client ip : %s\n",inet_ntoa(client_addr.sin_addr));
	 
	//(6)进行通信  (读写,发送接收)
	//接收
	char recv_buf[128] = {0};
	struct sockaddr_in addr;
	int len_1 = sizeof(addr);
	recvfrom(clinet_fd,recv_buf,128,0,(struct sockaddr *)&addr,&len_1);
	
	printf("recv_buf = %s\n",recv_buf);

	//发送
	char buf[128] = {0};
	fgets(buf,128,stdin);
	re = sendto(clinet_fd,buf,strlen(buf),0,(struct sockaddr *)&addr,sizeof(addr));
	if(re == -1)
	{
		perror("sendto error:");
		close(sock_fd);
		return -1;
	}
	//(7)断开连接  close
	close(sock_fd);
	
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值