TCP客户端的代码编写流程及通信测试

首先看下

1.创建套接字

1
2
int sockfd=socket(AF_INET,SOCK_STREAM,0);
wassert(sockfd!=-1);

2.与服务器连接

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;
//给端口号
ser_addr.sin_port=htons(6000);
//转换网络字节序
ser_addr.sin_addr.s_addr=inet_addr("127.0.0.1");
int res=connect(sockfd,(struct sockaddr*)&ser_addr,sizeof(ser_addr));
assert(res!=-1);

3.数据通信

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
printf("please input: ");
char buff[128]={0};
fgets(buff,128,stdin);
int n=send(sockfd,buff,strlen(buff)-1,0);
if(n==-1||n==0)
{
printf("send error\n");
close(sockfd);
exit(0);
}
memset(buff,0,128);
n=recv(sockfd,buff,127,0);
if(n==-1||n==0)
{
printf("recv error\n");
close(sockfd);
exit(0);
}

整体代码

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
#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=connect(sockfd,(struct sockaddr*)&ser_addr,sizeof(ser_addr));
assert(res!=-1);

printf("please input: ");
char buff[128]={0};
fgets(buff,128,stdin);
int n=send(sockfd,buff,strlen(buff)-1,0);
if(n==-1||n==0)
{
printf("send error\n");
close(sockfd);
exit(0);
}

memset(buff,0,128);
n=recv(sockfd,buff,127,0);
if(n==-1||n==0)
{
printf("recv error\n");
close(sockfd);
exit(0);
}

printf("n=%d,buff=%s\n",n,buff);
close(sockfd);
exit(0);
}

通信测试

分别编译运行客户端和服务端代码

在客户端输入“hello world”

服务端可以接受到客户端发送的信息,通信成功。

TCP服务器会阻塞两次

1.在accept阻塞,是因为没有客户端连接,在等待客户端连接。

2.在recv阻塞,客户端连接上后,但没有发送数据。