网络编程
网络编程是指通过计算机网络实现数据传输和通信的编程方式。
它涉及多个层次和协议,包括TCP/IP、HTTP、FTP、SMTP等。开发人员需要理解这些协议的工作原理和规范,以便正确地构建网络应用程序。
TCP与UDP协议
TCP(传输控制协议)是一种可靠的传输协议,用于在计算机网络上建立可靠的连接。它通过三次握手建立连接,通过四次挥手终止连接。TCP协议适用于需要高可靠性的数据传输场景,如文件传输和账号登录。
UDP(用户数据报协议)是一种不可靠的无连接协议。它不需要建立连接,数据传输效率高,但不能保证数据的可靠性。UDP协议适用于传输少量数据的场景,如视频流和在线游戏。
TCP套接字编程
TCP套接字编程的流程包括创建套接字、绑定地址、监听连接、接受连接、发送和接收数据以及关闭连接。以下是一个简单的TCP服务器和客户端的示例代码:
TCP服务器
`
include <stdio.h>
include <sys/types.h>
include <sys/socket.h>
include <string.h>
include <unistd.h>
include <stdlib.h>
include <arpa/inet.h>
include <netinet/in.h>
int main(int argc, char *argv[]) {
if (argc != 3) {
printf("Usage: %s
return -1;
}
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd == -1) {
perror("socket failed!!");
return -1;
}
struct sockaddr_in Serv;
Serv.sin_family = AF_INET;
Serv.sin_port = htons(atoi(argv[2]));
Serv.sin_addr.s_addr = inet_addr(argv[1]);
int ret = bind(sockfd, (struct sockaddr *)&Serv, sizeof(Serv));
if (ret == -1) {
perror("bind failed!!");
close(sockfd);
return -1;
}
ret = listen(sockfd, 10);
if (ret == -1) {
perror("listen failed!!");
close(sockfd);
return -1;
}
while (1) {
struct sockaddr_in clie;
socklen_t len = sizeof(clie);
int confd = accept(sockfd, (struct sockaddr *)&clie, &len);
if (confd == -1) {
perror("confd failed!!");
continue;
}
printf("connect [%s][port:%d] success!!!!!\n", inet_ntoa(clie.sin_addr), ntohs(clie.sin_port));
pid_t pid = fork();
if (pid > 0) {
close(confd);
} else if (pid == 0) {
while (1) {
char recv_buf[1024] = {0};
int ret = recv(confd, recv_buf, 1023, 0);
if (ret > 0) {
printf("recv data[%s]: %s\n", inet_ntoa(clie.sin_addr), recv_buf);
if (strncmp(recv_buf, "byebye", 6) == 0) {
printf("connect [%s][port:%d] success exit!!\n", inet_ntoa(clie.sin_addr), ntohs(clie.sin_port));
close(confd);
exit(0);
}
char *buf = "OK!!\n";
send(confd, buf, strlen(buf), 0);
}
}
} else {
close(confd);
perror("fork failed");
continue;
}
}
}`
TCP客户端
`
include <stdio.h>
include <sys/types.h>
include <sys/socket.h>
include <string.h>
include <unistd.h>
include <stdlib.h>
include <arpa/inet.h>
include <netinet/in.h>
int main(int argc, char *argv[]) {
if (argc != 3) {
printf("Usage: %s
return -1;
}
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd == -1) {
perror("socket failed!!");
return -1;
}
struct sockaddr_in Serv;
Serv.sin_family = AF_INET;
Serv.sin_port = htons(atoi(argv[2]));
Serv.sin_addr.s_addr = inet_addr(argv[1]);
int ret = connect(sockfd, (struct sockaddr *)&Serv, sizeof(Serv));
if (ret == -1) {
perror("connect failed!!");
return -1;
}
while (1) {
char send_buf[1024] = {0};
fgets(send_buf, 1023, stdin);
send(sockfd, send_buf, strlen(send_buf) - 1, 0);
if (strncmp(send_buf, "byebye", 6) == 0) {
break;
}
char buf[1024] = {0};
recv(sockfd, buf, 1023, 0);
printf("recv data[%s]: %s\n", argv[1], buf);
}
shutdown(sockfd, SHUT_RDWR);
return 0;
}`

浙公网安备 33010602011771号