第一句子网 - 唯美句子、句子迷、好句子大全
第一句子网 > C语言实现TCP服务器与客户端通信

C语言实现TCP服务器与客户端通信

时间:2019-12-22 03:24:22

相关推荐

C语言实现TCP服务器与客户端通信

以上是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。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。