1.UDP的服务端程序:
1. 创建socket socket
2. 为套接字绑定地址信息 bind
3. 数据传输 recvfrom/sendto
4. 关闭socket close
代码如下:
int main()
{
int sockfd = -1;
//1. 创建套接字
sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (sockfd < 0) {
perror("socket");
return -1;
}
//2. 为套接字绑定地址信息
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(9000);
addr.sin_addr.s_addr = inet_addr("192.168.43.153");
socklen_t len = sizeof(struct sockaddr_in);
int ret = bind(sockfd, (struct sockaddr*)&addr, len);
if (ret != 0) {
perror("bind");
return -1;
}
//3. 数据传输
while(1) {
//1. 接收客户端数据
struct sockaddr_in cli_addr;
char buff[1024] = {0};
recvfrom(sockfd, buff, 1023, 0,
(struct sockaddr*)&cli_addr, &len);
printf("client[%s:%d] say: %s\n",
inet_ntoa(cli_addr.sin_addr),
ntohs(cli_addr.sin_port),
buff);
//2. 向客户端回复数据
char tmp[1024] = {0};
printf("you say:");
scanf("%s", tmp);
len = sizeof(struct sockaddr_in);
sendto(sockfd, tmp, strlen(tmp), 0,
(struct sockaddr*)&cli_addr, len);
}
close(sockfd);
return 0;
}
2.UDP的客户端:
1. 创建socket
2. 收发数据
3. 关闭socket
代码如下:
int main()
{
int sockfd = -1;
//1. 创建socket
sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (sockfd < 0) {
perror("socket");
return -1;
}
struct sockaddr_in serv_addr;
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(9000);
serv_addr.sin_addr.s_addr = inet_addr("192.168.43.153");
socklen_t len = sizeof(struct sockaddr_in);
while(1) {
char buff[1024] = {0};
printf("you say:");
scanf("%s", buff);
sendto(sockfd, buff, strlen(buff), 0,
(struct sockaddr*)&serv_addr, len);
//recvfrom
char tmp[1024] = {0};
recvfrom(sockfd, tmp, 1023, 0,
(struct sockaddr*)&serv_addr, &len);
printf("serv say: %s\n", tmp);
}
close(sockfd);
return 0;
}
TCP服务端:
1.创建socket socket()
2.绑定地址信息 (sip+sport) bind()
3.开始监听socket listen 告诉操作系统,开始接受连接请求,并且处理
4.接收连接请求,获取新连接的socket
5.收发数据- recv/send
6.关闭socket close()
int main(int argc, char *argv[])
{
if (argc != 3) {
printf("Usage: ./tcp_server ip port\n");
return -1;
}
int listen_fd = -1;
listen_fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (listen_fd < 0) {
perror("socket");
return -1;
}
struct sockaddr_in lst_addr;
lst_addr.sin_family = AF_INET;
lst_addr.sin_port = htons(atoi(argv[2]));
lst_addr.sin_addr.s_addr = inet_addr(argv[1]);
socklen_t len = sizeof(struct sockaddr_in);
int ret = bind(listen_fd, (struct sockaddr*)&lst_addr, len);
if (ret < 0) {
perror("bind");
return -1;
}
if (listen(listen_fd, 5) < 0) {
perror("listen");
return -1;
}
while(1) {
struct sockaddr_in cli_addr;
len = sizeof(struct sockaddr_in);
int new_fd;
new_fd = accept(listen_fd, (struct sockaddr*)&cli_addr,
&len);
if (new_fd < 0) {
perror("accept");
continue;
}
while(1) {
char buff[1024] = {0};
ret = recv(new_fd, buff, 1023, 0);
if (ret == 0) {
printf("client shutdown!!\n");
break;
}else if (ret < 0) {
//可以被原谅的错误叫被信号打断或数据没有准备好
if (errno == EINTR || errno == EAGAIN) {
continue;
}
break;
}
printf("client say:%s\n", buff);
char tmp[1024] = {0};
printf("input:");
fflush(stdout);
scanf("%s", tmp);
send(new_fd, tmp, strlen(tmp), 0);
}
close(new_fd);
}
close(listen_fd);
return 0;
}
TCP客户端:
1. 创建socket socket()
2. 为socket绑定地址---客户端不推荐手动绑定 bind()
3. 向服务器端发起连接请求 connect()
4. 收发数据 recv/send
5. 关闭socket close
代码如下:
int main(int argc, char *argv[])
{
if (argc != 3) {
printf("Usage: ./tcp_client ip port");
return -1;
}
//创建套接字
int sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sockfd < 0) {
perror("socket");
return -1;
}
struct sockaddr_in serv_addr;
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(atoi(argv[2]));
serv_addr.sin_addr.s_addr = inet_addr(argv[1]);
socklen_t len = sizeof(struct sockaddr_in);
//向服务器发起连接
int ret = connect(sockfd, (struct sockaddr*)&serv_addr, len);
if (ret < 0) {
printf("connect");
return -1;
}
while(1) {
char buff[1024] = {0};
printf("input:");
fflush(stdout);
scanf("%s", buff);
//通过socket发送数据
send(sockfd, buff, strlen(buff), 0);
//接收数据
char tmp[1024] = {0};
ret = recv(sockfd, tmp, 1024, 0);
if (ret == 0) {
printf("peer shutdown !!\n");
close(sockfd);
return -1;
}
printf("server say:%s\n", tmp);
}
close(sockfd);
return 0;
}