今天学了Linux服务器和客户端,感觉最主要的还是运用几个函数,对函数参数以及返回值的灵活应用,在主体的大方向上其实挺简单的。服务器 socket------>bind------>listen------>accept,而客户端则是 socket------>connect。
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <strings.h>
#include <arpa/inet.h>
#define SERV_PORT 9000
int main()
{
int listen_sockfd;
int ret;
struct sockaddr_in server_addr; // 服务器地址结构
struct sockaddr_in client_addr; // 客户端的地址
// 创建监听套接字
listen_sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (listen_sockfd == -1)
{
perror("create socket error");
return -1;
}
// 初始化服务器地址结构
bzero(&server_addr, sizeof(server_addr)); // 将地址结构变量清零
server_addr.sin_family = AF_INET; // 选择IPV4地址
server_addr.sin_addr.s_addr = htonl(INADDR_ANY); // 监听本地任意IP地址
server_addr.sin_port = htons(SERV_PORT); // 将本地端口号转化为网络端口号
// 绑定本地地址和端口号
ret = bind(listen_sockfd, (struct sockaddr *)&server_addr, sizeof (server_addr));
if (ret == -1)
{
perror ("bind error");
return -1;
}
// 监听套接字
ret = listen(listen_sockfd, 20);
if (ret == -1)
{
perror("listen error");
return -1;
}
while(1)
{
int clientfd;
socklen_t client_len = sizeof(client_addr);
printf ("waiting for client to connect.....\n");
clientfd = accept(listen_sockfd, (struct sockaddr *)&client_addr, &client_len);
if (clientfd == -1)
{
perror("accept error");
return -1;
}
printf ("the client addr is %s\n", inet_ntoa(client_addr.sin_addr));
}
return 0;
}
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <strings.h>
#include <arpa/inet.h>
#define SERV_PORT 9000
int main(int argc, char *argv[])
{
int server_sockfd;
int ret;
struct sockaddr_in client_addr;
if (argc != 2)
{
printf ("Usage:./client IP_ADDRESS\n");
return -1;
}
// 创建监听套接字
server_sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (server_sockfd == -1)
{
perror("create socket error");
return -1;
}
// 初始化服务器地址结构
bzero(&client_addr, sizeof(client_addr)); // 将地址结构变量清零
client_addr.sin_family = AF_INET; // 选择IPV4地址
inet_aton(argv[1], &client_addr.sin_addr); // 填写服务器地址
client_addr.sin_port = htons(SERV_PORT); // 填写服务器端口
// 连接服务器
ret = connect(server_sockfd, (struct sockaddr *)&client_addr, sizeof (client_addr));
if (ret == -1)
{
perror("connect error");
return -1;
}
printf ("connect success\n");
return 0;
}