一、TCP通信流程
1.server服务器端:
1)socket() 创建socket。
2)bind() 绑定服务器地址结构。
3)listen() 设置监听上限。
4)accept() 阻塞监听客户端连接。
5)read(fd…) 读socket缓冲区内容。
6)实现需要的功能。
8)close() 关闭 fd。
2.client 客户端:
1)socket() 创建socket。
2)connect() 与服务器建立连接。
3)write() 写数据到socket的写缓冲,将数据发送到服务器。
4)read() 读数据。
5)显示读取结果。
6)close() 关闭fd。
二、详细代码
1.服务器
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#define PERROR(str) \
{perror(str); exit (EXIT_FAILURE);}
int main (void)
{
int sfd, cfd;
int ret;
char client_IP[1024]; //保存客户端的地址
struct sockaddr_in ser_add, clt_add;
socklen_t addrlen;
sfd = socket (AF_INET, SOCK_STREAM, 0); //创建socket,AF_INET:IPV4,SOCK_SREAM:流式协议,
//0:根据type选择代表的协议,SOCK_STREAM:TCP , SOCK_DGRAM:UDP
if (ret == -1)
PERROR ("socket");
ser_add.sin_family = AF_INET;
ser_add.sin_port = htons (666); //设置端口为666,转换成网络格式
ser_add.sin_addr.s_addr = htonl (INADDR_ANY); //本机ip地址,127.0.0.1
ret = bind (sfd, (struct sockaddr *)&ser_add, sizeof (ser_add)); //绑定服务器地址结构
if (ret == -1)
PERROR ("bind");
ret = listen (sfd, 128); //设置监听上限为128个
if (ret == -1)
PERROR ("listen");
addrlen = sizeof (clt_add);
cfd = accept (sfd, (struct sockaddr *)&clt_add, &addrlen); //阻塞监听,连接成功,继续往下执行
if (cfd == -1)
PERROR ("accept");
printf ("IP: %s port:%d\n",
inet_ntop (AF_INET, &ser_add.sin_addr, client_IP, sizeof (client_IP)),
ntohs (ser_add.sin_port));
int len;
char buf[BUFSIZ];
while (1) //实现大小写转换
{
len = read (cfd, buf, BUFSIZ); //读取客户端发来的数据
printf ("%s",buf);
}
close (cfd);
close (sfd);
return 0;
}
2.客户端
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <errno.h>
#define PERROR(str) \
{perror(str); exit (EXIT_FAILURE);}
#define SEVR_PORT 666
int main (void)
{
int cfd;
struct sockaddr_in serv_addr; //服务器的地址结构
int count = 10;
char buf[1024] = {0};
cfd = socket (AF_INET, SOCK_STREAM, 0); //创建套接字
if (cfd == -1)
PERROR ("socket");
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons (SEVR_PORT);
inet_pton (AF_INET, "127.0.0.1", &serv_addr.sin_addr.s_addr); //将点地址转换为网络地址,传入服务器的地址结构
int ret = connect (cfd, (struct sockaddr *)&serv_addr, sizeof (serv_addr)); //使用现有的socket与服务器建立连接
if (ret == -1)
PERROR ("connect");
while (count--) //连接成功,发送10次数据
{
write (cfd, "I love u\n", 9);
ret = read (cfd, buf, strlen (buf));
//write (STDOUT_FILENO, buf, ret);
printf ("%s", buf);
sleep (1);
}
close (cfd);
return 0;
}