Linux网络编程笔记;
TCP链接方式的Linux网络编程包括客户端服务端两种方式。
客户端的主要流程为:
1、 创建套接字
2、 连接服务器
3、 传送数据
4、 断开连接
服务器端的主要流程:
1、 创建套接字
2、 监听
3、 等待连接请求
4、 数据传送
5、 断开连接
客户端简单代码:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>
#include <arpa/inet.h>
#include <fcntl.h>
int main(int argc, const char* argv[])
{
// 创建套接字
//AF_INET表示IPV4网络协议
//TCP用数据流方式传送数据
//最后一个参数表示协议
int fd = socket(AF_INET, SOCK_STREAM, 0);
if(fd == -1)
{
perror("socket error");
exit(1);
}
//创建套接字地址
struct sockaddr_in serv_addr;
//初始化套接字地址
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
//分配端口号
serv_addr.sin_port = htons(9999);
//inet_pton将点分文本转换为二进制网络字节顺序
inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr.s_addr);
//将套接字和地址绑定并发出连接请求
int ret = connect(fd, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
if(ret == -1)
{
perror("connect error");
exit(1);
}
// 数据传送
while(1)
{
//从键盘中获取数据
char buf[512];
fgets(buf, sizeof(buf), stdin);
// 利用write函数将数据发送给服务器
write(fd, buf, strlen(buf)+1);
// 接收服务器端的数据
int len = read(fd, buf, sizeof(buf));
printf("%s\n", buf);
}
return 0;
}
服务器端代码:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <ctype.h>
int main(int argc, const char* argv[])
{
// 创建用于监听的套节字
int lfd = socket(AF_INET, SOCK_STREAM, 0);
if(lfd == -1)
{
perror("socket error");
exit(1);
}
//用于监听的套接字地址
struct sockaddr_in serv_addr;
//初始化地址空间
memset(&serv_addr, 0, sizeof(serv_addr));
// bzero(&serv_addr, sizeof(serv_addr));
// 地址族协议 ipv4
serv_addr.sin_family = AF_INET;
// 本地端口, 需要转换为大端
serv_addr.sin_port = htons(9999);
// 0 是用本机的任意IP
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
//绑定地址
int ret = bind(lfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
if(ret == -1)
{
perror("bind error");
exit(1);
}
// 设置监听,套接字lfd用于监听对方的情况
ret = listen(lfd, 64);
if(ret == -1)
{
perror("listen error");
exit(1);
}
// 等待并接受连接请求,cline_addr用于保存连接客户端的相应的信息。
struct sockaddr_in cline_addr;
socklen_t clien_len = sizeof(cline_addr);
int cfd = accept(lfd, (struct sockaddr*)&cline_addr, &clien_len);
if(cfd == -1)
{
perror("accept error");
exit(1);
}
char ipbuf[64];
printf("cliient ip: %s, port: %d\n",
inet_ntop(AF_INET, &cline_addr.sin_addr.s_addr, ipbuf, sizeof(ipbuf)),
ntohs(cline_addr.sin_port));
// 通信
while(1)
{
// 接收数据
char buf[1024] = {0};
int len = read(cfd, buf, sizeof(buf));
if(len == -1)
{
perror("read error");
break;
}
else if(len > 0)
{
// 读取数据成功
printf("%s\n", buf);
// 数据发送给客户端
write(cfd, buf, strlen(buf)+1);
}
else if( len == 0 )
{
printf("disconnect ...\n");
break;
}
}
//关闭套接字端口
close(lfd);
close(cfd);
return 0;
}