TCP:
服务端基本流程:
socket --> bind --> listen --> accept --> send/recv --> close
void server_tcp() { //服务端
int n;
char buf[20];
sockaddr_in addr;
socklen_t len(sizeof(addr));
addr.sin_family = AF_INET;
// inet_pton(AF_INET, "127.0.0.1", &addr.sin_addr.s_addr);
addr.sin_addr.s_addr = htonl(INADDR_ANY);
addr.sin_port = htons(6666);
memset(&addr.sin_zero[0], 0, 8);
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
print("sockfd:", sockfd);
int client_fd;
char client_ip[20];
if (bind(sockfd, (struct sockaddr *) &addr, len) == -1) {
print("bind error");
goto errloop;
}
if (listen(sockfd, 5) == -1) {
print("listen error");
goto errloop;
}
if ((client_fd = accept(sockfd, (struct sockaddr *) &addr, &len)) == -1) {
print("listen error");
goto errloop;
}
inet_ntop(AF_INET, &addr.sin_addr, client_ip, 20);
print("client_fd:", client_fd);
print("client_ip:", client_ip);
int sendbytes;
while (n = read(STDIN_FILENO, buf, 10)) {
if ((sendbytes = send(client_fd, buf, n, 0)) == -1) {
print("send error");
}
if(buf[0] == 'q'){
break;
}
}
errloop:
close(sockfd);
}
客户端:
socket --> connect --> send/recv --> close
void client_tcp(){
int n, bufsize(1024);
char buf[bufsize];
sockaddr_in addr;
socklen_t len(sizeof(addr));
addr.sin_family = AF_INET;
inet_pton(AF_INET, "192.168.191.3", &addr.sin_addr.s_addr);
addr.sin_port = htons(6666);
memset(&addr.sin_zero[0], 0, 8);
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
print("sonsockfd:", sockfd);
fflush(stdout);
if(connect(sockfd, (struct sockaddr *)&addr, len) == -1){
print("connect error");
return;
}
print("Link ok");
fflush(stdout);
while(n = recv(sockfd, buf, bufsize, 0)){
buf[n] = 0;
if(buf[0] == 'q') break;
print(buf);
fflush(stdout);
}
close(sockfd);
}
UDP:
服务端:
socket --> bind(有无影响不大) --> sendto/recvfrom
void server_udp(){
int socketfd;
sockaddr_in addr = {0};
sockaddr sockp;
socketfd = socket(AF_INET, SOCK_DGRAM, 0);
int n;
char buf[10];
sockaddr_in client_addr = {0};
client_addr.sin_family = AF_INET;
// inet_pton(AF_INET, "127.0.0.1", &client_addr.sin_addr.s_addr);
client_addr.sin_addr.s_addr = INADDR_ANY;
client_addr.sin_port = htons(6667);
socklen_t len = sizeof(client_addr);
while (n = read(STDIN_FILENO, buf, 10)) {
if (sendto(socketfd, buf, n, 0, (sockaddr *)&client_addr, len) == -1) { //client_addr中有目标地址,不需要bind
print("send error");
}else{
print("send ok");
}
if(buf[0] == 'q'){
break;
}
}
close(socketfd);
}
客户端:
socket --> bind --> sendto/recvfrom
void client_udp(){
int n, bufsize(1024);
char buf[bufsize];
sockaddr_in ser_addr = {0};
socklen_t len(sizeof(ser_addr));
ser_addr.sin_family = AF_INET;
// inet_pton(AF_INET, "127.0.0.1", &ser_addr.sin_addr.s_addr);
ser_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
ser_addr.sin_port = htons(6667);
// memset(&addr.sin_zero[0], 0, 8);
int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
bind(sockfd, (sockaddr *)&ser_addr, len); //要确定从哪接收或发送数据
print("sonsockfd:", sockfd);
fflush(stdout);
while(n = recvfrom(sockfd, buf, 10, 0, (sockaddr *)&ser_addr, &len)){
buf[n] = 0;
if(buf[0] == 'q') break;
print(buf);
fflush(stdout);
}
close(sockfd);
}