复习socket tcp/udp通信
TCP
服务器端:新建socket, 绑定, 监听, 等待接收,发送,关闭。
客户端:新建套接字,绑定,连接,发送/接收, 关闭。
服务器端代码:
#define N 64 int main(int argc, char *argv[]) { int listenfd, connectfd; struct sockaddr_in serveraddr, clientaddr; socklen_t clientlen = sizeof(clientaddr); char buf[N] = ""; if (argc < 3) { printf("Usage : %s <serverip> <serverport> ", argv[0]); exit(-1); } if ((listenfd = socket(PF_INET, SOCK_STREAM, 0)) < 0) { perror("fail to socket"); exit(-1); } bzero(&serveraddr, sizeof(serveraddr)); serveraddr.sin_family = PF_INET; serveraddr.sin_port = htons(atoi(argv[2])); serveraddr.sin_addr.s_addr = inet_addr(argv[1]); if (bind(listenfd, (struct sockaddr *)&serveraddr, sizeof(serveraddr)) < 0) { perror("fail to bind"); exit(-1); } if (listen(listenfd, 8) < 0) { perror("fail to listen"); exit(-1); } while (1) { if ((connectfd = accept(listenfd, (struct sockaddr *)&clientaddr, &clientlen)) < 0) { perror("fail to accept"); exit(-1); } printf("connection from [%s:%d] ", inet_ntoa(clientaddr.sin_addr), ntohs(clientaddr.sin_port)); recv(connectfd, buf, N, 0); send(connectfd, buf, N, 0); close(connectfd); } }
客户端代码
#define N 64 int main(int argc, char *argv[]) { int sockfd; struct sockaddr_in serveraddr; char buf_send[N] = "hello world"; char buf_recv[N] = " "; if (argc < 3) { printf("Usage : %s <serverip> <serverport> ", argv[0]); exit(-1); } if ((sockfd = socket(PF_INET, SOCK_STREAM, 0)) < 0) { perror("fail to socket"); exit(-1); } bzero(&serveraddr, sizeof(serveraddr)); serveraddr.sin_family = PF_INET; serveraddr.sin_port = htons(atoi(argv[2])); serveraddr.sin_addr.s_addr = inet_addr(argv[1]); if (connect(sockfd, (struct sockaddr *)&serveraddr, sizeof(serveraddr)) < 0) { perror("fail to connect"); exit(-1); } send(sockfd, buf_send, N, 0); recv(sockfd, buf_recv, N, 0); printf("receive from server : %s ", buf_recv); close(sockfd); return 0; }
UDP
服务器端:socket, bind, recvfrom, sendto。
客户端:socket, bind, sendto, recvfrom。
服务器端代码:
#define N 64 int main(int argc, char *argv[]) { int sockfd; struct sockaddr_in serveraddr, clientaddr; socklen_t clientlen = sizeof(clientaddr); char buf[N]; if (argc < 3) { printf("Usage : %s <serverip> <serverport> ", argv[0]); exit(-1); } if ((sockfd = socket(PF_INET, SOCK_DGRAM, 0)) < 0) { perror("fail to socket"); exit(-1); } bzero(&serveraddr, sizeof(serveraddr)); serveraddr.sin_family = PF_INET; serveraddr.sin_port = htons(atoi(argv[2])); serveraddr.sin_addr.s_addr = inet_addr(argv[1]); return 0; }
客户端代码
#define N 64 typedef struct sockaddr SA; int main(int argc, char *argv[]) { int sockfd; struct sockaddr_in servaddr; char buf[N] = "Hello Server"; if (argc < 3) { printf("Usage : %s <ip> <port> ", argv[0]); exit(-1); } // XXX int socket(int domain, int type, int protocol); if ((sockfd = socket(PF_INET, SOCK_DGRAM, 0)) < 0) { perror("fail to socket"); exit(-1); } // XXX int bind(int sockfd, const struct sockaddr *addr, // socklen_t addrlen); bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = PF_INET; servaddr.sin_port = htons(atoi(argv[2])); servaddr.sin_addr.s_addr = inet_addr(argv[1]); while ( 1 ) { printf("client > "); fgets(buf, N, stdin); if (strncmp(buf, "quit", 4) == 0) break; sendto(sockfd, buf, N, 0, (SA *)&servaddr, sizeof(servaddr)); bzero(buf, N); recvfrom(sockfd, buf, N, 0, NULL, NULL); printf("recv from server : %s ", buf); } return 0; }