网络编程
server
网络编程头文件
/* /* int socket(int domain, int type, int protocol) 需要的头文件 eg: int sockfd = socket(AF_INET, SOCK_STREAM, 0); ↓ ↓ ↓ ipv4协议 流式套接字 具体类型协议*/#include <sys/types.h> #include <sys/socket.h>/* inet_aton, inet_addr, inet_network, inet_ntoa, inet_makeaddr, inet_lnaof, inet_netof接口需要的头文件*/#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <unistd.h>
server网络编程流程
- 创建socket
- 绑定信息(bind)
- 设置监听队列(listen)
- 接受连接(建立TCP连接)(accpet)
- 创建socket
//创建socketint sockfd = socket(AF_INET, SOCK_STREAM, 0); //(ipv4协议,流式套接字,具体的协议类型)if(-1 == sockfd){ perror("socket"); exit(1);}/* setsockopt设置SO_REUSEADDR。 socket关闭之后并不会立即收回,而是要经历一个TIME_WAIT的阶段。windows下最多可以达到4分钟。 所以在这个时候对这个端口进行重新绑定就会出错。所以需要先设置 SO_REUSEADDR. 或者在closesocket的时候,使用setsockopt设置SO_DONTLINGER。也不会有TIME_WAIT的阶段. 通常使用这个设置来加强网络程序的健壮性。*/int opt = 1;setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)); //地址可以被重复绑定struct sockaddr_in server_addr; //保存服务器的消息memset(&server,0,sizeof(server_addr));server_addr.sin_family = AF_INET; //协议族server_addr.sin_port = 8000; //端口server_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); //地址 INADDR_ANY->所有地址
- 绑定信息
int ret = bind(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr));if(-1 == ret){ perror("bind"); exit(1);}
- 设置监听队列
ret = listen(sockfd, 10);if(-1 == ret){ perror("listen"); exit(1);}
- 接受连接(建立TCP连接)
printf("等待客户端连接");struct sockaddr_in client_addr; //用于保存客户端消息int length = sizeof(client_addr);int fd = accept(sockfd, (struct sockaddr *)&client_addr, &length);if(-1 == fd){ perror("accpet"); exit(1);}
- 读取消息
char buf[32] = 0;while(1){ ret = recv(fd, buf, sizeof(buf), 0); if(-1 == fd){ perror("recv"); exit(1); } printf("客户端接受的消息为:"); printf("%s",buf); memset(buf, 0, sizeof(buf));}
- 关闭
close(fd);close(sockfd);
client
头文件
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h> client网络编程流程
- 创建socket
- 连接(connect)
- 读取消息
- 创建socket
int sockfd = socket(AF_INET, SOCK_STREAM, 0); if(-1 == sockfd){ perror("socket"); exit(1); } struct sockaddr_in server_addr; memset(&server_addr, 0, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_port = 8000; server_addr.sin_addr.s_addr = inet_addr("172.25.0.154");}
- 向服务器发起连接
//向服务器发起连接 int ret = connect(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)); if(-1 == ret){ perror("connect"); exit(1); }
- 读取消息
char buf[32] = {0}; while(1){ printf("请输入你想要发送的信息:"); scanf("%s",buf); ret = send(sockfd, buf, strlen(buf), 0); if(-1 == ret){ perror("send"); exit(1); } if(!strcmp(buf,"bye")){ break; } memset(buf, 0, sizeof(buf)); } 网络编程
server
网络编程头文件
/* int socket(int domain, int type, int protocol) 需要的头文件 eg: int sockfd = socket(AF_INET, SOCK_STREAM, 0); ↓ ↓ ↓ ipv4协议 流式套接字 具体类型协议*/#include <sys/types.h> #include <sys/socket.h>/* inet_aton, inet_addr, inet_network, inet_ntoa, inet_makeaddr, inet_lnaof, inet_netof接口需要的头文件*/#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <unistd.h server网络编程流程
- 创建socket
- 绑定信息(bind)
- 设置监听队列(listen)
- 接受连接(建立TCP连接)(accpet)
- 创建socket
//创建socket int sockfd = socket(AF_INET, SOCK_STREAM, 0); //(ipv4协议,流式套接字,具体的协议类型) if(-1 == sockfd){ perror("socket"); exit(1); } /* setsockopt设置SO_REUSEADDR。 socket关闭之后并不会立即收回,而是要经历一个TIME_WAIT的阶段。windows下最多可以达到4分钟。 所以在这个时候对这个端口进行重新绑定就会出错。所以需要先设置 SO_REUSEADDR. 或者在closesocket的时候,使用setsockopt设置SO_DONTLINGER。也不会有TIME_WAIT的阶段. 通常使用这个设置来加强网络程序的健壮性。 */ int opt = 1; setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)); //地址可以被重复绑定 struct sockaddr_in server_addr; //保存服务器的消息 memset(&server,0,sizeof(server_addr)); server_addr.sin_family = AF_INET; //协议族 server_addr.sin_port = 8000; //端口 server_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); //地址 INADDR_ANY->所有地址
int ret = bind(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)); if(-1 == ret){ perror("bind"); exit(1); }
ret = listen(sockfd, 10); if(-1 == ret){ perror("listen"); exit(1); }
printf("等待客户端连接"); struct sockaddr_in client_addr; //用于保存客户端消息 int length = sizeof(client_addr); int fd = accept(sockfd, (struct sockaddr *)&client_addr, &length); if(-1 == fd){ perror("accpet"); exit(1); }
char buf[32] = 0;while(1){ ret = recv(fd, buf, sizeof(buf), 0); if(-1 == fd){ perror("recv"); exit(1); } printf("客户端接受的消息为:"); printf("%s",buf); memset(buf, 0, sizeof(buf));}
close(fd);close(sockfd); client
头文件
#include <sys/types.h> /* See NOTES */#include <sys/socket.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h client网络编程流程
- 创建socket
- 连接(connect)
- 读取消息
- 创建socket
int sockfd = socket(AF_INET, SOCK_STREAM, 0); if(-1 == sockfd){ perror("socket"); exit(1); } struct sockaddr_in server_addr; memset(&server_addr, 0, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_port = 8000; server_addr.sin_addr.s_addr = inet_addr("172.25.0.154"); }
//向服务器发起连接 int ret = connect(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)); if(-1 == ret){ perror("connect"); exit(1); }
char buf[32] = {0}; while(1){ printf("请输入你想要发送的信息:"); scanf("%s",buf); ret = send(sockfd, buf, strlen(buf), 0); if(-1 == ret){ perror("send"); exit(1); } if(!strcmp(buf,"bye")){ break; } memset(buf, 0, sizeof(buf)); } ```
|