客户端调用序列
- 调用socket函数创建套接字
- 调用connect连接服务端
- 调用I/O函数(accept/recv)与服务器端通讯
- 调用close关闭套接字
服务器端调用序列
- 调用socket函数创建本地套接字
- 调用bind函数绑定本地地址和端口
- 调用listen启动监听
- 调用accept从已经连接的队列中提出客户连接
- 调用I/O函数(accept/recv)与客户端通讯
- 调用close关闭套接字
服务端代码
/*服务端TCP程序一般流程
*1、创建socket
*2、绑定端口和ip
*3、监听socket
*4、接收客户端的请求
*5、从缓冲区中读取数据
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#define PORT 5000
#define IP "192.168.0.106"
#define BACKLOG 5
int main()
{
int listen_fd;
int accept_fd;
char buf[1024] = {0};//读写缓冲区
struct sockaddr_in server_addr;
//需要获取客户端相关信息
struct sockaddr_in client_addr;
socklen_t client_len;
client_len = sizeof(client_addr);
//创建socket
if ((listen_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
perror("socket");
return 1;
}
//绑定端口和ip
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(PORT);
server_addr.sin_addr.s_addr = inet_addr(IP);
if (bind(listen_fd, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {
perror("bind");
return 2;
}
//监听socket
if (listen(listen_fd, BACKLOG) < 0) {
perror("listen");
return 3;
}
while(1) {
//接收客户端的请求
if ((accept_fd = accept(listen_fd, (struct sockaddr*)&client_addr, &client_len)) < 0) {
perror("accept");
return 4;
}
//打印客户端信息
printf("connected with ip: %s: port:%d\n",
inet_ntop(AF_INET, &client_addr.sin_addr, buf, 1024), ntohs(client_addr.sin_port));
while (1) {
memset(buf, 0, sizeof(buf));
//从缓冲区中读取数据
ssize_t size = read(accept_fd, buf, sizeof(buf) - 1);
if (size > 0)
printf("client send: %s\n", buf);
else if (size == 0) {
printf("read done!\n");
close(accept_fd);
break;
}
else {
perror("read");
close(accept_fd);
break;
}
}
}
close(listen_fd);
return 0;
}
客户端代码
/*客户端TCP程序一般流程
*1、创建socket
*2、向服务端发起连接
*3、向缓冲区中写入数据
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#define PORT 5000
#define IP "192.168.0.106"
int main()
{
int client_fd;
char buf[1024] = {0};//读写缓冲区
struct sockaddr_in client_addr;
ssize_t size;
//创建socket
if ((client_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
perror("socket");
return 1;
}
//填充ip端口信息
client_addr.sin_family = AF_INET;
client_addr.sin_port = htons(PORT);
client_addr.sin_addr.s_addr = inet_addr(IP);
//向服务端发起连接
if (connect(client_fd, (struct sockaddr*)&client_addr, sizeof(client_addr)) < 0) {
perror("connect");
return 2;
}
while(1) {
memset(buf, 0, sizeof(buf));
//从标准输入获取字符串
if (!gets(buf)) {
perror("gets");
return 3;
}
if (strcmp(buf, "quit") == 0)
break;
if (write(client_fd, buf, strlen(buf)) != strlen(buf)) {
perror("write");
return 4;
}
}
close(client_fd);
return 0;
}