linux网络编程-tcp基础

lkpalu Lv3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <pthread.h>
void *client_thread(void *args)
{
char buf[128];
int clientfd = *(int *)args;
while (1)
{
int count = recv(clientfd, buf, 128, 0);
if (count == 0)
{
break;
}
send(clientfd, buf, count, 0);
printf("clientfd %d,count %d,buffer:%s", clientfd, count, buf); // sockfd = 3,clientfd = 4,0 == stdin,1 == stdout,2 == stderror,描述符依次增加
}
close(clientfd);
}
int main()
{
int sockfd = socket(AF_INET, SOCK_STREAM, 0); // 创建套接字,AF_INET表示ipv4协议,SOCK_STREAM表示提供可靠服务
struct sockaddr_in serveraddr; // 创建服务端地址结构体
memset(&serveraddr, 0, sizeof(struct sockaddr_in));
serveraddr.sin_family = AF_INET; // 设置协议为ipv4
serveraddr.sin_port = htons(8080); // 设置端口为8080,hton系列函数为字节序转换函数,将本地小端存储转化为网络大端存储,htons是short类型的转换
serveraddr.sin_addr.s_addr = htonl(INADDR_ANY); // htonl是long类型的转换,INADDR_ANY表示让主机自动获取当前ip地址
// struct sockaddr_in是struct sockaddr的同等替换,操作更简单

int is = bind(sockfd, (struct sockaddr *)&serveraddr, sizeof(struct sockaddr)); // 连接,将服务地址绑定到套接字中,失败则返回-1
if (is == -1)
{
perror("bind error"); // perror报错
return -1; // 错误退出
}
listen(sockfd, 10); // 监听服务连接,10表示监听个数
#if 0
struct sockaddr_in cltaddr;
memset(&cltaddr, 0, sizeof(struct sockaddr_in));
socklen_t len = sizeof(struct sockaddr_in);
int clientfd = accept(sockfd, (struct sockaddr *)&cltaddr, &len); // 接收阻塞
printf("accept\n");
char buf[128];

#if 0
while (1)
{
int count = recv(clientfd,buf,128,0);
send(clientfd,buf,count,0);
printf("sockfd:%d,clientfd %d,count %d,buffer:%s",sockfd,clientfd,count,buf);//sockfd = 3,clientfd = 4,0 == stdin,1 == stdout,2 == stderror,描述符依次增加
}

getchar(); // 使程序阻塞,防止程序直接退出
close(sockfd);
close(clientfd);

#else
#endif

#else

while (1)
{
struct sockaddr_in cltaddr;
memset(&cltaddr, 0, sizeof(struct sockaddr_in));
socklen_t len = sizeof(struct sockaddr_in);
int clientfd = accept(sockfd, (struct sockaddr *)&cltaddr, &len); // 接收阻塞
printf("accept\n");
pthread_t thid;
pthread_create(&thid, NULL, client_thread, &clientfd);
//多线程接收连接
}

#endif
return 0;
}

1.time_wait
服务端主动断开连接

2.close_wait
客户端已断开连接,服务端即将被close掉,但中途被其他部分阻塞

一请求一线程
缺点:不利于多并发,c10k问题

  • 标题: linux网络编程-tcp基础
  • 作者: lkpalu
  • 创建于 : 2024-12-05 19:18:45
  • 更新于 : 2024-12-05 19:21:22
  • 链接: https://redefine.ohevan.com/2024/12/05/linux网络编程-tcp基础/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论
目录
linux网络编程-tcp基础