赞
踩
以上是TCP通信客户端与服务器实现通信的基本原理流程图。
1、客户端的实现(4个步骤)
1.1创建socket对象
1.2请求连接
1.3发送数据
1.4关闭套接字
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<arpa/inet.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<netinet/ip.h>
#include<sys/types.h>
int main(int argc,char *argv[])
{
//入参判断
if(argc < 2)
{
printf("参数有误");
return -1;
}
//1.创建socket对象(流式套接字)
//2.设置服务器端的ip地址和接口
//3.请求连接
//4.发送数据
//5.关闭socket对象
//1.创建socket对象(流式套接字)
int tcp_socket = socket(AF_INET,SOCK_STREAM,0);
if(tcp_socket < 0)
{
perror("socket error");
return -1;
}
//1.1设置服务器端的ip地址和端口号
//定义结构体并为其赋值
struct sockaddr_in server;
server.sin_family = AF_INET;//IPV4协议
server.sin_port = htons(atoi(argv[2]));//端口号
server.sin_addr.s_addr = inet_addr(argv[1]);//网络字节序
//2.请求连接
if(connect(tcp_socket,(struct sockaddr *)&server,sizeof(server)) < 0)
{
perror("connect error");
return -1;
}
//3.发送消息
char buf[20] = {0};
printf("tftp>");
fgets(buf,sizeof(buf),stdin);//从键盘写入数据到缓冲区
send(tcp_socket,buf,strlen(buf),0);//将缓冲区的数据写入socket
//4关闭socket对象
close(tcp_socket);
return 0;
}
提示:ip地址和端口号均采用主函数传参的方式输入。加入步骤3的目的是为了用发送消息的方式检验是否能正常通信。具体的每个函数中所用到的参数就不做详细的介绍了可利用(man 函数名)的方式查询。
2. 服务器的实现(6个步骤)
2.1创建socket对象
2.2绑定套接字
2.3启动监听
2.4接收连接请求
2.5接收客户端数据
2.6关闭socket对象
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<arpa/inet.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<netinet/ip.h>
#include<sys/types.h>
int main(int argc,char *argv[])
{
//入参判断
if(argc < 3)
{
printf("参数有误");
return -1;
}
//1.创建socket对象(流式套接字) socket()
//2.设置服务器端的ip地址和端口号 struct sockaddr_in
//3.绑定自己的ip地址和端口号 bind()
//4.监听socket对象 listen()
//5.接受连接 accept()
//6.接受连接后进行操作
//7.关闭socket对象 close()
//1.创建socket对象(流式套接字)
int socket_fd = socket(AF_INET,SOCK_STREAM,0);
if(socket_fd < 0)
{
perror("socket error");
return -1;
}
//1.1设置服务器端的ip地址和端口号
//定义结构体并为其赋值
struct sockaddr_in server;
server.sin_family = AF_INET;//IPV4协议
server.sin_port = htons(atoi(argv[2]));//端口号
server.sin_addr.s_addr = inet_addr(argv[1]);//网络字节序
//2.绑定自己的ip地址和端口号
if(bind(socket_fd,(struct sockaddr *)&server,sizeof(server)) < 0)
{
perror("bind error");
return -1;
}
//3.监听socket对象
int ret = listen(socket_fd,5);
if(ret < 0)
{
perror("listen error");
return -1;
}
//4.接收连接
int newfd = 0;//接收新的socket对象
struct sockaddr_in client;
int len = sizeof(client);
newfd = accept(socket_fd,(struct sockaddr *)&client,&len);//通过参数2 获得客户端信息
if(newfd < 0)
{
perror("accept error");
return -1;
}
//输出客户端信息
printf("cilent ip=%s port=%d\n",inet_ntoa(client.sin_addr),ntohs(client.sin_port));
//5.接收数据
char buf[20] = {0};
recv(newfd,buf,sizeof(buf),0);
printf("%s\ny",buf);
//6.关闭socket对象
close(newfd);
提示:在连接成功后会产生一个新的socket对象newfd,在之后的操作中用的是newfd而不是最开始创建的socket_fd。
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。