这次不能老规矩,得先梳理下思路。(代码随后就上)
本文基于Linux(CentOS),使用C语言完成网络编程。
思路:
- 创建一个套接字(socket)。
- 将套接字绑定到指定的IP地址和端口。
- 开启套接字的监听。
- 接受客户端的连接。
- 给客户端发送消息。
- 接收客户端的消息。
话先不多说,直接上代码!
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <fcntl.h>
#include <netinet/in.h>
#include <netinet/tcp.h>
#include <sys/types.h>
#include <sys/socket.h>
#define SERVER_PORT 7711
int main()
{
int serversock;
int yes = 1;
// 创建套接字,用于接受连接(只在服务端)
serversock = socket(AF_INET, SOCK_STREAM, 0);
if (serversock == -1)
{
perror("serversock create error");
return -1;
}
setsockopt(serversock, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes));
printf("create serversock success\n");
// 将套接字绑定到指定的IP地址和端口,并开启监听
struct sockaddr_in sa;
memset(&sa, 0, sizeof(sa));
sa.sin_family = AF_INET;
sa.sin_port = htons(SERVER_PORT);
sa.sin_addr.s_addr = htonl(INADDR_ANY);
if (bind(serversock, (struct sockaddr*) &sa, sizeof(sa)) == -1)
{
close(serversock);
perror("bind error");
return -1;
}
if (listen(serversock, 511) == -1)
{
close(serversock);
perror("listen error");
return -1;
}
printf("bind and listen success\n");
// 接受连接
int fd;
struct sockaddr_in sa1;
socklen_t sa1_len = sizeof(sa1);
fd = accept(serversock, (struct sockaddr*) &sa1, &sa1_len); // 看下
if (fd == -1)
{
close(serversock);
perror("accept error");
return -1;
}
printf("accept link success\n");
// 向客户端发送消息
char *msg = "Welcome to Chat!\n\0"; // test
write(fd, msg, strlen(msg));
// 接收客户端的消息
fd_set fds;
struct timeval tv;
tv.tv_sec = 1;
tv.tv_usec = 0;
int ret_val = 0;
FD_ZERO(&fds);
while (1)
{
FD_SET(fd, &fds);
ret_val = select(fd+1, &fds, NULL, NULL, &tv);
if (ret_val == -1) // test
{
perror("select error");
break;
}
else if (ret_val)
{
char data[256];
int read_len = 0;
read_len = read(fd, data, sizeof(data)-1);
data[read_len] = 0;
printf("%s", data);
}
}
// 关闭连接释放资源
FD_ZERO(&fds);
close(fd);
close(serversock);
return 0;
}
以上代码使用网络编程(socket),实现了一个服务端(server)应用,完成向客户端发送消息和接收客户端的消息。
将上述代码copy一下,在Linux系统中,直接使用GCC进行编译,然后运行可执行文件即可。可以使用telnet作为客户端玩一玩。
解释:
对于熟悉网络编程的小伙伴来说,这些就比较easy了。如果已经成功跑起来了,就可以直接pass。
对于没了解过或者刚接触网络编程的小伙伴,我先解释下一些基本概念,然后说一下让代码跑起来的具体操作。代码的话,大家可以自行去掌握和熟悉。
- 基本概念
本来想说一些自己的“概念”,帮助各位小伙伴更好的理解上述代码和网络编程,但是我自己理解的概念可能与官方的有出入(可能解释的不到位),担心误导了刚入门的小伙伴,并且网络编程涉及一些网络原理的知识(其实也没有很难,说白了没学网络原理也能掌握上述代码,希望各位小伙伴不要望而止步),比较多,没办法全部解释说明白,所以基于这两点,就不和大家做过多的解释了。
还是直接说下操作吧! - 具体操作
在Linux系统中,正常创建.c文件,将上述代码copy过去,然后使用 gcc filename.c -o filename 命令编译生成可执行的文件,直接运行即可。
新建一个终端窗口,如果系统内没有telnet,可以直接yum install telnet -y,然后使用telnet localhost(IP) 7711(端口),进行连接,可以看到telnet终端界面显示了服务端发送的一条消息(Welcom to Chat!),接下来就可以正常发送消息给服务端了,服务端会将收到的消息打印出来。