话不多讲,直接复制,直接编译。
第一步,服务端: tcp_server.c
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main(int argc,char*argv[]){
int server_sockfd; // 服务器端套接字
int client_sockfd; // 客户端套接字
struct sockaddr_in my_addr; // 服务器网络地址结构体
struct sockaddr_in remote_addr; // 客户端网络地址结构体
char buf[BUFSIZ]; // 数据传送的缓冲区
int len, sin_size = sizeof(struct sockaddr_in);
// 数据初始化--清零
memset(&my_addr,0,sizeof(my_addr));
my_addr.sin_family = AF_INET; // 设置为IP通信
my_addr.sin_addr.s_addr = INADDR_ANY; // 服务器IP地址--允许连接到所有本地地址上
my_addr.sin_port = htons(12380); // 服务器端口号
// 创建服务器端套接字--IPv4协议,面向连接通信,TCP协议
if(0 > (server_sockfd = socket(PF_INET,SOCK_STREAM,0))) {
perror("socket");
return 1;
}
// 将套接字绑定到服务器的网络地址上
if(0 > bind(server_sockfd,(struct sockaddr*)&my_addr, sizeof(struct sockaddr))) {
perror("bind");
return 1;
}
// 监听连接请求--监听队列长度为1
listen(server_sockfd, 1);
printf("listening now, wait client accept!\n");
// 等待客户端连接请求到达
if(0 > (client_sockfd = accept(server_sockfd,(struct sockaddr*)&remote_addr, &sin_size))) {
perror("accept");
return 1;
}
printf("accept client %s\n", inet_ntoa(remote_addr.sin_addr));
// 发送欢迎信息
// len = sprintf(buf, "Welcome to my server\n");
// send(client_sockfd, buf, len,0);
// 接收客户端的数据并将其发送给客户端--recv返回接收到的字节数,send返回发送的字节数
while( 9 > 1 ) {
len = recv(client_sockfd, buf, BUFSIZ, 0);
if ( 0 > len ) break;
buf[len] = '\0';
printf("%s\n",buf);
if(0 > send(client_sockfd,buf,len,0)) {
perror("send");
return 1;
}
}
close(client_sockfd);
close(server_sockfd);
return 0;
}
第二步,终端: tcp_client.c
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main(int argc, char *argv[]) {
struct sockaddr_in remote_addr; // 服务器端网络地址结构体
char buf[BUFSIZ]; // 数据传送的缓冲区
int len, client_sockfd;
// 数据初始化--清零
memset(&remote_addr, 0, sizeof(remote_addr));
remote_addr.sin_family = AF_INET; // 设置为IP通信
remote_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); // 服务器IP地址
remote_addr.sin_port = htons(12380); // 服务器端口号
// 创建客户端套接字--IPv4协议,面向连接通信,TCP协议
if (0 > (client_sockfd = socket(PF_INET, SOCK_STREAM, 0)) ) {
perror("socket");
return 1;
}
// 将套接字绑定到服务器的网络地址上
if (0 > connect(client_sockfd, (struct sockaddr *)&remote_addr, sizeof(struct sockaddr))) {
perror("connect");
return 1;
}
printf("connected to server\n");
// 循环的发送接收信息并打印接收信息--recv返回接收到的字节数,send返回发送的字节数
while ( 9 > 1 ) {
printf("Enter string to send:");
scanf("%s", buf);
if (!strcmp(buf, "quit")) break;
len = send(client_sockfd, buf, strlen(buf), 0);
// 接收服务器端信息
len = recv(client_sockfd, buf, BUFSIZ, 0);
buf[len] = '\0';
printf("received:%s\n", buf);
}
close(client_sockfd); // 关闭套接字
return 0;
}
最后,结束。