TCP服务端代码编写

首先看一下

1.创建socket套接字

1
2
int sockfd=socket(AF_INET,SOCK_STREAM,0);
assert(sockfd!=-1);//断言是否成功

2.对创建的套接字进行命名

bind方法失败的原因?

1.使用的IP地址不正确–》一定是服务器程序运行的主机的IP地址,可以给环回地址。

2.使用的端口号不正确

​ (1)使用了其他TCP程序正在使用的端口号

​ (2)使用了没有权限使用的端口号 0-1024

1
2
3
4
5
6
7
8
9
10
11
12
//地址
struct sockaddr_in ser_addr;
//地址初始化
memset(&ser_addr,0,sizeof(ser_addr));
//给地址族
ser_addr.sin_family=AF_INET;
//给端口号 必须使用网络字节序 htons
ser_addr.sin_port=htons(6000);
//将点分十进制字符串转换为网络字节序
ser_addr.sin_addr.s_addr=inet_addr("127.0.0.1");
int res=bind(sockfd,(struct sockaddr*)&ser_addr,sizeof(ser_addr));
assert(res!=-1);

3.创建监听队列

backlog经典值是5.

1
2
res=listen(sockfd,5);
assert(res!=-1);

4.循环处理客户端连接

1
2
3
4
5
6
7
8
9
10
struct sockaddr_in cli_addr;
memset(&cli_addr,0,sizeof(cli_addr));
socklen_t addrlen=sizeof(cli_addr);
int c=accept(sockfd,(struct sockaddr*)&cli_addr,&addrlen);
if(c==-1)
{
printf("accept error\n");
continue;
}
printf("%d link success\n",c);

5.通信

1
2
3
4
5
6
char buff[128]={0};
int n=recv(c,buff,127,0);
//len是指缓冲区的大小
printf("n=%d,buff=%s\n",n,buff);
send(c,"OK",2,0);
//len是真实的数据长度

看下完整代码

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
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <assert.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int main()
{
int sockfd=socket(AF_INET,SOCK_STREAM,0);
assert(sockfd!=-1);
struct sockaddr_in ser_addr;
memset(&ser_addr,0,sizeof(ser_addr));
ser_addr.sin_family=AF_INET;
ser_addr.sin_port=htons(6000);
ser_addr.sin_addr.s_addr=inet_addr("127.0.0.1");
int res=bind(sockfd,(struct sockaddr*)&ser_addr,sizeof(ser_addr));
assert(res!=-1);
res=listen(sockfd,5);
assert(res!=-1);
while(1)
{
struct sockaddr_in cli_addr;
memset(&cli_addr,0,sizeof(cli_addr));
socklen_t addrlen=sizeof(cli_addr);
int c=accept(sockfd,(struct sockaddr*)&cli_addr,&addrlen);
if(c==-1)
{
printf("accept error\n");
continue;
}
printf("%d link success\n",c);
char buff[128]={0};
int n=recv(c,buff,127,0);
printf("n=%d,buff=%s\n",n,buff);
send(c,"OK",2,0);
close(c);
}
close(sockfd);
exit(0);
}