这学期有这门课,所以学习了一波套接字编程,其实我这算是预习了hhhhhhh
本篇主要介绍如何运行程序(我最讨厌博客主直接上代码,都不说怎么用,那有个jb用呀),基本概念可以参考这篇博客:https://blog.csdn.net/lihao21/article/details/64624796,以后我会自己写一份关于套接字编程的基本概念的博客的。
套接字(socket)是一种通信机制,凭借这种机制,客户与服务器的通信既可以在本地单机上进行,也可以跨网络进行。
关于这张图,关键记住就是:server端先开启,监听有没有client连接自己,然后运行客户端程序。
下面上实例:你要写两个程序,一个是客户端client的,一个是服务器端server的。
这里server.c是服务器端的程序,socket.c是客户端的程序。a.out是server.c编译的默认文件,下面看一下这两个程序里都是啥。
首先server.c
#include <sys/socket.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
int main(int argc, char **argv)
{
// 创建套接字
int server_fd = socket(AF_INET, SOCK_STREAM, 0);
if (server_fd < 0) {
perror("cannot create socket");
return 0;
}
printf("created socket, server_fd: %d\n", server_fd);
// 命名套接字
struct sockaddr_in server_addr;
memset((void *)&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
server_addr.sin_port = htons(6240);
if (bind(server_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {
perror("bind failed");
return 0;
}
printf("bind complete, port number: %d\n", ntohs(server_addr.sin_port));
// 创建套接字队列
if (listen(server_fd, 5) < 0) {
perror("listen failed");
exit(1);
}
printf("socket listen, server_fd: %d\n", server_fd);
// 服务器等待客户连接
const int MAXBUF = 256;
char buffer[MAXBUF];
struct sockaddr_in client_addr;
int client_addr_len = sizeof(client_addr);
int client_fd;
while (1) {
client_fd = accept(server_fd, (struct sockaddr *)&client_addr, &client_addr_len);
printf("accept client, client fd: %d, ip: %s, port: %d\n", client_fd,
inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
// 接收数据
int nbytes = read(client_fd, buffer, MAXBUF);
printf("read from client, bytes: %d, data: %s\n", nbytes, buffer);
// 关闭套接字
close(client_fd);
}
}
客户端的socket.c
#include <sys/socket.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main(int argc, char **argv) {
// 创建套接字
int client_fd = socket(AF_INET, SOCK_STREAM, 0);
if (client_fd < 0) {
perror("cannot create socket");
return 0;
}
printf("created socket, client_fd: %d\n", client_fd);
// 命名套接字,客户端由内核选择IP地址和端口
struct sockaddr_in client_addr;
memset((char *)&client_addr, 0, sizeof(client_addr));
client_addr.sin_family = AF_INET;
client_addr.sin_addr.s_addr = htonl(INADDR_ANY);
client_addr.sin_port = htons(0);
if (bind(client_fd, (struct sockaddr *)&client_addr,
sizeof(client_addr)) < 0) {
perror("bind failed");
return 0;
}
// 构造服务器的地址
const char *server = "10.136.52.42"; // 服务器IP
struct sockaddr_in server_addr;
memset((char*)&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
inet_aton(server, &server_addr.sin_addr);
server_addr.sin_port = htons(6240);
// 请求连接服务器
int result = connect(client_fd, (struct sockaddr *)&server_addr,
sizeof(server_addr));
if (result < 0) {
perror("connect failed");
}
// 发送数据
int MAXBUF = 256;
char buffer[MAXBUF];
strcpy(buffer,"hello tcp");
int nbytes = write(client_fd, buffer, 10);
printf("write to server, bytes: %d, data: %s\n", nbytes, buffer);
// 关闭套接字
close(client_fd);
}
说明:我这是单机测试,我的服务器ip地址是:10.136.52.42(大网IP哈哈哈),要根据自己主机的IP地址修改
首先运行服务器端程序:
然后开另一个终端运行客户端程序:
以上就是程序运行的结果