本文共 3826 字,大约阅读时间需要 12 分钟。
大致看一下套接字的使用方法
相关函数:socket bind listen accept connect#includeint socket(int domain,int type,int protocol); 成功返回文件描述符,失败返回-1
#includeint bind(int sockfd,struct sockaddr *myaddr,socklen_taddrlen); 成功返回0,失败返回-1
#includeint listen(int sockfd,int backlog); 成功返回0,失败返回-1
#includeint accept(int sockfd,struct sockaddr *addr,socklen_t *addrlen);
#includeint connect(int sockfd,struct sockaddr* aerv_addr,socklen_t addrlen);成功返回0,失败返回-1
网络编程:编写程序是两台联网的结算及相互交换数据
套接字(socket):网络数据传输用的软件设备#includeint socket(int domain,int type,int protocol); 成功返回文件描述符,失败返回-1
#includeint bind(int sockfd,struct sockaddr *myaddr,socklen_taddrlen); 成功返回0,失败返回-1
调用bind函数给套接字分配地址后,基本完成了接电话的准备工作,下面来连接电话线并等待来电
#includeint listen(int sockfd,int backlog); 成功返回0,失败返回-1
4. 调用accept函数(拿起话筒):意味着接受了对方的连接请求,套接字同样如此,如果有人为了完成数据传输而请求连接,就需要调用以下的函数进行受理
#includeint accept(int sockfd,struct sockaddr *addr,socklen_t *addrlen);
上面的是服务器端创建的 服务器端套接字(监听/listening套接字)
接下来是用于请求连接的客户端套接字 connect() 函数打电话(请求连接)函数,它调用的是客户端套接字
#includeint connect(int sockfd,struct sockaddr* aerv_addr,socklen_t addrlen);成功返回0,失败返回-1
客户端程序只有"调用socket函数创建套接字"和"调用connect函数向服务器发送连接请求" 这两个步骤
1. 服务器端:hello_server.c
#include#include #include #include #include #include void error_handling(char *message);int main(int argc, char *argv[]){ int serv_sock; int clnt_sock; struct sockaddr_in serv_addr; struct sockaddr_in clnt_addr; socklen_t clnt_addr_size; char message[] = "Hello world"; if(argc != 2){ printf("Usage: %s \n", argv[0]); exit(1); } serv_sock = socket(PF_INET, SOCK_STREAM, 0); if(serv_sock == -1){ error_handling("socket() error"); } memset(&serv_addr, 0, sizeof(serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); serv_addr.sin_port = htons(atoi(argv[1])); if(bind(serv_sock,(struct sockaddr*)&serv_addr, sizeof(serv_addr)) == -1){ error_handling("bind() error"); } if(listen(serv_sock, 5) == -1){ error_handling("listen() error"); } clnt_addr_size = sizeof(clnt_addr); clnt_sock = accept(serv_sock, (struct sockaddr*)&clnt_addr, &clnt_addr_size); if(clnt_sock == -1){ error_handling("accept() error"); } write(clnt_sock, message, sizeof(message)); close(clnt_sock); close(serv_sock); return 0;}void error_handling(char* message){ fputs(message,stderr); fputc('\n',stderr); exit(1);}
2. 客户端程序 hello_client.c
#include#include #include #include #include #include void error_handling(char *message);int main(int argc, char *argv[]){ int sock; struct sockaddr_in serv_addr; char message[] = "Hello world"; int str_len; if(argc != 3){ printf("Usage: %s \n", argv[0]); exit(1); } sock = socket(PF_INET, SOCK_STREAM, 0); if(sock == -1){ error_handling("socket() error"); } memset(&serv_addr, 0, sizeof(serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = inet_addr(argv[1]); serv_addr.sin_port = htons(atoi(argv[2])); if(connect(sock,(struct sockaddr*)&serv_addr, sizeof(serv_addr)) == -1){ error_handling("bind() error"); } str_len = read(sock,message,sizeof(message) - 1); if(str_len == -1){ error_handling("read() error!"); } printf("message from server : %s\n",message ); close(sock); return 0;}void error_handling(char* message){ fputs(message,stderr); fputc('\n',stderr); exit(1);}
调用结果展示:
转载地址:http://ljzwi.baihongyu.com/