Linux系统编程------TCP客户端
客户端流程
- 创建流式套接字,通过socket创建
- 填充服务器的网络信息结构体 ------ struct sockaddr_in
- 与服务器建立连接,通过connect实现
- 收发数据------recv/send
- 关闭套接字------close
connect函数
c
int connect(int sockfd, const struct sockaddr*, socklen_t addrlen);
所需头文件:sys/socket.h
sockfd:客户端的sock套接字
addr:目标服务器的地址结构体
addrlen:地址结构体的长度
返回值:成功返回0,失败返回-1并重置错误码。
实例:TCP客户端
代码:
c
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <netinet/ip.h>
#include <netinet/in.h>
#include <unistd.h>
#include <stdbool.h>
int main(int argc, char** argv) {
//创建流式套接字
int sock_fd = socket(AF_INET, SOCK_STREAM, 0);
if (sock_fd == -1) {
perror("创建socket失败");
return -1;
}
//配置服务器地址信息
struct sockaddr_in server_info = {0};
//IPV协议簇
server_info.sin_family = AF_INET;
//端口号
server_info.sin_port = htons(8888);
//ip地址
server_info.sin_addr.s_addr = inet_addr("192.168.203.141");
//连接服务器
int ret = connect(sock_fd, (const struct sockaddr*)&server_info, sizeof(server_info));
if (ret == -1 ) {
perror("连接失败");
return -1;
}
char buf[128] = {0};
while(true) {
memset(buf, 0, sizeof(buf));
//从键盘中读取输入
fgets(buf, sizeof(buf), stdin);
int nbytes = send(sock_fd, buf, sizeof(buf), 0);
if (nbytes == -1 ) {
perror("发送失败");
return -1;
}
//接收数据
memset(buf, 0, sizeof(buf));
int nbytes_recv = recv(sock_fd, buf, sizeof(buf), 0);
if (nbytes_recv == -1) {
perror("读取失败");
return -1;
} else if(nbytes_recv == 0) {
printf("服务端关闭连接,退出程序\n");
return 0;
}
printf("服务器发来的数据:%s\n",buf);
}
return 0;
}
```
运行结果:
